机器学习算法之 K-means、层次聚类,谱聚类
k-means 和層次聚類都屬于劃分聚類,實際中最常用的是k-means,k-means效果不好的情況下才會采用其他聚類
K-means算法
K-means算法,也稱為K-平均或者K-均值,是一種使用廣泛的最基礎(chǔ)的聚類算法
假設(shè)輸入樣本為T=X1,X2,…,Xm;則算法步驟為(使用歐幾里得距離公式):
- Step1:隨機選擇初始化的k個類別中心a1,a2,…ak;
- Step2:對于每個樣本Xi,將其標(biāo)記位距離類別中心aj最近的類別j
- 更新每個類別的中心點aj為隸屬該類別的所有樣本的均值,然后更新中心點
- 重復(fù)上面兩步操作,直到達(dá)到某個中止條件
中止條件:
迭代次數(shù)、最小平方誤差MSE(樣本到中心的距離平方和)、簇中心點變化率(結(jié)果相同)
算法執(zhí)行過程圖:
K-means算法:
記K個簇中心分別為???;每個簇的樣本數(shù)量為;
使用平方誤差作為目標(biāo)函數(shù)(使用歐幾里得距離),公式為:
要獲取最優(yōu)解,也就是目標(biāo)函數(shù)需要盡可能的小,對J函數(shù)求偏導(dǎo)數(shù),可以得到簇中心點a更新的公式為:
K-means中的問題
1、K-means算法在迭代的過程中使用所有點的均值作為新的質(zhì)點(中心點),如果簇中存在異常點,將導(dǎo)致均值偏差比較嚴(yán)重
比如一個簇中有2、4、6、8、100五個數(shù)據(jù),那么新的質(zhì)點為24,顯然這個質(zhì)點離絕大多數(shù)點都比較遠(yuǎn);在當(dāng)前情況下,使用中位數(shù)6可能比使用均值的想法更好,使用中位數(shù)的聚類方式叫做K-Mediods聚類(K中值聚類)
2、K-means算法是初值敏感(K值的給定和K個初始簇中心點的選擇)的,選擇不同的初始值可能導(dǎo)致不同的簇劃分規(guī)則
為了避免這種敏感性導(dǎo)致的最終結(jié)果異常性,可以采用初始化多套初始節(jié)點構(gòu)造不同的分類規(guī)則,然后選擇最優(yōu)的構(gòu)造規(guī)則
K-means算法的初值敏感示意圖
K-means算法優(yōu)缺點
缺點:
- K值是用戶給定的,在進(jìn)行數(shù)據(jù)處理前,K值是未知的,不同的K值得到的結(jié)果也不一樣;
- 對初始簇中心點是敏感的
- 不適合發(fā)現(xiàn)非凸形狀的簇或者大小差別較大的簇
- 特殊值(離群值)對模型的影響比較大
優(yōu)點:
- 理解容易,聚類效果不錯
- 處理大數(shù)據(jù)集的時候,該算法可以保證較好的伸縮性和高效率
- 當(dāng)簇近似高斯分布的時候,效果非常不錯
K-means案例
基于scikit包中的創(chuàng)建模擬數(shù)據(jù)的API創(chuàng)建聚類數(shù)據(jù),使用K-means算法對數(shù)據(jù)進(jìn)行分類操作,并獲得聚類中心點以及總的樣本簇中心點距離和值
二分K-Means
解決K-Means算法對初始簇心比較敏感的問題,二分K-Means算法是一種弱化初始質(zhì)心的一種算法,具體思路步驟如下:
- 將所有樣本數(shù)據(jù)作為一個簇放到一個隊列中。
- 從隊列中選擇一個簇進(jìn)行K-means算法劃分,劃分為兩個子簇,并將子簇添加到隊列中。
- 循環(huán)迭代第二步操作,直到中止條件達(dá)到(聚簇數(shù)量、最小平方誤差、迭代次數(shù)等)。
- 隊列中的簇就是最終的分類簇集合。
從隊列中選擇劃分聚簇的規(guī)則一般有兩種方式;分別如下:
- 對所有簇計算誤差和SSE(SSE也可以認(rèn)為是距離函數(shù)的一種變種),選擇SSE最大的聚簇進(jìn)行劃分操作(優(yōu)選這種策略)。
- ?選擇樣本數(shù)據(jù)量最多的簇進(jìn)行劃分操作。
K-Means++算法
解決K-Means算法對初始簇心比較敏感的問題,K-Means++算法和K-Means算法的區(qū)別主要在于初始的K個中心點的選擇方面,K-Means算法使用隨機給定的方式,K-Means++算法采用下列步驟給定K個初始質(zhì)點:
- STEP1:從數(shù)據(jù)集中任選一個節(jié)點作為第一個聚類中心
- STEP2:對數(shù)據(jù)集中的每個點x,計算x到所有已有聚類中心點的距離和D(X),D(x)比較大的點作為下一個簇的中心。
- STEP3:重復(fù)2和3直到k個聚類中心被選出來
- STEP4:利用這k個初始的聚類中心來運行標(biāo)準(zhǔn)的k-means算法
缺點:由于聚類中心點選擇過程中的內(nèi)在有序性,在擴(kuò)展方面存在著性能方面的問題(第k個聚類中心點的選擇依賴前k-1個聚類中心點的值)
K-Means||算法
解決K-Means++算法缺點而產(chǎn)生的一種算法;主要思路是改變每次遍歷時候的取樣規(guī)則,并非按照K-Means++算法每次遍歷只獲取一個樣本,而是每次獲取K個樣本,重復(fù)該取樣操作O(logn)次,然后再將這些抽樣出來的樣本聚類出K個點,最后使用這K個點作為K-Means算法的初始聚簇中心點。實踐證明:一般5次重復(fù)采用就可以保證一個比較好的聚簇中心點。
Canopy算法
Canopy算法屬于一種“粗”聚類算法,執(zhí)行速度較快,但精度較低,算法執(zhí)行步驟如下:
- 給定樣本列表以及先驗值???和?
- 從列表L中獲取一個節(jié)點P,計算P到所有聚簇中心點的距離(如果不存在聚簇中心,那么此時點P形成一個新的聚簇),并選擇出最小距離
- ?如果距離D小于??,表示該節(jié)點屬于該聚簇,添加到該聚簇列表中
- 如果距離D小于?,表示該節(jié)點不僅僅屬于該聚簇,還表示和當(dāng)前聚簇中心點非常近,所以將該聚簇的中心點設(shè)置為該簇中所有樣本的中心點,并將P從列表L中刪除
- 如果距離D大于,那么節(jié)點P形成一個新的聚簇,并將P從列表L中刪除
- 直到列表L中的元素數(shù)據(jù)不再有變化或者元素數(shù)量為0的時候,結(jié)束循環(huán)操作
Canopy算法得到的最終結(jié)果的值,聚簇之間是可能存在重疊的,但是不會存在某個對象不屬于任何聚簇的情況
Canopy算法過程圖形說明
Canopy算法常用應(yīng)用場景
由于K-Means算法存在初始聚簇中心點敏感的問題,常用使用Canopy+K-Means算法混合形式進(jìn)行模型構(gòu)建
先使用canopy算法進(jìn)行“粗”聚類得到K個聚類中心點
K-Means算法使用Canopy算法得到的K個聚類中心點作為初始中心點,進(jìn)行“細(xì)”聚類
優(yōu)點:
- 執(zhí)行速度快(先進(jìn)行了一次聚簇中心點選擇的預(yù)處理)
- 不需要給定K值,應(yīng)用場景多
- 能夠緩解K-Means算法對于初始聚類中心點敏感的問題
Mini Batch K-Means算法
Mini Batch K-Means算法是K-Means算法的一種優(yōu)化變種,采用小規(guī)模的數(shù)據(jù)子集(每次訓(xùn)練使用的數(shù)據(jù)集是在訓(xùn)練算法的時候隨機抽取的數(shù)據(jù)子集)減少計算時間,同時試圖優(yōu)化目標(biāo)函數(shù);Mini Batch K-Means算法可以減少K-Means算法的收斂時間,而且產(chǎn)生的結(jié)果效果只是略差于標(biāo)準(zhǔn)K-Means算法
算法步驟如下:
K-Means和Mini Batch K-Means算法比較案例
基于scikit包中的創(chuàng)建模擬數(shù)據(jù)的API創(chuàng)建聚類數(shù)據(jù),使用K-means算法和MiniBatch K-Means算法對數(shù)據(jù)進(jìn)行分類操作,比較這兩種算法的聚類效果以及聚類的消耗時間長度
聚類算法的衡量指標(biāo)
均一性(類似正確率)
一個簇中只包含一個類別的樣本,則滿足均一性;其實也可以認(rèn)為就是正確率(每個聚簇中正確分類的樣本數(shù)占該聚簇總樣本數(shù)的比例和)
完整性(類似召回率)
同類別樣本被歸類到相同簇中,則滿足完整性;每個聚簇中正確分類的樣本數(shù)占該類型的總樣本數(shù)比例的和。
V-measure均一性和完整性的加權(quán)平均
調(diào)整蘭德系數(shù)(ARI)
Rand index(蘭德指數(shù))(RI),RI取值范圍為[0,1],值越大意味著聚類結(jié)果與真實情況越吻合。
其中C表示實際類別信息,K表示聚類結(jié)果,a表示在C與K中都是同類別的元素對數(shù)(也就是行),b表示在C與K中都是不同類別的元素對數(shù)(也就是列),表示數(shù)據(jù)集中可以組成的對數(shù),即從樣本中取兩個.
調(diào)整蘭德系數(shù)(ARI,Adjusted Rnd Index),ARI取值范圍[-1,1],值越大,表示聚類結(jié)果和真實情況越吻合。從廣義的角度來將,ARI是衡量兩個數(shù)據(jù)分布的吻合程度的。
? ? E[RI]表示均值
調(diào)整互信息(AMI)
調(diào)整互信息(AMI,Adjusted Mutual Information),類似ARI,內(nèi)部使用信息熵?? ?
?
S 表示整個數(shù)據(jù)集,U 表示整個預(yù)測的數(shù)據(jù)集,V?實際數(shù)據(jù)集(y值),C 表示原始的,R?表示預(yù)測的。一個樣本只屬于一個簇,所以?;一個樣本只能預(yù)測出一種結(jié)果,所以?,,表示實際和預(yù)測是相同的個數(shù).
聚類算法的衡量指標(biāo)-輪廓系數(shù)
簇內(nèi)不相似度:計算樣本i到同簇其它樣本的平均距離為??;??越小,表示樣本i越應(yīng)該被聚類到該簇,簇C中的所有樣本的??的均值被稱為簇C的簇不相似度。
簇間不相似度:計算樣本i到其它簇?? 的所有樣本的平均距離?越大,表示樣本i越不屬于其它簇。
輪廓系數(shù):??值越接近1表示樣本i聚類越合理,越接近-1,表示樣本i應(yīng)該分類到另外的簇中,近似為0,表示樣本i應(yīng)該在邊界上;所有樣本的?的均值被稱為聚類結(jié)果的輪廓系數(shù)
?
層次聚類方法
層次聚類方法對給定的數(shù)據(jù)集進(jìn)行層次的分解或者合并,直到滿足某種條件為止,傳統(tǒng)的層次聚類算法主要分為兩大類算法:
凝聚的層次聚類:AGNES算法(AGglomerative NESting)—>采用自底向上的策略。最初將每個對象作為一個簇,然后這些簇根據(jù)某些準(zhǔn)則被一步一步合并,兩個簇間的距離可以由這兩個不同簇中距離最近的數(shù)據(jù)點的相似度來確定,聚類的合并過程反復(fù)進(jìn)行直到所有的對象滿足簇數(shù)目。
分裂的層次聚類:DIANA算法(DIvisive ANALysis)—>采用自頂向下的策略。首先將所有對象置于一個簇中,然后按照某種既定的規(guī)則逐漸細(xì)分為越來越小的簇(比如最大的歐式距離),直到達(dá)到某個終結(jié)條件(簇數(shù)目或者簇距離達(dá)到閾值)。
AGNES和DIANA算法優(yōu)缺點
- 簡單,理解容易
- 合并點/分裂點選擇不太容易
- 合并/分裂的操作不能進(jìn)行撤銷
- 大數(shù)據(jù)集不太適合(數(shù)據(jù)量大到內(nèi)存中放不下)
- 執(zhí)行效率較低O(t*n2),t為迭代次數(shù),n為樣本點數(shù)
AGNES算法中簇間距離
最小距離(SL聚類)
? ? 兩個聚簇中最近的兩個樣本之間的距離(single/word-linkage聚類法)
? ? 最終得到模型容易形成鏈?zhǔn)浇Y(jié)構(gòu)
最大距離(CL聚類)
? ? 兩個聚簇中最遠(yuǎn)的兩個樣本的距離(complete-linkage聚類法)
? ? 如果存在異常值,那么構(gòu)建可能不太穩(wěn)定
平均距離(AL聚類)
? ? 兩個聚簇中樣本間兩兩距離的平均值(average-linkage聚類法)
? ? 兩個聚簇中樣本間兩兩距離的中值(median-linkage聚類法)
層次聚類優(yōu)化算法
BIRCH算法(平衡迭代削減聚類法)(重要):聚類特征使用3元組進(jìn)行一個簇的相關(guān)信息,通過構(gòu)建滿足分枝因子和簇直徑限制的聚類特征樹來求聚類,聚類特征樹其實是一個具有兩個參數(shù)分枝因子和類直徑的高度平衡樹;分枝因子規(guī)定了樹的每個節(jié)點的子女的最多個數(shù),而類直徑體現(xiàn)了對這一類點的距離范圍;非葉子節(jié)點為它子女的最大特征值;聚類特征樹的構(gòu)建可以是動態(tài)過程的,可以隨時根據(jù)數(shù)據(jù)對模型進(jìn)行更新操作。
優(yōu)缺點:
- 適合大規(guī)模數(shù)據(jù)集,線性效率;
- 只適合分布呈凸形或者球形的數(shù)據(jù)集、需要給定聚類個數(shù)和簇之間的相關(guān)參數(shù)。
CURE算法(使用代表點的聚類法):該算法先把每個數(shù)據(jù)點看成一類,然后合并距離最近的類直至類個數(shù)為所要求的個數(shù)為止。但是和AGNES算法的區(qū)別是:取消了使用所有點或用中心點+距離來表示一個類,而是從每個類中抽取固定數(shù)量、分布較好的點作為此類的代表點,并將這些代表點乘以一個適當(dāng)?shù)氖湛s因子,使它們更加靠近類中心點。代表點的收縮特性可以調(diào)整模型可以匹配那些非球形的場景,而且收縮因子的使用可以減少噪音對聚類的影響。
優(yōu)缺點:
- 能夠處理非球形分布的應(yīng)用場景。
- 采用隨機抽樣和分區(qū)的方式可以提高算法的執(zhí)行效率。
BRICH算法案例
密度聚類
密度聚類方法的指導(dǎo)思想: 只要樣本點的密度大于某個閾值,則將該樣本添加到最近的簇中。
這類算法可以克服基于距離的算法只能發(fā)現(xiàn)凸聚類的缺點,可以發(fā)現(xiàn)任意形狀的聚類,而且對噪聲數(shù)據(jù)不敏感。
計算復(fù)雜度高,計算量大。
常用算法:DBSCAN、密度最大值算法
DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
一個比較有代表性的基于密度的聚類算法,相比于基于劃分的聚類方法和層次聚類方法,DBSCAN算法將簇定義為密度相連的點的最大集合,能夠?qū)⒆銐蚋呙芏鹊膮^(qū)域劃分為簇,并且在具有噪聲的空間數(shù)據(jù)商能夠發(fā)現(xiàn)任意形狀的簇。
DBSCAN算法的核心思想是:用一個點的ε鄰域內(nèi)的鄰居點數(shù)衡量該點所在空間的密度,該算法可以找出形狀不規(guī)則的cluster,而且聚類的時候事先不需要給定cluster的數(shù)量。
基本概念
ε鄰域(ε neighborhood,也稱為Eps):給定對象在半徑ε內(nèi)的區(qū)域。
密度(density):ε鄰域中x的密度,是一個整數(shù)值,依賴于半徑ε。
MinPts定義核心點時的閾值,也簡記為M。
核心點(core point):如果 p(x)>=M ,那么稱 x 為 X 的核心點;記由X中所有核心點構(gòu)成的集合為Xc,并記Xnc=X\Xc表示由X中所有非核心點構(gòu)成的集合。直白來講,核心點對應(yīng)于稠密區(qū)域內(nèi)部的點。
邊界點(border point): 如果非核心點x的ε鄰域中存在核心點,那么認(rèn)為x為X的邊界點。由X中所有的邊界點構(gòu)成的集合為Xbd。邊界點對應(yīng)稠密區(qū)域邊緣的點。
噪音點(noise point):集合中除了邊界點和核心點之外的點都是噪音點,所有噪音點組成的集合叫做Xnoi;,噪音點對應(yīng)稀疏區(qū)域的點。
直接密度可達(dá)(directly density-reachable):給定一個對象集合X,如果y是在x的ε鄰域內(nèi),而且x是一個核心對象,可以說對象y從對象x出發(fā)是直接密度可達(dá)的。
密度可達(dá)(density-reachable):如果存在一個對象鏈p1,p2…pm,如果滿足pi+1是從pi直接密度可達(dá)的,那么稱p1是從p1密度可達(dá)的。
密度相連(density-connected):在集合X中,如果存在一個對象o,使得對象x和y是從o關(guān)于ε和m密度可達(dá)的,那么對象x和y是關(guān)于ε和m密度相連的。
簇(cluster):一個基于密度的簇是最大的密度相連對象的集合C;滿足以下兩個條件:
- Maximality:若x屬于C,而且y是從x密度可達(dá)的,那么y也屬于C。
- Connectivity:若x屬于C,y也屬于C,則x和y是密度相連的。
算法流程
- 如果一個點x的ε鄰域包含多余m個對象,則創(chuàng)建一個x作為核心對象的新簇;
- 尋找并合并核心對象直接密度可達(dá)的對象;
- 沒有新點可以更新簇的時候,算法結(jié)束。
算法特征描述:
- 每個簇至少包含一個核心對象。
- 非核心對象可以是簇的一部分,構(gòu)成簇的邊緣。
- ·包含過少對象的簇被認(rèn)為是噪聲。
DBSCAN算法總結(jié)
優(yōu)點:
- 不需要事先給定cluster的數(shù)目
- 可以發(fā)現(xiàn)任意形狀的cluster
- 能夠找出數(shù)據(jù)中的噪音,且對噪音不敏感
- 算法只需要兩個輸入?yún)?shù)
- 聚類結(jié)果幾乎不依賴節(jié)點的遍歷順序
缺點:
- DBSCAN算法聚類效果依賴距離公式的選取,最常用的距離公式為歐幾里得距離。但是對于高維數(shù)據(jù),由于維數(shù)太多,距離的度量已變得不是那么重要。
- DBSCAN算法不適合數(shù)據(jù)集中密度差異很小的情況。
密度最大值聚類算法(MDCA)
MDCA(Maximum Density Clustering Application)算法基于密度的思想引入劃分聚類中,使用密度而不是初始點作為考察簇歸屬情況的依據(jù),能夠自動確定簇數(shù)量并發(fā)現(xiàn)任意形狀的簇;另外MDCA一般不保留噪聲,因此也避免了閾值選擇不當(dāng)情況下造成的對象丟棄情況。
MDCA算法的基本思路是尋找最高密度的對象和它所在的稠密區(qū)域;MDCA算法在原理上來講,和密度的定義沒有關(guān)系,采用任意一種密度定義公式均可,一般情況下采用DBSCAN算法中的密度定義方式。
MDCA相關(guān)概念
最大密度點:
有序序列: 根據(jù)所有對象與pmax的距離對數(shù)據(jù)重新排序:
密度閾值density0;當(dāng)節(jié)點的密度值大于密度閾值的時候,認(rèn)為該節(jié)點屬于一個比較固定的簇,在第一次構(gòu)建基本簇的時候,就將這些節(jié)點添加到對應(yīng)簇中,如果小于這個值的時候,暫時認(rèn)為該節(jié)點為噪聲節(jié)點。
簇間距離:對于兩個簇C1和C2之間的距離,采用兩個簇中最近兩個節(jié)點之間的距離作為簇間距離。
聚簇距離閾值dist0:當(dāng)兩個簇的簇間距離小于給定閾值的時候,這兩個簇的結(jié)果數(shù)據(jù)會進(jìn)行合并操作。
M值:初始簇中最多數(shù)據(jù)樣本個數(shù)。
算法流程
MDCA算法聚類過程步驟如下:
將數(shù)據(jù)集劃分為基本簇;
- 對數(shù)據(jù)集X選取最大密度點Pmax,形成以最大密度點為核心的新簇Ci,按照距離排序計算出序列Spmax,對序列的前M個樣本數(shù)據(jù)進(jìn)行循環(huán)判斷,如果節(jié)點的密度大于等于density0,那么將當(dāng)前節(jié)點添加Ci中;
- 循環(huán)處理剩下的數(shù)據(jù)集X,選擇最大密度點Pmax,并構(gòu)建基本簇Ci+1,直到X中剩余的樣本數(shù)據(jù)的密度均小于density0。
使用凝聚層次聚類的思想,合并較近的基本簇,得到最終的簇劃分;
- 在所有簇中選擇距離最近的兩個簇進(jìn)行合并,合并要求是:簇間距小于等于dist0,如果所有簇中沒有簇間距小于dist0的時候,結(jié)束合并操作
處理剩余節(jié)點,歸入最近的簇。
- 最常用、最簡單的方式是:將剩余樣本對象歸入到最近的簇。
密度聚類算法案例
譜聚類
譜聚類是基于譜圖理論基礎(chǔ)上的一種聚類方法,與傳統(tǒng)的聚類方法相比:具有在任意形狀的樣本空間上聚類并且收斂于全局最優(yōu)解的優(yōu)點。
通過對樣本數(shù)據(jù)的拉普拉斯矩陣的特征向量進(jìn)行聚類,從而達(dá)到對樣本數(shù)據(jù)進(jìn)行聚類的目的;其本質(zhì)是將聚類問題轉(zhuǎn)換為圖的最優(yōu)劃分問題,是一種點對聚類算法。
譜聚類算法將數(shù)據(jù)集中的每個對象看做圖的頂點V,將頂點間的相似度量化為相應(yīng)頂點連接邊E的權(quán)值w,這樣就構(gòu)成了一個基于相似度的無向加權(quán)圖G(V,E),于是聚類問題就轉(zhuǎn)換為圖的劃分問題。基于圖的最優(yōu)劃分規(guī)則就是子圖內(nèi)的相似度最大,子圖間的相似度最小。
譜聚類的構(gòu)建
譜聚類的構(gòu)建過程主要包含以下幾個步驟:
- 構(gòu)建表示對象相似度的矩陣W。
- 構(gòu)建度矩陣D(對角矩陣)。
- 構(gòu)建拉普拉斯矩陣L。
- 計算矩陣L的前k個特征值的特征向量(k個列向量)。
- 將k個列向量組成矩陣U。
- 對矩陣U中的n行數(shù)據(jù)利用K-means或其它經(jīng)典聚類算法進(jìn)行聚類得出最終結(jié)果。
應(yīng)用場景及存在的問題
應(yīng)用場景:圖形聚類、計算機視覺、非凸球形數(shù)據(jù)聚類等。
存在的問題:
- 相似度矩陣的構(gòu)建問題:業(yè)界一般使用高斯相似函數(shù)或者k近鄰來作為相似度量,一般建議 使用k近鄰的方式來計算相似度權(quán)值。
- 聚類數(shù)目的給定。
- 如何選擇特征向量。
- 如何提高譜聚類的執(zhí)行效率。
譜聚類應(yīng)用案例
總結(jié)
以上是生活随笔為你收集整理的机器学习算法之 K-means、层次聚类,谱聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维条码 PDF417 zxing-cp
- 下一篇: android studio日记本源代码