Day56 選定k值與silhouette_score的關係[kmeans]?
之前我有問過相同的問題:
選定k值的時候要選擇:
a. average silhouette_score最高的k值
b. average silhouette_score比下一個分群值的分數大很多的k值
我得到的回答是選項a.
但我想問Day56中的範例程式碼最後的分析討論提到:
觀察輸出值 : silhouette_score, 如果是一個適合的分群值, 應該要比下一個分群值的分數大很多
由結果可以看出 : 2, 3, 5 都是不錯的分群值(因為比 3, 4, 6的分數都高很多), 相形之下, 4, 6, 7 作為分群的效果就不明顯
Day56的範例程式碼的正確k值應該是3,但是最高的average silhouette_score是k=2。
所以我想針對這個問題在提問一下,謝謝
----------------------------------------------------------5/29更新-------------------------------------------------------------------------------
# 載入 iris 資料集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 設定需要計算的 K 值集合
range_n_clusters = [2, 3, 4, 5, 6, 7, 8]
for n_clusters in range_n_clusters:
# 宣告 KMean 分群器, 對 X 訓練並預測
clusterer = KMeans(n_clusters=n_clusters, random_state=10)
cluster_labels = clusterer.fit_predict(X)
# 計算所有點的 silhouette_score 平均
silhouette_avg = silhouette_score(X, cluster_labels)
silhouette_avg_list.append(silhouette_avg)
print("For n_clusters =", n_clusters,
"The average silhouette_score is :", silhouette_avg)
# 計算所有樣本的 The silhouette_score
sample_silhouette_values = silhouette_samples(X, cluster_labels)
程式碼結果:
For n_clusters = 2 The average silhouette_score is : 0.681046169211746
For n_clusters = 3 The average silhouette_score is : 0.5528190123564091
For n_clusters = 4 The average silhouette_score is : 0.4980505049972867
For n_clusters = 5 The average silhouette_score is : 0.4887488870931048
For n_clusters = 6 The average silhouette_score is : 0.3648340039670018
For n_clusters = 7 The average silhouette_score is : 0.35445799253167404
For n_clusters = 8 The average silhouette_score is : 0.34873453772193763
k值對average silhouette_score作圖:
回答列表
-
2020/05/26 上午 00:40Jeffrey贊同數:0不贊同數:1留言數:2
先行假設一個區間, 來找尋
silhouette_avg = []
for i in range(2,11):
kmeans_fit = KMeans(n_clusters = i).fit(X)
silhouette_avg.append(silhouette_score(X, kmeans_fit.labels_))
plt.plot(range(2,11), silhouette_avg)
所以, 可以來驗證一下, 應該是K會是最大值
-
2020/05/27 上午 08:39張維元 (WeiYuan)贊同數:0不贊同數:0留言數:1
嗨,Nick
很高興你再次追問,不過想先確認一下你是否已經理解「silhouette_score」的含義了嗎?你自己覺得哪一個方法比較合理呢?
a. average silhouette_score最高的k值
b. average silhouette_score比下一個分群值的分數大很多的k值
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃
-
2020/05/29 上午 02:24張維元 (WeiYuan)贊同數:0不贊同數:0留言數:1
「但是day56的範例碼找到擁有最高silhouette_score的k值是2,而正確的k值是3」
=> 請問你這裡說的「正確的k值是3」是從哪邊看到的?或是哪邊提供的?
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃
-
2020/05/30 上午 03:10張維元 (WeiYuan)贊同數:0不贊同數:0留言數:1
「程式碼跟結果我已經放在上方了(我重新編輯了問題了)」
=> 呃,我看到你的更新了,但你想問的問題是什麼?
「Day56的範例程式碼的正確k值應該是3,但是最高的average silhouette_score是k=2。
所以我想針對這個問題在提問一下,謝謝」
=> 從結果中可以看到 最高的 average silhouette_score 是 k=2 沒錯,但「Day56的範例程式碼的正確k值應該是3」這一句是哪裡來的?
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃
-
2020/05/30 下午 00:22張維元 (WeiYuan)贊同數:2不贊同數:0留言數:0
嗨,「我去檢查 y = iris.target 這行的結果: >>> print(np.unique(y)) [0 1 2] 這應該代表資料集中的鳶尾花總共有三個分類吧? 所以我才推論正確的k值應該是3」
=> 原則上,分群值是一種非監督式的學習,會把相似的資料視為相同的 Group 或 Cluster,但我們不一定會說他們同一個類別。類別跟組別本身是不的概念,不一定能說同一個 Group 會是相同的 Classs。
分類的判斷標準是一據特徵跟標籤之間的關係,而分群是一種資料跟資料間的關係。
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃