一、基本原理
將相似的物體的物體聚在一起。
評估相似度的方法:計算距離
距離計算方法:
歐式距離、曼哈頓距離、切比雪夫距離、余弦距離
二、應用場景
使用者分群(rfm模型)、行為聚類(埋點設計)、影象分割影象壓縮
三、工作原理
(1)演算法原理
1、選取k個點作為初始的類中心點,這些點一般都是從資料集中隨機抽取的;
2、將每個點分配到最近的類中心點,這樣就形成了k個類,然後重新計算每個類的中心點
3、重複第二步,直到類不發生變化,或者可以設定最大迭代次數,這樣即使類中心點發生變化,但只要達到最大迭代次數就會結束。
(2)時間複雜度
1、計算每個點到所有中心點的複雜度:o(kn)
2、計算各類中點的均值作為新的類中心點:o(n)
(3)其他問題
1、一定會收斂嗎?
答:一定會收斂
2、不同的初始化結果,會不會帶來不一樣的結果?
答:會不一樣,可以看第三點的理由。
3、k-means 的目標函式是什麼?【紅框為目標函式】
k-means的目標函式是非凸函式,所以不同的初始化點對應的最優解不同,好的初始化能找到更好的區域性最優解。
4、k如何選擇?
**自:
a、手肘法
手肘法的核心指標是sse。
ci表示第i類,p是ci中的樣本點,mi是ci的中心點,sse是所有樣本點的聚類誤差,代表了聚類結果的好壞。
該方法 的核心是:隨聚類數k的增大,樣本劃分會更加精確,sse會逐漸減小。其中,當k小於真實聚類數的時候,隨著k增大,sse下降幅度會很大;但當k到達真實聚類數的時候,隨著k增大,sse的下降幅度會很小,並趨於平緩。因此可以根據sse下降幅度來選擇k值,轉折處反映資料的真實聚類數,即選擇的k值。
根據手肘法,上圖資料集的最佳聚類數應該選為4。
b、輪廓係數法
某個樣本點xi的輪廓係數為:
a表示xi與同類其他樣本點的平均距離。稱為凝聚度;b表示xi與最近類中所有樣本的平均距離,稱為分類度。求出所有樣本的輪廓係數後求均值得到平均輪廓係數,平均輪廓係數的取值範圍為[-1,1],平均輪廓係數越大,聚類效果越好,平均輪廓係數最大的k便是最佳聚類數。但是,輪廓係數最大的k所對應的sse不一定小,所以需要結合sse來具體分析,
四、k-means的實現
(1)分群
data_offer=pd.read_excel(r'winekmc.xlsx',sheet_name=0)#sheet_name選擇具體的工作表
data_offer.columns=["offer_id", "campaign", "varietal", "min_qty", "discount", "origin", "past_peak"]#修改列名
data_offer=data_offer.drop(['campaign', 'varietal', 'min_qty', 'discount', 'origin', 'past_peak'],axis=1)#刪去不用的列
data_transaction=pd.read_excel(r'winekmc.xlsx',sheet_name=1)
data_transaction.columns=['name','offer_id']
data_transaction['n'] = 1
data_all=data_transaction.merge(data_offer,on='offer_id')#將兩個資料框合併
#建立透視表
#使用手肘法選擇最優的k值
ss=from sklearn.cluster import kmeans
for k in range(2,20):
kmeans=kmeans(n_clusters=k).fit(table)
plt.plot(range(2,20), ss)
plt.xlabel('k')
plt.ylabel('ss')
#從影象看,選擇k=5
#使用pca來視覺化樣本
from sklearn.decomposition import pca
pca=pca(n_components=2)
data_new=pca.fit_transform(table)#輸出陣列
(2)影象壓縮
from pylab import imread,imshow,figure,show,subplot
from numpy import reshape,uint8,flipud
#uint8是將資料控制在:0到255;
from sklearn.cluster import kmeans
from copy import deepcopy
img = imread(r'sample.jpeg')#讀取資料,得到rgb三通道的資料
pixel=reshape(img,(img.shape[0]*img.shape[1],3))
pixel_new = deepcopy(pixel)
kmeans=kmeans(n_clusters=5)
labels = kmeans.fit_predict(pixel)
palette = kmeans.cluster_centers_#得到聚類中心的rgb數值
for i in range(len(pixel)):
pixel_new[i,:] = palette[labels[i]]#將rgb值替換為簇類中心的rgb值
imshow(reshape(pixel_new, (img.shape[0], img.shape[1],3)))#重新變為畫素的形式
壓縮後影象
五、其他聚類演算法
gmm(軟分類)、層次聚類、spectral clustering、dbscn、kernel k-means、k-means+(讓各類中心點的距離盡可能遠)
kmeans中的k的含義 kmeans聚類理論篇
前言 kmeans是最簡單的聚類演算法之一,但是運用十分廣泛。最近在工作中也經常遇到這個演算法。kmeans一般在資料分析前期使用,選取適當的k,將資料分類後,然後分類研究不同聚類下資料的特點。演算法原理 kmeans的計算方法如下 1 隨機選取k個中心點 2 遍歷所有資料,將每個資料劃分到最近的中...
k均值聚類 K means
分類作為一種監督學習方法,要求必須事先明確知道各個類別的資訊,並且斷言所有待分類項都有乙個類別與之對應。但是很多時候上述條件得不到滿足,尤其是在處理海量資料的時候,如果通過預處理使得資料滿足分類演算法的要求,則代價非常大,這時候可以考慮使用聚類演算法。聚類屬於無監督學習,相比於分類,聚類不依賴預定義...
K均值 K means 聚類演算法
j.b.macqueen 在 1967 年提出的k means演算法 22 到目前為止用於科學和工業應用的諸多聚類演算法中一種極有影響的技術。它是聚類方法中乙個基本的劃分方法,常常採用誤差平方和準則函式作為聚類準則函式,誤差平方和準則函式定義為 3 1 其中,是類 中資料物件的均值,即 j 1,2,...