Я пытаюсь реализовать поиск по сетке (на Python, если это имеет значение) по сфере в R^n
, где n
неизвестно.
Входные данные включают радиус и центр сферы, а также гиперпараметр 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()
Выходная цифра:
Еще один вариант — генерировать равномерно распределенные выборки на сфере. Обратите внимание, что количество выборок определяет «плотность» (или ожидаемую плотность) точек:
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
(хотя и это можно взломать)