如何通过绘制 KNN 弯头来确定 DBSCAN 的最佳 epsilon 值(以米为单位)

How determine optimal epsilon value in meters for DBSCAN by plotting KNN elbow

在执行 DBSCAN 之前,我需要找到最佳的 epsilon 值,所有点都是地理坐标,我需要以米为单位的 epsilon 值,然后再将其转换为弧度以使用半正弦指标应用 DBSCAN

from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=4)
nbrs = neigh.fit(firms[['y', 'x']])
distances, indices = nbrs.kneighbors(firms[['y', 'x']])

然后

# Plotting K-distance Graph
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.figure(figsize=(20,10))
plt.plot(distances)
plt.title('K-distance Graph',fontsize=20)
plt.xlabel('Data Points sorted by distance',fontsize=14)
plt.ylabel('Epsilon',fontsize=14)
plt.show()

图形输出是这样的,但我需要以米为单位的 epsilon 值。

我希望这有助于澄清,只是一些观察:

a) 您已经找到最佳 epsilon 值,使用该方法并从您的图中 eps = 0.005。

b) 如果您的点是地理坐标,则在转换之前不需要以米为单位的 epsilon 值,然后仅转换为弧度,因此您可以使用半正弦度量应用 DBSCAN,因为您可以从地理坐标直接转换以弧度为单位,然后乘以 6371000/1000 得到以千米为单位的结果,如下所示:

from sklearn.metrics.pairwise import haversine_distances
from math import radians
bsas = [-34.83333, -58.5166646]
paris = [49.0083899664, 2.53844117956]
bsas_in_radians = [radians(_) for _ in bsas]
paris_in_radians = [radians(_) for _ in paris]
result = haversine_distances([bsas_in_radians, paris_in_radians])
result * 6371000/1000  # multiply by Earth radius to get kilometers

代码片段来自:

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.haversine_distances.html