肘部法則求kmeans聚類最佳分類數K

原文鏈接:https://blog.csdn.net/hutao1101175783/article/details/77417186
K-Means算法是一個重複移動類中心點的過程,把類的中心點,也稱重心(centroids),移動到其包含成員的平均位置,然後重新劃分其內部成員。 是算法計算出的超參數,表示類的數量;K-Means可以自動分配樣本到不同的類,但是不能決定究竟要分幾個類。
K-Means的參數是類的重心位置和其內部觀測值的位置。與廣義線性模型和決策樹類似,K-Means參數的最優解也是以成本函數最小化爲目標。K-Means成本函數公式如下:

uk是第k 個類的重心位置。成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等於該類重心與其內部成員位置距離的平方和。若類內部的成員彼此間越緊湊則類的畸變程度越小,反之,若類內部的成員彼此間越分散則類的畸變程度越大。求解成本函數最小化的參數就是一個重複配置每個類包含的觀測值,並不斷移動類重心的過程。

#-*- coding:utf-8 -*-  

import numpy as np  
import matplotlib.pyplot as plt  
from sklearn.cluster import KMeans  
from scipy.spatial.distance import cdist  

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')  

x = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])  
y = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])  
data = np.array(list(zip(x, y)))  

# 肘部法則 求解最佳分類數  
# K-Means參數的最優解也是以成本函數最小化爲目標  
# 成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等於該類重心與其內部成員位置距離的平方和  
'''''aa=[] 
K = range(1, 10) 
for k in range(1,10): 
    kmeans=KMeans(n_clusters=k) 
    kmeans.fit(data) 
    aa.append(sum(np.min(cdist(data, kmeans.cluster_centers_, 'euclidean'),axis=1))/data.shape[0]) 
plt.figure() 
plt.plot(np.array(K), aa, 'bx-') 
plt.show()'''  
#繪製散點圖及聚類結果中心點  
plt.figure()  
plt.axis([0, 10, 0, 10])  
plt.grid(True)  
plt.plot(x,y,'k.')  
kmeans=KMeans(n_clusters=3)  
kmeans.fit(data)  
plt.plot(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],'r.')  
plt.show() 

待補充內容:
https://blog.csdn.net/ZhikangFu/article/details/48436257
https://blog.csdn.net/jacke121/article/details/78058182
https://blog.csdn.net/elaine_bao/article/details/50242867

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章