kmeans中的k的含义_聚类的Python实现(二):确定分群数K
生活随笔
收集整理的這篇文章主要介紹了
kmeans中的k的含义_聚类的Python实现(二):确定分群数K
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于KMeans算法聚類數k的選取非常重要,下面介紹兩種常用的選擇方法。
手肘法
手肘法的核心指標是SSE(sum of the squared errors,誤差平方和):
其中,Ci是第i個簇,p是Ci中的樣本點,mi是Ci的質心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。 隨著聚類數K的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和(SSE)自然會逐漸變小。但K增大到一定程度時,K增大對SSE減小的作用越來越小,因此K—SSE曲線呈現手肘狀,拐點附近的K值通常為適當的分群數量。
如下的聚類數——SSE曲線,我們可以考慮使用4-6的聚類數,建模后觀察結果,并最終根據業務需求確定分群。
#創建空列表,依次創建k=1~15的模型并 保存SSE結果 sse_list = [ ] K = range(1, 15) for k in range(1,15): kmeans=KMeans(n_clusters=k, n_jobs = 6) kmeans.fit(Zdata) sse_list.append(kmeans.inertia_) #model.inertia_返回模型的誤差平方和,保存進入列表print(sse_list) ? #折線圖展示聚類數——SSE曲線 plt.figure() plt.plot(np.array(K), sse_list, 'bx-') plt.rcParams['figure.figsize'] = [12,8] plt.xlabel('分群數量',fontsize=18) plt.ylabel('SSE',fontsize=18) plt.xticks(fontsize=15) plt.yticks(fontsize=15) plt.show()輪廓系數法
求出所有樣本的輪廓系數后再求平均值就得到了平均輪廓系數。平均輪廓系數的取值范圍為[-1,1],且簇內樣本的距離越近,簇間樣本距離越遠,平均輪廓系數越大,聚類效果越好。
那么,很自然地,平均輪廓系數(silhouette_score)最大的k便是最佳聚類數。
在python中,使用sklearn庫的metrics.silhouette_score()方法可以很容易作出K—平均輪廓系數曲線。
需要注意的是,輪廓系數計算非常耗費資源,通常可以設置sample_size使用抽樣計算平均輪廓系數。
#分別創建分群2-15的KMeans模型 clusters = range(2,15) sc_scores = [] for k in clusters: kmeans_model = KMeans(n_clusters=k, n_jobs = 6).fit(Zdata)sc_score = metrics.silhouette_score(Zdata, kmeans_model.labels_,sample_size=10000, metric='euclidean')sc_scores.append(sc_score)print(sc_scores) #作出K—平均輪廓系數曲線 plt.figure() plt.plot(clusters, sc_scores, 'bx-') plt.rcParams['figure.figsize'] = [12,8] plt.xlabel('分群數量',fontsize=18) plt.ylabel('Silhouette Coefficient Score',fontsize=18) #樣本平均輪廓系數 plt.xticks(fontsize=15) plt.yticks(fontsize=15) plt.show() ?總結
以上是生活随笔為你收集整理的kmeans中的k的含义_聚类的Python实现(二):确定分群数K的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 饥荒机器人怎么用避雷针充电_新款iPho
- 下一篇: 米家机扫拖机器人说明书_除菌扫拖一次搞定