如何(在python中)绘制DBSCAN中给定的最小点的距离图?
我正在寻找膝盖和相应的epsilon值。
在雪板上,我没有看到任何返回如此距离的方法.我是不是遗漏了什么?
发布于 2018-05-29 02:02:53
您可能希望使用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()发布于 2019-04-11 08:56:26
首先,您可以定义一个函数来计算每个点到其第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然后,一旦您定义了您的函数,您可以选择一个k值并绘制直方图以找到一个膝盖来定义一个合适的epsilon值。
eps_dist = calculate_kn_distance(X[1],4)
plt.hist(eps_dist,bins=30)
plt.ylabel('n');
plt.xlabel('Epsilon distance');

在上面的例子中,绝大多数的点位于离第四近邻的0.12个单位之内。因此,一种启发式方法,可以选择0.12作为epsilon参数。
发布于 2018-03-21 12:16:05
要获得距离,可以使用以下函数:
import numpy as np
import pandas as pd
import math
def k_distances(X, n=None, dist_func=None):
"""Function to return array of k_distances.
X - DataFrame matrix with observations
n - number of neighbors that are included in returned distances (default number of attributes + 1)
dist_func - function to count distance between observations in X (default euclidean function)
"""
if type(X) is pd.DataFrame:
X = X.values
k=0
if n == None:
k=X.shape[1]+2
else:
k=n+1
if dist_func == None:
# euclidean distance square root of sum of squares of differences between attributes
dist_func = lambda x, y: math.sqrt(
np.sum(
np.power(x-y, np.repeat(2,x.size))
)
)
Distances = pd.DataFrame({
"i": [i//10 for i in range(0, len(X)*len(X))],
"j": [i%10 for i in range(0, len(X)*len(X))],
"d": [dist_func(x,y) for x in X for y in X]
})
return np.sort([g[1].iloc[k].d for g in iter(Distances.groupby(by="i"))])X应该是pandas.DataFrame或numpy.ndarray。n是d邻里的邻居数.你应该知道这个号码。默认情况下是属性数+ 1。
要绘制这些距离,可以使用以下代码:
import matplotlib.pyplot as plt
d = k_distances(X,n,dist_func)
plt.plot(d)
plt.ylabel("k-distances")
plt.grid(True)
plt.show()https://stackoverflow.com/questions/43160240
复制相似问题