R^n
がn
不明なの球体に対してグリッド検索を (問題がある場合は Python で) 実装しようとしています。
入力には、球の半径と中心、およびtheta
グリッドの解像度を制御するハイパーパラメータが含まれます。この球体の各点を、これら 3 つのパラメーターの関数として表現したいと思います。
また、立方体の面のみを反復して、立方体検索を検討することも考えています。(つまり、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()
出力図:
もう 1 つのオプションは 、球上に均一に分散されたサンプルを生成することです。サンプルの数がポイントの「密度」(または期待される密度) を制御することに注意してください。
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
多くの場合(これもハッキングされる可能性があります)