超过100个样本时,Python K-means无法适应数据

Tec*_*ana 4 python machine-learning k-means scikit-learn

我是新手sklearn(和python一般)但需要处理一些涉及超过10k样本聚类的项目.使用以下代码,测试数据集少于100个样本且k = 4,聚类按预期进行.但是,当我开始使用超过100个样本时,6/8质心似乎在原点(0,0)处重复,即它无法生成群集.对于可能出错的事情的任何建议?

屏幕截图: 86个样本, 150个样本

码:

    data = pd.read_csv('parsed.txt', sep="\t", header=None)
    data.columns = ["x", "y"]

    kmeans = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1000,
        n_clusters=k, n_init=10, n_jobs=1, precompute_distances='auto',
        random_state=None, tol=0.0001, verbose=0)
    kmeans.fit(data)

    labels = kmeans.predict(data)
    centroids = kmeans.cluster_centers_

    fig = plot.figure(figsize=(5, 5))
    colmap = {(x+1): [(np.sin(0.3*x + 0)*127+128)/255,(np.sin(0.3*x + 2)*127+128)/255,(np.sin(0.3*x + 4)*127+128)/255] for x in range(k)} # making rainbow colormap
    colors = map(lambda x: colmap[x+1], labels) #color for each label

    plot.scatter(data['x'], data['y'], color=colors, alpha=0.5, edgecolor='k')
    for idx, centroid in enumerate(centroids):
        plot.scatter(*centroid, color=colmap[idx+1])
    plot.xlim(0, 4000)
    plot.ylim(0, 10000)
    plot.show()
Run Code Online (Sandbox Code Playgroud)

@ 150个样本,我打印了下面显示的标签(几乎所有2个)和质心坐标(最多来自原点):

[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2]
[[  7.51619277e+09   7.51619277e+09]
 [  1.00000000e+27   1.00000000e+27]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00]]
Run Code Online (Sandbox Code Playgroud)

更多细节(08/20/17)

以下是GIF,分别显示了86和150个样本的k = 1到10的簇.如图所示,86套装效果不错,但不适用于只出现在原点的150套装.请注意,设置为k = 4帧的150中的颜色变化是由于我定义的色彩映射的结果,因此不是问题的一部分.

86样品, 150个样品

Moh*_*hif 5

如果您尝试查找的数据中确实有这么多群集,您是否先尝试检出?简单地增加样本数量并不一定意味着群集的数量也会增加.如果不.您作为算法输入提供的群集大于实际数量.对于数据集中的聚类,则算法可能无法正确收敛,或者聚类可能简单地(完全)相互重叠.

找到最优的没有.对于您的数据集的集群,我们使用一种称为elbow方法的技术.这种方法有不同的变化,但主要思想是对于不同的K值(簇的数量),你会找到最适合你应用的成本函数(例如,a中所有点的平方距离之和).如果K的所有值为1到8,或者任何其他误差/成本/方差函数,则集群到它的质心.根据您选择的函数,您将看到在某个点之后,值的差异可以忽略不计.我们的想法是,我们选择了'K'的值,所选择的成本函数的值突然变化.

肘法

对于值K = 4,方差突然变化.因此,选择K = 4作为适当的值.

图片来源:维基百科

集群验证还有其他几种方法.R中存在几个专门用于此目的的包.

要从以下链接了解更多信息: