Python K-means 在超过100个样本时无法拟合数据

我对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)} # 制作彩虹色图    colors = map(lambda x: colmap[x+1], labels) # 为每个标签指定颜色    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()

@ 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]]

更多细节(08/20/17)

这里有GIF显示了k值从1到10的聚类情况,分别对应86个和150个样本。如图所示,86个样本集表现良好,但150个样本集仅在原点出现。请注意,150个样本集在k=4帧处的颜色变化是由于我定义的色图方式所致,因此这不是问题的一部分。

86个样本, 150个样本


回答:

你有沒有先檢查你的數據中是否真的有你要找的那麼多聚類?簡單地增加樣本數量並不一定意味著聚類數量也會增加。如果你輸入給算法的聚類數量大於數據集中實際的聚類數量,那麼算法可能無法正常收斂,或者聚類可能會完全重疊在一起。

為了找到你的數據集的最佳聚類數量,我們使用了一種被稱為肘部方法的技術。這種方法有不同的變體,但主要思想是對於不同的K值(聚類數量),你找到最適合你應用的成本函數(例如,所有聚類中所有點到其中心點的平方距離之和,對於K的所有值,比如從1到8,或者其他任何錯誤/成本/方差函數)。根據你選擇的函數,你會發現,在某一點之後,值的差異將變得微不足道。想法是選擇’K’的值,在這個值上,所選成本函數的值發生了突然的變化。

肘部方法

對於K=4的值,方差發生了突然的變化。因此,K=4被選為一個合適的值。

圖片來源:維基百科

還有許多其他關於聚類驗證的方法。R語言中存在許多專門用於此目的的包。

要了解更多,請參考以下鏈接:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注