我做了一些研究。我在非公制(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个群集,而无需考虑阈值等。