确定点对多个圆的隶属度概率

2024-05-15 21:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个平面上大约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

我本质上是在寻找一种方法,找出哪些点最有可能与给定的圆相关联。我还需要能够找到何时没有点可能与一个圆关联,并确定何时一个点可能与多个圆关联。理想情况下,这也能够解释在寻找关联可能性时不同圆具有不同半径的事实

我试过几种不同的方法:

  1. 高斯混合模型: 我认为这可能是一个完全错误的方向,因为它可以找到点簇,但根本不包含圆
    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')
  1. 高斯朴素贝叶斯: 所以这仅仅是一个开始,可能有很多错误。我假设每个圆周围都是高斯分布,但我认为我做错了什么,因为大多数点成为圆成员的概率在1e-100左右,即使它们非常接近。另外,我没有一个很好的方法来估计圆上的误差,所以我只假设了10%的误差,这也可能是有问题的
    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)

我也尝试了一些其他的方法来弥补类似的失败。如果您有任何想法或建议,我们将不胜感激。谢谢大家!


Tags: 方法npaxarraylocpointsmeanspoint
1条回答
网友
1楼 · 发布于 2024-05-15 21:15:16

你对这个问题的描述很模糊。这些点和圆是如何定义的

如果你有简单的定义,这不是一个简单的问题,决定一个点属于哪个圆,或者计算点到圆的中心的距离和圆的半径之间的比率吗

如果radius(c1) / distance_to_centre(p1, c1) > 1,则点p1位于圆c1中。如果你为每个圆cx计算radius(cx) / distance_to_centre(p, cx),那么值最高的那一个就是你要找的圆

(注意:如果点落在圆的中心,请小心,如果不检查,将得到一个除以零的结果)

如果您提供一些示例数据,那么代码应该很简单

相关问题 更多 >