我有一个平面上大约10个圆的中心和半径的列表。我还有一个散布在平面周围的约100个点的列表。用眼睛看,有些点非常近,甚至在一个圆里面,而有些点离任何圆都非常远。有些圆圈也非常接近,很多点也存在于这个区域。
数据相当简单。
圆:
X Y Radius
0 -19.370525 -20.997882 22.486245
1 -33.666281 15.665494 8.487290
2 -24.816294 -47.834261 6.830408
点
X Y
0 -33.839499 -12.905389
1 -34.018966 17.154616
2 -34.019669 -22.445386
我基本上是在寻找一种方法来寻找哪些点最有可能与某个圆相关联。我还需要能够找到什么时候没有点可能与一个圆相关联,并识别什么时候一个点可能与多个圆相关联。理想的情况是,在寻找关联的可能性时,这也能够考虑到不同的圆有不同的半径这一事实。
我已经尝试了一些不同的东西。
from astroML.plotting.tools import draw_ellipse
point_array = np.array([circles['X'],circles['Y']).T
gmm = GaussianMixture(10).fit(point_array)
log_dens = gmm.score_samples(point_array)
gmm_x = gmm.means_[:,0]
gmm_y = gmm.means_[:,1]
gmm_weights = gmm.weights_
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(gmm_x,gmm_y,c='k')
ax.scatter(points['X'],points['Y'],c='r')
for mu, C, w in zip(gmm.means_,gmm.covariances_,gmm.weights_):
draw_ellipse(mu,C,ax=ax,fc='none',ec='k')
p_circ_point = []
for i in range(0,10):
p_member_loc = []
circ_x = circles['X'].values[i]
circ_y = circles['Y'].values[i]
circ_rad = circles['Radius'].values[i]
clus_err = 0.1 * circ_rad
for j in range(len():
point_x = points['X'][j]
clump_y = points['Y'][j]
delta_x = circ_x - point_x
delta_y = circ_y - circ_y
dist_clus_clump = np.sqrt(delta_x**2 + delta_y**2)
p_l_m = (1/(np.sqrt(2*np.pi)*clus_err)) * \
np.e**(-(dist_clus_clump**2)/(2*clus_err**2))
p_member_loc = np.append(p_member_loc,p_l_m)
p_circ_point = np.append(p_circ_point,p_member_loc)
我也尝试了一些其他的东西,类似的缺乏成功。 如果你有什么想法或建议,将非常感激。谢谢您!我有一份中心和中心的清单。
你对问题的描述很模糊。这些点和圆是如何定义的?
如果你有简单的定义,是不是简单地决定一个点属于哪个圆,或者计算点到圆心的距离和圆的半径之间的比值?
如果 radius(c1) / distance_to_centre(p1, c1) > 1
,点 p1
在圈内 c1
. 如果你计算 radius(cx) / distance_to_centre(p, cx)
对于每一个圆cx,哪一个有最高的值就会是你要找的圆。
(注意:如果点落在圆心上,要小心,如果你不检查它,你会得到一个除以零的结果)
如果你提供一些样本数据,代码应该是直接的。