如何在python中绘制k距离图

Mau*_*ile 3 python cluster-analysis dbscan

如何在 DBSCAN 中绘制(在 python 中)给定最小点值的距离图???

我正在寻找膝盖和相应的 epsilon 值。

在 sklearn 中,我没有看到任何返回这种距离的方法......我错过了什么吗?

Har*_*boa 6

首先,您可以定义一个函数来计算每个点与其第 k 个最近邻点的距离:

def calculate_kn_distance(X,k):

    kn_distance = []
    for i in range(len(X)):
        eucl_dist = []
        for j in range(len(X)):
            eucl_dist.append(
                math.sqrt(
                    ((X[i,0] - X[j,0]) ** 2) +
                    ((X[i,1] - X[j,1]) ** 2)))

        eucl_dist.sort()
        kn_distance.append(eucl_dist[k])

    return kn_distance
Run Code Online (Sandbox Code Playgroud)

然后,一旦定义了函数,就可以选择k值并绘制直方图以找到拐点以定义合适的epsilon值。

eps_dist = calculate_kn_distance(X[1],4)
plt.hist(eps_dist,bins=30)
plt.ylabel('n');
plt.xlabel('Epsilon distance');
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在上面的示例中,绝大多数点位于距离第四个最近邻点 0.12 个单位以内。因此,启发式方法可以选择 0.12 作为epsilon参数。


rew*_*reu 5

您可能希望使用 numpy 提供的矩阵运算来加速距离矩阵计算。

def k_distances2(x, k):
    dim0 = x.shape[0]
    dim1 = x.shape[1]
    p=-2*x.dot(x.T)+np.sum(x**2, axis=1).T+ np.repeat(np.sum(x**2, axis=1),dim0,axis=0).reshape(dim0,dim0)
    p = np.sqrt(p)
    p.sort(axis=1)
    p=p[:,:k]
    pm= p.flatten()
    pm= np.sort(pm)
    return p, pm
m, m2= k_distances2(X, 2)
plt.plot(m2)
plt.ylabel("k-distances")
plt.grid(True)
plt.show()
Run Code Online (Sandbox Code Playgroud)