我对sklearn
(以及Python整体)非常陌生,但需要处理一个涉及超过10k个样本的聚类的项目。使用以下代码,在少于100个样本的测试数据集上,k值设为4时,聚类按预期进行。然而,当我开始使用超过100个样本时,6/8个中心点似乎在原点(0,0)重复,即无法生成聚类。有什么建议可以告诉我可能出了什么问题吗?
代码:
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帧处的颜色变化是由于我定义的色图方式所致,因此这不是问题的一部分。
回答:
你有沒有先檢查你的數據中是否真的有你要找的那麼多聚類?簡單地增加樣本數量並不一定意味著聚類數量也會增加。如果你輸入給算法的聚類數量大於數據集中實際的聚類數量,那麼算法可能無法正常收斂,或者聚類可能會完全重疊在一起。
為了找到你的數據集的最佳聚類數量,我們使用了一種被稱為肘部方法的技術。這種方法有不同的變體,但主要思想是對於不同的K值(聚類數量),你找到最適合你應用的成本函數(例如,所有聚類中所有點到其中心點的平方距離之和,對於K的所有值,比如從1到8,或者其他任何錯誤/成本/方差函數)。根據你選擇的函數,你會發現,在某一點之後,值的差異將變得微不足道。想法是選擇’K’的值,在這個值上,所選成本函數的值發生了突然的變化。
對於K=4的值,方差發生了突然的變化。因此,K=4被選為一個合適的值。
圖片來源:維基百科
還有許多其他關於聚類驗證的方法。R語言中存在許多專門用於此目的的包。
要了解更多,請參考以下鏈接: