【发布时间】:2016-02-28 07:51:59
【问题描述】:
我正在尝试在 R^n 中的一个球体上实现网格搜索(在 Python 中,如果重要的话),其中 n 是未知的。
输入包括球体的半径和中心,以及控制网格分辨率的超参数theta。我想将这个球体中的每个点表示为这三个参数的函数。
我也愿意考虑立方体搜索,只迭代立方体的面。
(即迭代L_inf sphere)
如果我知道 n=2,我会做的是:
import numpy as np
def enumerate_2d_sphere(R,theta,center=(0,0)):
for n in xrange(int(2*np.pi / theta)+1):
degree = n*theta
point =(center[0]+R*np.cos(degree),center[1]+R*np.sin(degree))
yield point
for p in enumerate_2d_sphere(1,0.1):
print p
由于n 可以任意大,我正在寻找一种有效地迭代球体\立方体的方法。
有什么想法吗?
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++
我最终使用了 strubbly 建议的修改版本:
import itertools
import numpy as np
import matplotlib.pyplot as plt
def f(d, center, scale=1):
dim = len(center)
print d/-2.0
diff = scale * np.array([d/-2.0 for _ in xrange(dim)])
bias = diff + center
for i in range(dim):
l = ([ xrange(1,d) for _ in xrange(i)] +
[[0,d]] +
[ xrange(d+1) for _ in xrange(dim-i-1)]
)
for r in itertools.product(*l):
yield scale*np.array(r)+bias
#example for R^2:
center = (1,1.5)
data = np.array([x for x in f(20,center,scale = 0.1)])
plt.scatter(data[:,0], data[:,1],color='r',s=100,alpha=0.5)
plt.scatter(center[0], center[1],color='b',s=300,alpha=0.5)
plt.show()
输出图:
还有一个选择,就是生成 uniformly distributed samples on the sphere。请注意,样本数控制点的“密度”(或预期密度):
import numpy as np
def generate_random_points(R,center,quantity=1000):
"""
:param R: float
:param center: np.array
:param quantity: int
"""
dim = len(center)
for n in xrange(quantity):
s = np.random.normal(0, 1,dim)
r = np.sqrt(np.dot(s,s))
s = (R/r) * s
yield s+center
最糟糕的方法(就简单性和效率而言)是使用enumeration of n-1 angles 在球体上生成点。效率低下是因为需要经常计算产品sin 和cos(尽管这也可能被黑客入侵)
【问题讨论】:
-
你能解释一下你想要什么吗?例如假设 R=10,n=2,c=(0, 0),theta=1。将这个圆盘中的所有点表示为 R、c 和 theta 的函数是什么意思?
标签: python grid-search hyperparameters