Python機(jī)器學(xué)習(xí)K均值聚類(lèi)建模和調(diào)參

聚類(lèi)分析(英語(yǔ):Cluster analysis)亦稱(chēng)為群集分析,是對(duì)于統(tǒng)計(jì)數(shù)據(jù)分析的一門(mén)技術(shù),在許多領(lǐng)域受到廣泛應(yīng)用,包括機(jī)器學(xué)習(xí),數(shù)據(jù)挖掘,模式識(shí)別,圖像分析以及生物信息,顧客分類(lèi),文章分類(lèi)等。聚類(lèi)是把相似的對(duì)象通過(guò)靜態(tài)分類(lèi)的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個(gè)子集中的成員對(duì)象都有相似的一些屬性,常見(jiàn)的包括在坐標(biāo)系中更加短的空間距離等。一般把數(shù)據(jù)聚類(lèi)歸納為一種非監(jiān)督式學(xué)習(xí)。
無(wú)監(jiān)督學(xué)習(xí)(英語(yǔ):unsupervised learning)是機(jī)器學(xué)習(xí)的一種方法,沒(méi)有給定事先標(biāo)記過(guò)的訓(xùn)練示例,自動(dòng)對(duì)輸入的數(shù)據(jù)進(jìn)行分類(lèi)或分群。無(wú)監(jiān)督學(xué)習(xí)的主要運(yùn)用包含:聚類(lèi)分析(cluster analysis)、關(guān)系規(guī)則(association rule)、維度縮減(dimensionality reduce)。它是監(jiān)督式學(xué)習(xí)和強(qiáng)化學(xué)習(xí)等策略之外的一種選擇。一個(gè)常見(jiàn)的無(wú)監(jiān)督學(xué)習(xí)是數(shù)據(jù)聚類(lèi)。簡(jiǎn)單來(lái)說(shuō),就是給出的數(shù)據(jù)集合只有自變量,沒(méi)有因變量,通過(guò)分析自變量,找出樣本的關(guān)系,如分類(lèi)、關(guān)系等。

分類(lèi)和聚類(lèi)的區(qū)別

  • 分類(lèi):事先知道存在哪些類(lèi)別(有x和y)
  • 聚類(lèi):事先不知道存在哪些類(lèi)別(只有x)

一、聚類(lèi)分析的常見(jiàn)算法

  1. K-Means(K均值)聚類(lèi)
  2. 均值漂移聚類(lèi)
  3. 基于密度的聚類(lèi)方法(DBSCAN)
  4. 用高斯混合模型(GMM)的最大期望(EM)聚類(lèi)
  5. 凝聚層次聚類(lèi)
  6. 圖團(tuán)體檢測(cè)(Graph Community Detection)

二、K-Means(K均值)聚類(lèi)

算法步驟:

  1. 首先我們選擇一些類(lèi)/組,并隨機(jī)初始化它們各自的中心點(diǎn)。中心點(diǎn)是與每個(gè)數(shù)據(jù)點(diǎn)向量長(zhǎng)度相同的位置。這需要我們提前預(yù)知類(lèi)的數(shù)量(即中心點(diǎn)的數(shù)量)。
  2. 計(jì)算每個(gè)數(shù)據(jù)點(diǎn)到中心點(diǎn)的距離,數(shù)據(jù)點(diǎn)距離哪個(gè)中心點(diǎn)最近就劃分到哪一類(lèi)中。
  3. 計(jì)算每一類(lèi)中中心點(diǎn)作為新的中心點(diǎn)。
  4. 重復(fù)以上步驟,直到每一類(lèi)中心在每次迭代后變化不大為止。也可以多次隨機(jī)初始化中心點(diǎn),然后選擇運(yùn)行結(jié)果最好的一個(gè)。
image

隨機(jī)選擇2個(gè)點(diǎn)(k=2)C1和C2,將剩下的所有點(diǎn),根據(jù)距離C1和C2的距離的遠(yuǎn)近,劃分給C1或者C2

image

根據(jù)獲得的兩類(lèi)點(diǎn),重新計(jì)算兩類(lèi)點(diǎn)中的質(zhì)心(到該類(lèi)所有點(diǎn)的距離最短)重新將所有的點(diǎn)歸到兩個(gè)新的質(zhì)心的其中之一。
重復(fù)上面的過(guò)程,直到每一類(lèi)中心在每次迭代后變化不大為止。
優(yōu)點(diǎn):速度快,計(jì)算簡(jiǎn)便,但缺點(diǎn)也比較明顯:

  1. 我們必須提前知道數(shù)據(jù)有多少類(lèi)/組;
  2. 聚類(lèi)結(jié)果對(duì)初始類(lèi)簇中心的選取較為敏感;
  3. 容易陷入局部最優(yōu);
  4. 只能發(fā)現(xiàn)球型類(lèi)簇;

三、Python實(shí)現(xiàn)

3.1 導(dǎo)入模塊和準(zhǔn)備數(shù)據(jù)

import pandas as pd
import seaborn as sns
import numpy as np
from sklearn.cluster import KMeans
from sklearn.grid_search import GridSearchCV

iris = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None)
iris.columns=['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species']
features =  ['PetalWidthCm','PetalLengthCm']
X = iris[features]

3.2 查看分類(lèi)

sns.relplot(x="PetalWidthCm", y="PetalLengthCm", hue="Species",palette="Set1",data=iris)
image

3.3 模型建立

K均值聚類(lèi)需要提供一個(gè)你希望的分類(lèi)的數(shù)量,我們看看分成兩類(lèi)的效果如何。

km = KMeans(2)
km.fit(X)
iris['cluster_k2'] = km.predict(X)
sns.relplot(x="PetalWidthCm", y="PetalLengthCm", hue="cluster_k2",palette="Set1",data=iris)#把預(yù)測(cè)分類(lèi)分類(lèi)都在圖表上畫(huà)出來(lái)。
image

接下來(lái)我們看看分成三類(lèi)的效果如何。

km = KMeans(3)
km.fit(X)
iris['cluster_k3'] = km.predict(X)
sns.relplot(x="PetalWidthCm", y="PetalLengthCm", hue="cluster_k3",palette="Set1",data=iris)#把預(yù)測(cè)分類(lèi)都在圖表上畫(huà)出來(lái)。
image

如果用人眼判定,分三類(lèi)其實(shí)和原來(lái)的類(lèi)別很接近了,需要注意的是,我們一般做聚類(lèi),是沒(méi)有原類(lèi)別的。
那我們?nèi)绾卧u(píng)價(jià)到底分多少個(gè)類(lèi)別好呢,我們的X如果是兩維的還可以畫(huà)圖來(lái)看看效果,X是三維以上就沒(méi)辦法畫(huà)圖了。

3.4 成本(目標(biāo))函數(shù)

成本(目標(biāo))函數(shù):類(lèi)內(nèi)離差平方和∑ki=1(∑x∈Cidist(x,ci)2)∑i=1k(∑x∈Cidist(x,ci)2),我們只有找到一個(gè)K使得目標(biāo)函數(shù)最少,但一般情況下,K越大目標(biāo)函數(shù)值越小,但隨著K的增大,目標(biāo)函數(shù)值會(huì)下降得越來(lái)越慢,我們找到下降一定的穩(wěn)定程度就可以了。
接下來(lái)我們用網(wǎng)格搜索去循環(huán)計(jì)算不同的K值的目標(biāo)函數(shù)值,并把目標(biāo)函數(shù)對(duì)K的變化畫(huà)圖出來(lái)。

param_test1 = {'n_clusters':np.arange(2,11,1)}
gsearch1 = GridSearchCV(estimator = KMeans(),param_grid = param_test1,cv=5)
gsearch1.fit(X)
score_list=-pd.DataFrame(gsearch1.grid_scores_)['mean_validation_score']
sns.lineplot(x=range(2,11),y=score_list)

網(wǎng)格搜索有三個(gè)結(jié)果很常用:
gsearch1.grid_scores_:各個(gè)K值對(duì)應(yīng)的得分
gsearch1.best_params_:最佳的K值
gsearch1.best_score_:最佳的得分

image

可以看出來(lái),K=3及之后,目標(biāo)函數(shù)值下降開(kāi)始減緩,這樣我們認(rèn)為K=3就可以了。

對(duì)于環(huán)狀的分類(lèi)分別,K均值算法就無(wú)能為力了。記住K均值只能發(fā)現(xiàn)球型類(lèi)簇。

image
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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