初探K-means聚類算法(附與KNN算法的比較))

Hello! 七月的小李又上線啦~
今天看視頻的時(shí)候看到K-means算法 想到之前寫過的K-近鄰算法的學(xué)習(xí)(附Python和Matlab實(shí)現(xiàn))就打算把這個(gè)算法也整理一下并和之前的KNN對(duì)比一下。
——————
在正式寫K-means之前需要先了解一個(gè)名詞:聚類

聚類

聚類,顧名思義,從字面上可以簡(jiǎn)單的理解為相似元素的一個(gè)集合。那么實(shí)際上,聚類是屬于無監(jiān)督學(xué)習(xí)的算法。對(duì)于聚類來說,我們不需要有l(wèi)abel即標(biāo)簽,只需要有數(shù)據(jù)(事先不存在類別之分),這些數(shù)據(jù)通過一定的學(xué)習(xí)和訓(xùn)練,完成共同的群體聚類。K-means算法是聚類中常用的算法之一。

K-means算法

定義

K-means算法從實(shí)現(xiàn)的原理上可以說是基于距離的聚類算法。此算法選取距離作為判斷相似性的評(píng)價(jià)指標(biāo),即如果兩個(gè)元素的距離越近,那么在一定程度上它們的相似度就越大。除此,該算法認(rèn)為類簇是由距離靠近的元素組成的,因此把得到緊湊且獨(dú)立的簇作為最終目標(biāo),即完成聚類。其主要特點(diǎn)為:各個(gè)聚類本身緊湊,且聚類之間要盡可能的分開,有一定的距離。

原理

K-means算法的原理就是通過迭代尋找k個(gè)類簇的一種劃分方案,使得用這k個(gè)類簇的均值來代表相應(yīng)各類樣本時(shí)所得的總體誤差最小。
k-means算法的基礎(chǔ)是最小誤差平方和準(zhǔn)則。
具體的式子如下,其中μc(i)表示第i個(gè)聚類的均值。

各類簇內(nèi)的樣本越相似,其與該類均值間的誤差平方越小,對(duì)所有類所得到的誤差平方求和,即可驗(yàn)證分為k類時(shí),各聚類是否是最優(yōu)的。
(更為詳細(xì)的解釋參見:https://blog.csdn.net/qq_32892383/article/details/80107795

算法步驟

以下圖為例說明:初始下為(a)即沒有任何labels的數(shù)據(jù)集,需要達(dá)到(f)即分成兩個(gè)分開的類簇。

1.先隨機(jī)挑選兩個(gè)點(diǎn)作為聚類中心(cluster centroids)即(b),K-均值算法是一個(gè)迭代過程,分為兩部分,第一為簇分類,第二為移動(dòng)聚類中心。? 簇分類是將(b)所有的綠色樣本點(diǎn)根據(jù)其距離藍(lán)色、紅色中心點(diǎn)距離,分配到簇中,染成相應(yīng)的紅色或者藍(lán)色(c)。
2.之后計(jì)算染色的點(diǎn)的平均值(平均下來的位置)此時(shí)將相應(yīng)的聚類中心移動(dòng)到這個(gè)均值處(d)。而后再反復(fù)進(jìn)行迭代最終得到(f)。
迭代詳細(xì):

因而我們可以概括一下, 也就是主要是計(jì)算質(zhì)心與數(shù)據(jù)點(diǎn)的距離 ,將數(shù)據(jù)點(diǎn)分配到距離最近的簇。對(duì)每一個(gè)簇,計(jì)算簇中所有點(diǎn)的均值,并將均值作為質(zhì)心。這樣一個(gè)反復(fù)迭代的過程。
代碼
這邊可以利用利用scikit-learn里面的KMeans函數(shù)來簡(jiǎn)單實(shí)現(xiàn)

from sklean.cluster import KMeans
kmeans = KMeans(n_clusters=5) # 獲取模型
kmeans.fit(X_train)  #這里不需要給他答案 只把要分類的數(shù)據(jù)給他 即可

更為詳細(xì)的代碼可參考機(jī)器學(xué)習(xí)算法-K-means聚類

K-means算法 VS KNN算法

畫個(gè)重點(diǎn)!從本質(zhì)上來說 KNN算法是屬于監(jiān)督學(xué)習(xí)算法,即有存在Labels,而K-means算法是無監(jiān)督學(xué)習(xí)算法,不存在labels.
KNN用于分類,K-means用于聚類。圖解對(duì)比如下

K-means算法的步驟上面已經(jīng)寫過,下面補(bǔ)充KNN步驟進(jìn)行對(duì)比:
通過對(duì)比可以簡(jiǎn)單概括:這兩個(gè)算法都是基于距離去計(jì)算的、都是需要進(jìn)行迭代的。但K-means需要選取質(zhì)心并且改變質(zhì)心,KNN不存在質(zhì)心選取,它的訓(xùn)練數(shù)據(jù)集需要有l(wèi)abel或者類別,它額是把沒有標(biāo)簽的數(shù)據(jù)點(diǎn)(樣本)自動(dòng)打上標(biāo)簽或者預(yù)測(cè)所屬類別。

幾個(gè)問題

1..K-Means算法K值如何選擇?
首先,k的取值是沒有固定的,不同的k得到的結(jié)果會(huì)有挺大的不同。如下圖所示,左邊是k=3的結(jié)果,這個(gè)就太稀疏了,藍(lán)色的那個(gè)簇其實(shí)是可以再劃分成兩個(gè)簇的。而右圖是k=5的結(jié)果,可以看到紅色菱形和藍(lán)色菱形這兩個(gè)簇應(yīng)該是可以合并成一個(gè)簇的。

那么我們可以怎么去選取這個(gè) k更合適?對(duì)k的選擇可以先用一些算法分析數(shù)據(jù)的分布,如重心和密度等,然后選擇合適的k。
2.如何確定K個(gè)簇的初始質(zhì)心?
選擇批次距離盡可能遠(yuǎn)的K個(gè)點(diǎn)。首先隨機(jī)選擇一個(gè)點(diǎn)作為第一個(gè)初始類簇中心點(diǎn),然后選擇距離該點(diǎn)最遠(yuǎn)的那個(gè)點(diǎn)作為第二個(gè)初始類簇中心點(diǎn),然后再選擇距離前兩個(gè)點(diǎn)的最近距離最大的點(diǎn)作為第三個(gè)初始類簇的中心點(diǎn),以此類推,直至選出K個(gè)初始類簇中心點(diǎn)。
參考(http://www.csuldw.com/2015/06/03/2015-06-03-ml-algorithm-K-means/

其余參考K-means聚類算法及python代碼實(shí)現(xiàn)

————————————
合格搬運(yùn)的一天 七月也要努力鴨!順心yeah!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容