機(jī)器學(xué)習(xí)(五):聚類

一惨险、基本原理

聚類(clustering)是一種無(wú)監(jiān)督學(xué)習(xí)(unsupervised learning)倍宾,即沒有標(biāo)記信息消约,通過對(duì)無(wú)標(biāo)記訓(xùn)練樣本的學(xué)習(xí)發(fā)現(xiàn)數(shù)據(jù)的內(nèi)在性質(zhì)和規(guī)律趋惨。
對(duì)于樣本集D=\left\{\boldsymbol{x}_{1}, \boldsymbol{x}_{2}, \ldots, \boldsymbol{x}_{m}\right\},聚類算法需要將樣本劃分為k個(gè)互不相交的簇\mathcal{C}=\left\{C_{1},C_{2}, \ldots, C_{k} \right\}. k-means算法針對(duì)聚類所得簇最小化平方誤差:E=\sum_{i=1}^{k} \sum_{\boldsymbol{x} \in C_{i}}\left\|\boldsymbol{x}-\boldsymbol{\mu}_{i}\right\|_{2}^{2} 其中\boldsymbol{\mu}_{i}=\frac{1}{\left|C_{i}\right|} \sum_{\boldsymbol{x} \in C_{i}} \boldsymbol{x}為簇均值向量酷宵。E在一定程度上刻畫了簇內(nèi)樣本圍繞簇均值向量的緊密程度捞挥,E越小相似度越高。
簡(jiǎn)單來說忧吟,k-means算法主要分為兩個(gè)步驟:
第一步:簇分配砌函,隨機(jī)選k個(gè)點(diǎn)作為中心,計(jì)算到這k個(gè)點(diǎn)的距離溜族,分為k個(gè)簇讹俊。
第二步:移動(dòng)聚類中心:重新計(jì)算每個(gè)簇的中心,移動(dòng)中心煌抒,重復(fù)以上步驟仍劈。

k-means算法

二、算法實(shí)現(xiàn)

k-means算法過程比較簡(jiǎn)單明晰寡壮,以下為其實(shí)現(xiàn)過程:

  1. 所需要的庫(kù)
import numpy as np
import scipy.io as spio
import imageio
import matplotlib.pyplot as plt
  1. 主體過程贩疙,返回聚類中心的位置和各點(diǎn)的歸屬
def KMeans(X,init_centroids,max_iters,plot_process):
    m,n = X.shape
    K = init_centroids.shape[0]
    centriods = init_centroids
    pre_centroids = centriods
    
    for i in range(max_iters):
        if plot_process:
            ax = plotProcess(X,centriods,pre_centroids)
            pre_centroids = centriods
        idx = calcDistance(X,centriods)
        centriods = calcCentroids(X,idx,K)
    if plot_process:
        ax.show()
    return centriods,idx
  1. 計(jì)算各點(diǎn)到聚類中心的位置,并據(jù)此將其分屬不同類
def calcDistance(X,init_centroids):
    m = X.shape[0]
    K = init_centroids.shape[0]
    dis = np.zeros((m,K))
    idx = np.zeros((m,1))
    
    for i in range(m):
        for j in range(K):
            dis[i,j] = np.dot((X[i,:]-init_centroids[j,:]).reshape(1,-1),(X[i,:]-init_centroids[j,:]).reshape(-1,1))
    
    dummy, idx = np.where(dis==np.min(dis,axis=1).reshape(-1,1))
    return idx[0:m]
  1. 計(jì)算聚類中心况既,即均值向量
def calcCentroids(X,idx,K):
    n = X.shape[1]
    centroids = np.zeros((K,n))
    for i in range(K):
        centroids[i,:] = np.mean(X[np.ravel(idx==i),:],axis=0).reshape(1,-1)
        
    return centroids
  1. 輔助函數(shù)这溅,繪圖及初始化聚類中心位置
def plotProcess(X,centriods,pre_centroids):
    plt.scatter(X[:,0],X[:,1])
    plt.plot(pre_centroids[:,0],pre_centroids[:,1],'r*',markersize=10,linewidth=5)
    plt.plot(centriods[:,0],centriods[:,1],'r*',markersize=10,linewidth=5)
    for j in range(centriods.shape[0]):
        p1 = centriods[j,:]
        p2 = pre_centroids[j,:]
        plt.plot([p1[0],p2[0]],[p1[1],p2[1]],'->',linewidth=2)
    return plt

def initCentroids(X,K):
    m = X.shape[0]
    m_arr = np.arange(0,m)
    centroids = np.zeros((K,X.shape[1]))
    np.random.shuffle(m_arr)
    rand_indices = m_arr[:K]
    centroids = X[rand_indices,:]
    return centroids
  1. 主函數(shù)
def main():
    data = spio.loadmat('data.mat')
    X = data['X']
    K = 3 
   # init_centroids = np.array([[3,3],[0,2],[7,5]])
    init_centroids = initCentroids(X,K)
    max_iters = 10
    KMeans(X,init_centroids,max_iters,True)
if __name__=='__main__':
    main()

下圖為聚類的結(jié)果,形象展示了聚類中心及其移動(dòng)過程棒仍。

聚類中心及其移動(dòng)過程

聚類算法可用于圖片的壓縮悲靴,將圖片的像素分為若干類,然后用這個(gè)類代替原來的像素值莫其,以下為其實(shí)現(xiàn)過程及結(jié)果:

def imageCompression():
    img_data = imageio.imread('bird.png')
    img_data = img_data/255.0
    img_size =img_data.shape
    X = img_data.reshape(img_size[0]*img_size[1],3)
    
    K = 10
    max_iters = 10
    init_centroids = initCentroids(X,K)
    centroids,idx = KMeans(X,init_centroids,max_iters,False)
    idx = calcDistance(X,centroids)
    X_recovered = centroids[idx,:]
    X_recovered = X_recovered.reshape(img_size[0],img_size[1],3)
    
    plt.subplot(1,2,1)
    plt.imshow(img_data)
    plt.subplot(1,2,2)
    plt.imshow(X_recovered)
    plt.show()
    
if __name__=='__main__':
    imageCompression()    
原圖及壓縮后的結(jié)果

另外可以通過mglearn庫(kù)展示聚類過程和分類邊界癞尚。

import mglearn

mglearn.plots.plot_kmeans_algorithm()
mglearn.plots.plot_kmeans_boundaries()
聚類過程及分類邊界

三、問題探討

3.1乱陡、性能度量

聚類性能度量大致有兩類:一類是外部指標(biāo)浇揩,就是將聚類結(jié)果與某個(gè)“參考模型”比較;另一類是內(nèi)部指標(biāo)憨颠,即直接考察聚類結(jié)果而不利用任何參考模型胳徽。
外部指標(biāo)

  • Jaccard系數(shù)(Jaccard Coefficient, JC)
    J C=\frac{a}{a+b+c}
  • FM指數(shù)(Fowlkes and Mallows Index, FMI)
    \mathrm{FMI}=\sqrt{\frac{a}{a+b} \cdot \frac{a}{a+c}}
  • Rand指數(shù)(Rand Index, RI)
    \mathrm{RI}=\frac{2(a+d)}{m(m-1)}
    上述指標(biāo)的結(jié)果值均在[0,1]之間,值越大越好。
    其中
    a=|S S|, \quad S S=\left\{\left(x_{i}, x_{j}\right) | \lambda_{i}=\lambda_{j}, \lambda_{i}^{*}=\lambda_{j}^{*}, i<j\right) \}
    b=|S D|, \quad S D=\left\{\left(x_{i}, x_{j}\right) | \lambda_{i}=\lambda_{j}, \lambda_{i}^{*} \neq \lambda_{j}^{*}, i<j\right) \}
    c=|D S|, \quad D S=\left\{\left(x_{i}, x_{j}\right) | \lambda_{i} \neq \lambda_{j}, \lambda_{i}^{*}=\lambda_{j}^{*}, i<j\right) \}
    d=|D D|, \quad D D=\left\{\left(x_{i}, x_{j}\right) | \lambda_{i} \neq \lambda_{j}, \lambda_{i}^{*} \neq \lambda_{j}^{*}, i<j\right) \}
    \mathcal{C}^{*}=\left\{C_{1}^{*}, C_{2}^{*}, \ldots, C_{s}^{*}\right\}表示參考模型膜廊。

內(nèi)部指標(biāo)

  • DB指數(shù)(Davies-Bouldin Index, DBI)
    \mathrm{DBI}=\frac{1}{k} \sum_{i=1}^{k} \max _{j \neq i}\left(\frac{\operatorname{avg}\left(C_{i}\right)+\operatorname{avg}\left(C_{j}\right)}{d_{\operatorname{cen}}\left(\boldsymbol{\mu}_{i}, \boldsymbol{\mu}_{j}\right)}\right)
  • Dunn指數(shù)(Dunn Index, DI)
    \mathrm{DI}=\min _{1 \leqslant i \leqslant k}\left\{\min _{j \neq i}\left(\frac{d_{\min }\left(C_{i}, C_{j}\right)}{\max _{1 \leqslant l \leqslant k} \operatorname{diam}\left(C_{l}\right)}\right)\right\}
    DBI的值越小越好,DI值越大越好淫茵。
    其中
    \operatorname{avg}(C)=\frac{2}{|C|(|C|-1)} \sum_{1 \leqslant i<j \leqslant|C|} \operatorname{dist}\left(x_{i}, x_{j}\right)
    \operatorname{diam}(C)=\max _{1 \leqslant i<j \leq|C|} \operatorname{dist}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)
    d_{\min }\left(C_{i}, C_{j}\right)=\min _{\boldsymbol{x}_{i} \in C_{i, \boldsymbol{x}} \in C_{j}} \operatorname{dist}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)
    d_{\mathrm{cen}}\left(C_{i}, C_{j}\right)=\operatorname{dist}\left(\boldsymbol{\mu}_{i}, \boldsymbol{\mu}_{j}\right)

3.2爪瓜、距離度量

距離度量\operatorname{dist}(\cdot, \cdot)是機(jī)器學(xué)習(xí)中一個(gè)非常常用的概念,反映了兩點(diǎn)之間的相似程度匙瘪,具有非負(fù)性铆铆、同一性、對(duì)稱性和三角不等式性質(zhì)丹喻。最常用的表示方法是閔可夫斯基距離(Minkowski distance)
\operatorname{dist}_{\mathrm{mk}}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left(\sum_{u=1}^{n}\left|x_{i u}-x_{j u}\right|^{p}\right)^{\frac{1}{p}}

當(dāng)p=2時(shí)薄货,即歐氏距離(Euclidean distance)
\operatorname{dist}_{\mathrm{ed}}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{2}=\sqrt{\sum_{u=1}^{n}\left|x_{i u}-x_{j u}\right|^{2}}

當(dāng)p=1時(shí),即曼哈頓距離(Manhattan distance)
\operatorname{dist}_{\operatorname{man}}\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right)=\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{1}=\sum_{u=1}^{n}\left|x_{i u}-x_{j u}\right|

另外碍论,聚類算法還包括密度聚類(如DBSCAN)谅猾、層次聚類(如AGNES)等,在此不予詳述鳍悠。

參考資料

[1] https://github.com/lawlite19/MachineLearning_Python
[2] 周志華 著. 機(jī)器學(xué)習(xí). 北京:清華大學(xué)出版社,2016
[3] 李航 著. 統(tǒng)計(jì)學(xué)習(xí)方法. 北京:清華大學(xué)出版社,2012
[4] 史春奇等 著. 機(jī)器學(xué)習(xí)算法背后的理論與優(yōu)化. 北京:清華大學(xué)出版社,2019
[5] Peter Harrington 著. 李銳等 譯. 機(jī)器學(xué)習(xí)實(shí)戰(zhàn). 北京:人民郵電出版社,2013

人生如逆旅税娜,我亦是行人 ——蘇軾《臨江仙·送錢穆父》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市藏研,隨后出現(xiàn)的幾起案子敬矩,更是在濱河造成了極大的恐慌,老刑警劉巖蠢挡,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧岳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡业踏,警方通過查閱死者的電腦和手機(jī)禽炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勤家,“玉大人瞎抛,你說我怎么就攤上這事∪唇簦” “怎么了桐臊?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晓殊。 經(jīng)常有香客問我断凶,道長(zhǎng),這世上最難降的妖魔是什么巫俺? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任认烁,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘却嗡。我一直安慰自己舶沛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布窗价。 她就那樣靜靜地躺著如庭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撼港。 梳的紋絲不亂的頭發(fā)上坪它,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音帝牡,去河邊找鬼往毡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛靶溜,可吹牛的內(nèi)容都是我干的开瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼罩息,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惩阶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扣汪,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤断楷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后崭别,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冬筒,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年茅主,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舞痰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诀姚,死狀恐怖响牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赫段,我是刑警寧澤呀打,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站糯笙,受9級(jí)特大地震影響贬丛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜给涕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一豺憔、第九天 我趴在偏房一處隱蔽的房頂上張望额获。 院中可真熱鬧,春花似錦恭应、人聲如沸抄邀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)境肾。三九已至,卻和暖如春褒纲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钥飞。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工莺掠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人读宙。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓彻秆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親结闸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唇兑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容