日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述

K-Means(K均值)是機器學習中一種常見的無監督算法,它能夠將未知標簽的數據,根據它們的特征分成不同組,每一組數據又稱為“簇”,每一簇的中心點稱為“質心”。其基本原理過程如下:

① 任意選擇K個初始質心(可以不是樣本點),為每個樣本點找到與其距離最近的質心,并將樣本點與質心歸為同一簇,從而生成K個簇;

② 當所有樣本點都被分完,對于每一個簇,重新計算新的質心(同一簇中所有點的平均坐標值);

③ 不斷迭代,直到不會質心的位置不發生改變。

可見,整個算法中,最核心的參數是K。那么K該如何確定呢?

這里我們引入輪廓系數S:

其計算公式如圖所示,其中,a表示樣本點與同一簇中所有其他點的平均距離,即樣本點與同一簇中其他點的相似度;b表示樣本點與下一個最近簇中所有點的平均距離,即樣本點與下一個最近簇中其他點的相似度。

K-Means追求的是對于每個簇而言,其簇內差異小,而簇外差異大,輪廓系數S正是描述簇內外差異的關鍵指標。由公式可知,S取值范圍為(-1, 1),當S越接近于1,則聚類效果越好,月接近-1,聚類效果越差。

接下里我們通過代碼來實現如何基于輪廓系數確定K值。

二、實踐

1、導入相關包

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score

2、創建數據集并可視化

在創建數據的過程中,為了可視化效果良好,所以預先給出了centers=4,但不影響我們后面確定K值。

x, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)# 繪圖,查看數據樣本的分布 fig, ax = plt.subplots(1) fig.set_size_inches(8,6) ax.scatter(x[:, 0], x[:, 1], marker='o', s=8) plt.show()

數據集一共由兩列特征組成,即橫軸和縱軸。實際應用中,數據往往會有許多列特征,一般需要先通過降維算法(如PCA)將多維特征壓縮至二維或者三維,才能可視化。觀察上圖,乍一看,數據應該能被分成4簇,但有的人覺得分成2簇(左下1簇,右上1簇),或者分成3簇(最下面1簇,中間1簇,右上1簇)也是合理的。

那么到底能分成幾類呢?這時就需要通過輪廓系數來幫我們確定。

# 給定K值(n_clusters)的范圍 n_clusters = range(2, 5)# 循環繪圖 for n in n_clusters:# 創建繪圖區域fig, ax = plt.subplots(1)fig.set_size_inches(8, 6)# 實例化cluster = KMeans(n_clusters=n,random_state=10).fit(x)# 訪問labels_屬性,獲得聚類結果y_pred = cluster.labels_# 訪問cluster_centers_屬性,獲得質心坐標centroid = cluster.cluster_centers_# 計算平均輪廓系數silhouette_avg = silhouette_score(x, y_pred)# 繪制聚類結果# y_pred==i會返回布爾數組,從而獲得那些被分為同一類的點for i in range(n):ax.scatter(x[y_pred==i, 0],x[y_pred==i, 1],marker='o',s=8,alpha=0.7) # 繪制質心ax.scatter(centroid[:, 0],centroid[:, 1],marker='x',s=30,c='k') # 設置圖表標題ax.set_title('result of KMeans(n_clusters={})'.format(n)) # 設置x軸標題ax.set_xlabel('feature_1') # 設置y軸標題ax.set_ylabel('feature_2') # 設置總標題,用來描述輪廓系數的值plt.suptitle('The average silhouette value is {:.4f}.'.format(silhouette_avg),fontsize=14, fontweight='bold')plt.show()

執行代碼后,系統幫我們自動生成了3張圖,并告訴我們每張圖中,K的取值和平均輪廓系數值。可以看到K=2時,S=0.7050;K=3,S=0.5882;K=4,S=0.6505。當數據集被分為4簇時,輪廓系數比為3簇的高,因此我們舍棄K=3。然而當K=2時,得分竟然是最高的,這與我們最初創建數據集時給的真實分類centers=4是不一致的!

這恰恰說明了:

① 輪廓系數確實能幫助我們確定K的取值,并且分數越接近1,越能代表更好的聚類效果;

② 分數最高的K值,并不一定是正確的聚類結果(雖然我們可能并不知道真實的分類);

③ 實際應用中,需要緊密結合輪廓系數與業務需求,才能得到恰當的結果;

總結

以上是生活随笔為你收集整理的当复选框中打勾时后面自动显示y或者n_基于轮廓系数确定K-Means聚类中的K的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。