【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类
Python機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)
Author:louwill
Machine Learning Lab
? ? ?
聚類分析(Cluster Analysis)是一類經(jīng)典的無監(jiān)督學(xué)習(xí)算法。在給定樣本的情況下,聚類分析通過特征相似性或者距離的度量方法,將其自動(dòng)劃分到若干個(gè)類別中。常用的聚類分析方法包括層次聚類法(Hierarchical Clustering)、k均值聚類(K-means Clustering)、模糊聚類(Fuzzy Clustering)以及密度聚類(Density Clustering)等。本節(jié)我們僅對(duì)最常用的kmeans算法進(jìn)行講解。
相似度度量
相似度或距離度量是聚類分析的核心概念。常用的距離度量方式包括閔氏距離和馬氏距離,常用的相似度度量方式包括相關(guān)系數(shù)和夾角余弦等。
閔氏距離
閔氏距離即閔可夫斯基距離(Minkowski Distance),定義如下。給定維向量樣本集合,對(duì)于,,,樣本與樣本之間的閔氏距離可定義為:
,
當(dāng)時(shí),閔氏距離就可以表達(dá)為歐式距離(Euclidean Distance):
當(dāng)時(shí),閔氏距離也稱為曼哈頓距離(Manhatan Distance):
當(dāng)時(shí),閔氏距離也稱為切比雪夫距離(Chebyshev Distance):馬氏距離
馬氏距離全稱為馬哈拉諾比斯距離(Mahalanobis Distance),即一種考慮各個(gè)特征之間相關(guān)性的聚類度量方式。給定一個(gè)樣本集合,其協(xié)方差矩陣為,樣本與樣本之間的馬氏距離可定義為:
當(dāng)為單位矩陣時(shí),即樣本的各特征之間相互獨(dú)立且方差為1時(shí),馬氏距離就是歐式距離。相關(guān)系數(shù)
相關(guān)系數(shù)(Correlation Coefficent)是度量相似度最常用的方式。相關(guān)系數(shù)越接近于1表示兩個(gè)樣本越相似,相關(guān)系數(shù)越接近于0,表示兩個(gè)樣本越不相似。樣本和之間相關(guān)系數(shù)可定義為:夾角余弦
夾角余弦也是度量?jī)蓚€(gè)樣本相似度的方式之一。夾角余弦越接近于1表示兩個(gè)樣本越相似,夾角余弦越接近于0,表示兩個(gè)樣本越不相似。樣本和之間夾角余弦可定義為:
kmeans聚類
kmeans即k均值聚類算法。給定維樣本集合,均值聚類是要將個(gè)樣本劃分到個(gè)不同的類別區(qū)域,通常而言。所以均值聚類可以總結(jié)為對(duì)樣本集合的劃分,其學(xué)習(xí)策略主要是通過損失函數(shù)最小化來選取最優(yōu)的劃分。
我們使用歐式距離作為樣本間距離的度量方式。則樣本間的距離可定義為:
定義樣本與其所屬類中心之間的距離總和為最終損失函數(shù):
其中為第個(gè)類的質(zhì)心(即中心點(diǎn)),中表示指示函數(shù),取值為1或0。函數(shù)表示相同類中樣本的相似程度。所以均值聚類可以規(guī)約為一個(gè)優(yōu)化問題求解:
該問題是一個(gè)NP hard的組合優(yōu)化問題,實(shí)際求解時(shí)我們采用迭代的方法進(jìn)行求解。
根據(jù)以上定義,我們可以梳理均值聚類算法的主要流程如下:
初始化質(zhì)心。即在第0次迭代時(shí)隨機(jī)選擇個(gè)樣本點(diǎn)作為初始化的聚類質(zhì)心點(diǎn)。
按照樣本與中心的距離對(duì)樣本進(jìn)行聚類。對(duì)固定的類中心,其中為類的中心點(diǎn),計(jì)算每個(gè)樣本到類中心的距離,將每個(gè)樣本指派到與其最近的中心點(diǎn)所在的類,構(gòu)成初步的聚類結(jié)果。
計(jì)算上一步聚類結(jié)果的新的類中心。對(duì)聚類結(jié)果計(jì)算當(dāng)前各個(gè)類中樣本均值,并作為新的類中心。
如果迭代收斂或者滿足迭代停止條件,則輸出最后聚類結(jié)果,否則令,返回第二步重新計(jì)算。
kmeans算法實(shí)現(xiàn)
下面我們基于numpy按照前述算法流程來實(shí)現(xiàn)一個(gè)kmeans算法。回顧上述過程,我們可以先思考一下對(duì)算法每個(gè)流程該如何定義。首先要定義歐式距離計(jì)算函數(shù),然后類中心初始化、根據(jù)樣本與類中心的歐式距離劃分類別并獲取聚類結(jié)果、根據(jù)新的聚類結(jié)果重新計(jì)算類中心點(diǎn)、重新聚類直到滿足停止條件。
下面我們先定義兩個(gè)向量之間的歐式距離函數(shù)如下:
然后為每個(gè)類別隨機(jī)選擇樣本進(jìn)行類中心初始化:
根據(jù)歐式距離計(jì)算每個(gè)樣本所屬最近類中心點(diǎn)的索引:
定義構(gòu)建每個(gè)樣本所屬類別過程如下:
根據(jù)上一步聚類結(jié)果重新計(jì)算每個(gè)類別的均值中心點(diǎn):
然后簡(jiǎn)單定義一下如何獲取每個(gè)樣本所屬的類別標(biāo)簽:
最后我們將上述過程進(jìn)行封裝,定義一個(gè)完整的kmeans算法流程:
# 根據(jù)上述各流程定義kmeans算法流程 def kmeans(X, k, max_iterations):# 1.初始化中心點(diǎn)centroids = centroids_init(k, X)# 遍歷迭代求解for _ in range(max_iterations):# 2.根據(jù)當(dāng)前中心點(diǎn)進(jìn)行聚類clusters = create_clusters(centroids, k, X)# 保存當(dāng)前中心點(diǎn)prev_centroids = centroids# 3.根據(jù)聚類結(jié)果計(jì)算新的中心點(diǎn)centroids = calculate_centroids(clusters, k, X)# 4.設(shè)定收斂條件為中心點(diǎn)是否發(fā)生變化diff = centroids - prev_centroidsif not diff.any():break# 返回最終的聚類標(biāo)簽return get_cluster_labels(clusters, X)我們來簡(jiǎn)單測(cè)試一下上述實(shí)現(xiàn)的kmeans算法:
# 測(cè)試數(shù)據(jù) X = np.array([[0,2],[0,0],[1,0],[5,0],[5,2]]) # 設(shè)定聚類類別為2個(gè),最大迭代次數(shù)為10次 labels = kmeans(X, 2, 10) # 打印每個(gè)樣本所屬的類別標(biāo)簽 print(labels) [0. 0. 0. 1. 1.]可以看到,kmeans算法將第1~3個(gè)樣本聚為一類,第4~5個(gè)樣本聚為一類。sklearn中也為我們提供了kmeans算法的接口,嘗試用sklearn的kmeans接口來測(cè)試一下該數(shù)據(jù):
可以看到sklearn的聚類結(jié)果和我們自定義的kmeans算法是一樣的。但是這里有必要說明的一點(diǎn)是,不同的初始化中心點(diǎn)的選擇對(duì)最終結(jié)果有較大影響,自定義的kmeans算法和sklearn算法計(jì)算出來的結(jié)果一致本身也有一定的偶然性。另外聚類類別k的選擇也需要通過一定程度上的實(shí)驗(yàn)才能確定。
參考資料:
李航 統(tǒng)計(jì)學(xué)習(xí)方法 第二版
往期精彩:
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法22:最大熵模型
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法21:馬爾科夫鏈蒙特卡洛
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法20:LDA線性判別分析
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法19:PCA降維
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法18:奇異值分解SVD
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法17:XGBoost
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法16:Adaboost
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法15:GBDT
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法14:Ridge嶺回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法13:Lasso回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法12:貝葉斯網(wǎng)絡(luò)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法11:樸素貝葉斯
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法10:線性不可分支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法8-9:線性可分支持向量機(jī)和線性支持向量機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法7:神經(jīng)網(wǎng)絡(luò)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法6:感知機(jī)
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法5:決策樹之CART算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法4:決策樹之ID3算法
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法3:k近鄰
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法2:邏輯回歸
數(shù)學(xué)推導(dǎo)+純Python實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法1:線性回歸
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請(qǐng)掃碼進(jìn)群:總結(jié)
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习基础】数学推导+纯Python
- 下一篇: 【机器学习基础】数学推导+纯Python