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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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