我試圖在R^n
,其中n
未知的情況下實現網格搜索(在Python中,如果它很重要)。在R^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),θ= 1。作爲R,c和theta的函數,代表這個磁盤中的所有點是什麼意思? –
我添加了一個例子 – omerbp