logo
Loading...

Day56 選定k值與silhouette_score的關係[kmeans]? - Cupoy

之前我有問過相同的問題:選定k值的時候要選擇:                a. average ...

Day56 選定k值與silhouette_score的關係[kmeans]?

2020/05/25 下午 04:54
機器學習共學討論版
Nick
觀看數:65
回答數:5
收藏數:3

之前我有問過相同的問題:

選定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()
= iris.data
= 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:40
    Jeffrey
    贊同數: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 😃😃😃