绘制(纬度,纬度)的二维 numpy 数组的直方图,以确定 DBSCAN 的正确值

Plotting a histogram of 2D numpyArray of (latitude, latitude), in order to determine the proper values for DBSCAN

我正在尝试将 DBSCAN 应用于 (Lan,Lat) 的数据集。该算法对参数非常敏感; EPS 和 MinPts。

我想查看数据的直方图,以确定正确的值。不幸的是,Matplotlib Hist() 仅采用 1D 数组

将二维矩阵作为参数传递,Hist() 将每一列视为单独的输入。

散点图和直方图:

有没有人有办法解决这个问题,

你可以使用 numpy.histogram2d:

import numpy as np
np.random.seed(2016)

N = 100
arr = np.random.random((N, 2))
xedges = np.linspace(0, 1, 10)
yedges = np.linspace(0, 1, 10)
lat = arr[:, 0]
lng = arr[:, 1]
hist, xedges, yedges = np.histogram2d(lat, lng, (xedges, yedges))
print(hist)

产量

[[ 0.  0.  5.  0.  3.  0.  0.  0.  3.]
 [ 0.  3.  0.  3.  0.  0.  4.  0.  2.]
 [ 2.  2.  1.  1.  1.  1.  3.  0.  1.]
 [ 2.  1.  0.  3.  1.  2.  1.  1.  3.]
 [ 3.  0.  3.  2.  0.  1.  0.  2.  0.]
 [ 3.  2.  3.  1.  1.  2.  1.  1.  0.]
 [ 2.  3.  0.  1.  0.  1.  3.  0.  0.]
 [ 1.  1.  1.  1.  2.  0.  2.  1.  1.]
 [ 0.  1.  1.  0.  1.  1.  2.  0.  0.]]

或者可视化直方图:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.imshow(hist)
plt.show()

如果您遵循 DBSCAN 文章,您只需要每个对象的 4-nearest-neighbor 距离,而不是所有成对距离。即,一维数组。

他们没有绘制直方图,而是对值进行排序,并尝试在此图中选择拐点

  1. 找到每个对象的4个最近邻
  2. 在一个数组中收集所有 4NN 距离
  3. 按降序排列此数组
  4. 绘制结果曲线
  5. 寻找膝盖,通常最好在 x 轴的 5%-10% 左右(因此 95%-90% 的对象是核心点)。

有关详细信息,请参阅原始 DBSCAN 出版物!