R^n
我正在尝试在n
未知的球体上实现网格搜索(在 Python 中,如果重要的话) 。
输入包括球体的半径和中心,以及theta
控制网格分辨率的超参数。我想将这个球体中的每个点表示为这三个参数的函数。
我也愿意考虑立方体搜索,只迭代立方体的面。(即,迭代L_inf
球体)
如果我知道 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
可以任意大,我正在寻找一种有效地迭代球体\立方体的方法。
有任何想法吗?
++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++
我最终使用了一个修改后的版本:
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()
输出图:
另一种选择是在 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
最糟糕的方法(就简单性和效率而言)是使用n-1 角度的枚举在球体上生成点。效率低下是因为需要计算产品sin
并且cos
经常(尽管这也可能被黑客入侵)