桦木算法未按预期聚类


10

我正在使用scipy-learn Python程序包中的Birch算法,将一组点集中在一个10个一组的小城市中。

我使用以下代码:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

以我的想法,我总是会得到10分。在我的情况下,我有650个要聚类的点,而n_clusters是65个。

但是,我的问题是,如果阈值太低,我最终只能为一个群集分配1个地址,而阈值则稍大一些-每个群集40个地址。

我在这里做错了什么?


也许是CRS。问题?如果尝试使用度数(例如WGS 84),请尝试使用公制。坐标差异很大,并且两者都可能需要不同的阈值。您也可以尝试使用其他python库,我强烈建议您使用scikit-learn。
dmh126 '16

..erm,我正在根据从Google API接收到的GPS坐标进行聚类,我假设它们是标准格式的。没有?
kaboom

也许在这里粘贴这些坐标,我会设法弄清楚。
dmh126 '16

dmh126可能是正确的:Goolge的API正在与WGS84,这是(世界)大地测量系统,而不是一个指标
安德烈·

Answers:


10

我做了一些研究。我在非公制(WGS84)和公制(波兰1992)的两个坐标系中提出了一些观点。

我使用以下代码:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

然后,我用度量数据拟合我们的模型:

brc.fit(data90)

并绘制结果,其中十字架是我的观点,圆圈是我的子类别:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

这是我得到的: 在此处输入图片说明

您可以看到,该阈值太小,因为它在每个点上都找到了子簇。

阈值的定义:

通过合并新样本和最接近的子集群而获得的子集群的半径应小于阈值。否则,将启动一个新的子集群。

因此,在这种情况下,我们需要增加此值。

对于:

brc = Birch(threshold=5000)

好多了:

在此处输入图片说明

WGS84的阈值为0.5:

brc = Birch(threshold=0.5)
brc.fit(data84)

在此处输入图片说明

仅一个子集群,不好。但是在这种情况下,我们应该降低阈值,因此对于0.05:

brc = Birch(threshold=0.05)
brc.fit(data84)

在此处输入图片说明

我们取得了不错的结果。

结论:

CRS很重要。您需要找到一个合适的阈值,具体取决于您的数据坐标系和点之间的距离。如果您具有非公制CRS,则阈值应相对小于公制系统。您必须知道米和度之间的差异,如果两点之间的距离等于10000m,则在WGS84中它将小于1度。检查谷歌到更准确的值。

还有比n_clusters值更多的点。可以,没有簇的质心,但是有子簇。如果您尝试预测某事或打印标签,它将把您的点分类到n_clusters区域之一(或将打印点分类为0,1,2,...,n_clusters标签)。

如果您不想尝试其他参数,则可以随时采用其他算法。K-means算法是非常简单且通用的聚类算法。

http://scikit-learn.org/stable/modules/generation/sklearn.cluster.KMeans.html

它应该为您的数据找到n个群集,而无需考虑阈值等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.