【聚类算法】常见聚类算法总结
轉(zhuǎn)自:https://blog.csdn.net/u010062386/article/details/82499777
感謝博主
1.常見算法
1.原型聚類
“原型”是指樣本空間中具有代表性的店。此類算法假設(shè)聚類結(jié)構(gòu)能夠通過一組原型刻畫,通常情形下,算法先對(duì)原型進(jìn)行初始化,然后對(duì)原型進(jìn)行迭代更新求解。–西瓜書
(1).K均值聚類(K-Means)
給定樣本集D={x1,x2,..xn},K均值算法針對(duì)聚類所得簇劃分C={C1,C2,..CK}最小化平方誤差,采用的貪心算法來迭代優(yōu)化求解近似解。
E=∑i=1k∑x∈Ci∥x?μi∥22E=∑i=1k∑x∈Ci‖x?μi‖22
在基本術(shù)語(yǔ)中,算法有三個(gè)步驟。第一步選擇初始質(zhì)心,最基本的方法是?從數(shù)據(jù)集中選擇樣本 X。初始化之后,K-means包括在其他兩個(gè)步驟之間循環(huán)。第一步將每個(gè)樣品分配到最近的質(zhì)心。第二步通過獲取分配給每個(gè)先前質(zhì)心的所有樣本的平均值來創(chuàng)建新質(zhì)心。計(jì)算舊的和新的質(zhì)心之間的差異,并且算法重復(fù)這最后兩個(gè)步驟,直到該值小于閾值。換句話說,它重復(fù)直到質(zhì)心不顯著移動(dòng)。
sklearn的實(shí)現(xiàn):
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)sklearn.cluster.KMeans(n_clusters=8,init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')參數(shù)的意義:n_clusters:簇的個(gè)數(shù),即你想聚成幾類 init: 初始簇中心的獲取方法 n_init: 獲取初始簇中心的更迭次數(shù),為了彌補(bǔ)初始質(zhì)心的影響,算法默認(rèn)會(huì)初始10次質(zhì)心,實(shí)現(xiàn)算法,然后返回最好的結(jié)果。 max_iter: 最大迭代次數(shù)(因?yàn)閗means算法的實(shí)現(xiàn)需要迭代) tol: 容忍度,即kmeans運(yùn)行準(zhǔn)則收斂的條件 precompute_distances:是否需要提前計(jì)算距離,這個(gè)參數(shù)會(huì)在空間和時(shí)間之間做權(quán)衡,如果是True 會(huì)把整個(gè)距離矩陣都放到內(nèi)存中,auto 會(huì)默認(rèn)在數(shù)據(jù)樣本大于featurs*samples 的數(shù)量大于12e6 的時(shí)候False,False 時(shí)核心實(shí)現(xiàn)的方法是利用Cpython 來實(shí)現(xiàn)的 verbose: 冗長(zhǎng)模式(不太懂是啥意思,反正一般不去改默認(rèn)值) random_state: 隨機(jī)生成簇中心的狀態(tài)條件。 copy_x: 對(duì)是否修改數(shù)據(jù)的一個(gè)標(biāo)記,如果True,即復(fù)制了就不會(huì)修改數(shù)據(jù)。bool 在scikit-learn 很多接口中都會(huì)有這個(gè)參數(shù)的,就是是否對(duì)輸入數(shù)據(jù)繼續(xù)copy 操作,以便不修改用戶的輸入數(shù)據(jù)。這個(gè)要理解Python 的內(nèi)存機(jī)制才會(huì)比較清楚。 n_jobs: 并行設(shè)置 algorithm: kmeans的實(shí)現(xiàn)算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式實(shí)現(xiàn)- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
優(yōu)點(diǎn)
缺點(diǎn)、
- 需要事先確定分類的簇?cái)?shù),即k值。
- 采用迭代方法,得到的結(jié)果只是局部最優(yōu)。
- 對(duì)初始值的選取比較敏感。(改進(jìn)1:k-means++(sklearn已經(jīng)添加該參數(shù)的取值);改進(jìn)2:二分K-means)
- 當(dāng)數(shù)據(jù)量非常大時(shí),算法的時(shí)間開銷是非常大的(改進(jìn):Mini Batch K-Means(精確度會(huì)降低,在可接受的范圍即可));
- 若簇中含有異常點(diǎn),將導(dǎo)致均值偏離嚴(yán)重,對(duì)噪聲和孤立點(diǎn)數(shù)據(jù)敏感(改進(jìn)1:離群點(diǎn)檢測(cè)的LOF算法,通過去除離群點(diǎn)后再聚類,可以減少離群點(diǎn)和孤立點(diǎn)對(duì)于聚類效果的影響;改進(jìn)2:改成求點(diǎn)的中位數(shù),這種聚類方式即K-Mediods聚類(K中值));
- 對(duì)于不是凸的數(shù)據(jù)集比較難收斂(改進(jìn):基于密度的聚類算法更加適合,比如DESCAN算法)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
優(yōu)點(diǎn):
缺點(diǎn):
1)如果樣本集的密度不均勻、聚類間距差相差很大時(shí),聚類質(zhì)量較差,這時(shí)用DBSCAN聚類一般不適合。
2) 如果樣本集較大時(shí),聚類收斂時(shí)間較長(zhǎng),此時(shí)可以對(duì)搜索最近鄰時(shí)建立的KD樹或者球樹進(jìn)行規(guī)模限制來改進(jìn)。
3) 調(diào)參相對(duì)于傳統(tǒng)的K-Means之類的聚類算法稍復(fù)雜,主要需要對(duì)距離閾值?,鄰域樣本數(shù)閾值MinPts聯(lián)合調(diào)參,不同的參數(shù)組合對(duì)最后的聚類效果有較大影響。
(1).Mean-Shift
Mean shift 算法是基于核密度估計(jì)的爬山算法
(Meanshift算法實(shí)際是一個(gè)自適應(yīng)的梯度上升搜索峰值的算法)自己理解:
對(duì)于樣本點(diǎn),給定一個(gè)半徑r,首先隨機(jī)選擇一個(gè)樣本,計(jì)算以這個(gè)點(diǎn)為圓心,落在r為半徑的圓內(nèi)的樣本點(diǎn),然后計(jì)算這些樣本點(diǎn)到圓心的向量和,該向量和為一個(gè)均值偏移,圓心加上這個(gè)向量和更新為新的圓心,即圓朝著這個(gè)均值方向進(jìn)行移動(dòng)。重復(fù)該步驟,直到圓心不在移動(dòng),標(biāo)記為一類。如果新類和已有類的中心距離小于半徑,則合并。重復(fù)操作,直到每個(gè)點(diǎn)都被標(biāo)記,最后把該點(diǎn)歸為被某個(gè)簇標(biāo)記次數(shù)最多的類。
假設(shè)在一個(gè)多維空間中有很多數(shù)據(jù)點(diǎn)需要進(jìn)行聚類,Mean Shift的過程如下:
1、在未被標(biāo)記的數(shù)據(jù)點(diǎn)中隨機(jī)選擇一個(gè)點(diǎn)作為中心center;
2、找出離center距離在bandwidth之內(nèi)的所有點(diǎn),記做集合M,認(rèn)為這些點(diǎn)屬于簇c。同時(shí),把這些求內(nèi)點(diǎn)屬于這個(gè)類的概率加1,這個(gè)參數(shù)將用于最后步驟的分類
3、以center為中心點(diǎn),計(jì)算從center開始到集合M中每個(gè)元素的向量,將這些向量相加,得到向量shift。
4、center = center+shift。即center沿著shift的方向移動(dòng),移動(dòng)距離是||shift||。
5、重復(fù)步驟2、3、4,直到shift的大小很小(就是迭代到收斂),記住此時(shí)的center。注意,這個(gè)迭代過程中遇到的點(diǎn)都應(yīng)該歸類到簇c。
6、如果收斂時(shí)當(dāng)前簇c的center與其它已經(jīng)存在的簇c2中心的距離小于閾值,那么把c2和c合并。否則,把c作為新的聚類,增加1類。
6、重復(fù)1、2、3、4、5直到所有的點(diǎn)都被標(biāo)記訪問。
7、分類:根據(jù)每個(gè)類,對(duì)每個(gè)點(diǎn)的訪問頻率,取訪問頻率最大的那個(gè)類,作為當(dāng)前點(diǎn)集的所屬類。
簡(jiǎn)單的說,mean shift就是沿著密度上升的方向?qū)ふ彝瑢僖粋€(gè)簇的數(shù)據(jù)點(diǎn)。
加入核函數(shù)的漂移向量
核函數(shù)的作用,就是把一個(gè)高維空間映射到一個(gè)低維空間,使之線性可分。
給向量加上了一個(gè)權(quán)重?Mean-Shift小結(jié)
meanshift方法適合概率密度函數(shù)有極值且在某一局部區(qū)域內(nèi)唯一,即選擇的特征數(shù)據(jù)點(diǎn)能夠較為明顯的判定目標(biāo),亦即顯著特征點(diǎn)。meanshift的基本形式不適合等概率特征點(diǎn),即特征點(diǎn)是均勻分布的情況。
優(yōu)點(diǎn):
1.不用事先確定分類的個(gè)數(shù)
2.計(jì)算較為簡(jiǎn)便,對(duì)數(shù)據(jù)中的異常點(diǎn)不敏感。
3.適用于追蹤或者圖像分割
缺點(diǎn):
1.受初始值影響較大2.算法收斂的速度和程度,很大程度上和選取的窗口有關(guān)
sklearn實(shí)現(xiàn):
class sklearn.cluster.MeanShift(bandwidth=None, seeds=None, bin_seeding=False, min_bin_freq=1, cluster_all=True, n_jobs=1)[source]- 1
- 2
- 3
- 4
- 5
- 6
- 7
3.層次聚類
層次聚類試圖在不同的層次上對(duì)數(shù)據(jù)集記性劃分,從而形成樹形的聚類結(jié)構(gòu)。–西瓜書
(1).AGNES
是一種自底向上聚合策略的層次聚類算法。他先將數(shù)據(jù)集中的每個(gè)樣本看做是一個(gè)廚師聚類簇,然后在算法運(yùn)行的每一步中找出距離最近的兩個(gè)聚類簇進(jìn)行合并。該過程不斷重復(fù),直至達(dá)到預(yù)設(shè)的聚類簇個(gè)數(shù)。
如何計(jì)算簇之間的距離。實(shí)際上每個(gè)簇是一個(gè)樣本集合,因此采用關(guān)于聚合的某種距離即可。
單鏈接算法:(最小距離)兩個(gè)簇中距離最近的樣本的距離
全鏈接算法:(最大距離)兩個(gè)簇中距離最遠(yuǎn)的樣本的距離
均鏈接算法:(平均距離)兩個(gè)簇中每?jī)蓚€(gè)樣本之間的距離相加求平均的距離
算法流程:
優(yōu)點(diǎn):
1,距離和規(guī)則的相似度容易定義,限制少;
2,不需要預(yù)先制定聚類數(shù);
3,可以發(fā)現(xiàn)類的層次關(guān)系;
4,可以聚類成其它形狀缺點(diǎn):
1,計(jì)算復(fù)雜度太高;
2,奇異值也能產(chǎn)生很大影響;
3,算法很可能聚類成鏈狀
(2).BIRCH
BIRCH算法比較適合于數(shù)據(jù)量大,類別數(shù)K也比較多的情況。它運(yùn)行速度很快,只需要單遍掃描數(shù)據(jù)集就能進(jìn)行聚類。BIRCH算法是個(gè)樹形結(jié)構(gòu),這顆樹的每一個(gè)節(jié)點(diǎn)是由若干個(gè)聚類特征(Clustering Feature,簡(jiǎn)稱CF)組成。一個(gè)聚類特征CF是這樣定義的:每一個(gè)CF是一個(gè)三元組,可以用(N,LS,SS)表示。其中N代表了這個(gè)CF中擁有的樣本點(diǎn)的數(shù)量,這個(gè)好理解;LS代表了這個(gè)CF中擁有的樣本點(diǎn)各特征維度的和向量,SS代表了這個(gè)CF中擁有的樣本點(diǎn)各特征維度的平方和。
CF有一個(gè)很好的性質(zhì),就是滿足線性關(guān)系,也就是CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)。如果把這個(gè)性質(zhì)放在CF Tree上,也就是說,在CF Tree中,對(duì)于每個(gè)父節(jié)點(diǎn)中的CF節(jié)點(diǎn),它的(N,LS,SS)三元組的值等于這個(gè)CF節(jié)點(diǎn)所指向的所有子節(jié)點(diǎn)的三元組之和。對(duì)于CF Tree,我們一般有幾個(gè)重要參數(shù),第一個(gè)參數(shù)是每個(gè)內(nèi)部節(jié)點(diǎn)的最大CF數(shù)B,第二個(gè)參數(shù)是每個(gè)葉子節(jié)點(diǎn)的最大CF數(shù)L,第三個(gè)參數(shù)是針對(duì)葉子節(jié)點(diǎn)中某個(gè)CF中的樣本點(diǎn)來說的,它是葉節(jié)點(diǎn)每個(gè)CF的最大樣本半徑閾值T,也就是說,在這個(gè)CF中的所有樣本點(diǎn)一定要在半徑小于T的一個(gè)超球體內(nèi)。
聚類特征樹CF Tree的生成
自己的理解:
先將第一個(gè)點(diǎn)加入進(jìn)去,成為樹的一個(gè)節(jié)點(diǎn),再把第二個(gè)點(diǎn)加進(jìn)去,如果第二個(gè)點(diǎn)在以第一個(gè)點(diǎn)為球心的求體內(nèi),則加入,然后依舊加入點(diǎn),如果所有點(diǎn)都在一個(gè)球體內(nèi),則作為一個(gè)節(jié)點(diǎn),如果不在,則新建立一個(gè)節(jié)點(diǎn),放入新點(diǎn)。如果該節(jié)點(diǎn)內(nèi)的樣本超過了設(shè)定的閾值,則對(duì)該節(jié)點(diǎn)進(jìn)行分裂,把該求體內(nèi)距離最遠(yuǎn)的兩個(gè)點(diǎn)分開分別作為新的節(jié)點(diǎn),然后計(jì)算剩下的點(diǎn)到哪個(gè)節(jié)點(diǎn)的距離近就分到那邊的節(jié)點(diǎn)里去。如果在分裂的時(shí)候發(fā)現(xiàn)父節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù)也達(dá)到了設(shè)定的閾值,則按照上面的分裂步驟,先把該層的節(jié)點(diǎn)進(jìn)行分裂。然后再進(jìn)行下一步的構(gòu)建。
總結(jié)下CF Tree的插入:
1. 從根節(jié)點(diǎn)向下尋找和新樣本距離最近的葉子節(jié)點(diǎn)和葉子節(jié)點(diǎn)里最近的CF節(jié)點(diǎn)
2. 如果新樣本加入后,這個(gè)CF節(jié)點(diǎn)對(duì)應(yīng)的超球體半徑仍然滿足小于閾值T,則更新路徑上所有的CF三元組,插入結(jié)束。否則轉(zhuǎn)入3.
3. 如果當(dāng)前葉子節(jié)點(diǎn)的CF節(jié)點(diǎn)個(gè)數(shù)小于閾值L,則創(chuàng)建一個(gè)新的CF節(jié)點(diǎn),放入新樣本,將新的CF節(jié)點(diǎn)放入這個(gè)葉子節(jié)點(diǎn),更新路徑上所有的CF三元組,插入結(jié)束。否則轉(zhuǎn)入4。
4.將當(dāng)前葉子節(jié)點(diǎn)劃分為兩個(gè)新葉子節(jié)點(diǎn),選擇舊葉子節(jié)點(diǎn)中所有CF元組里超球體距離最遠(yuǎn)的兩個(gè)CF元組,分布作為兩個(gè)新葉子節(jié)點(diǎn)的第一個(gè)CF節(jié)點(diǎn)。將其他元組和新樣本元組按照距離遠(yuǎn)近原則放入對(duì)應(yīng)的葉子節(jié)點(diǎn)。依次向上檢查父節(jié)點(diǎn)是否也要分裂,如果需要按和葉子節(jié)點(diǎn)分裂方式相同。
將所有的訓(xùn)練集樣本建立了CF Tree,一個(gè)基本的BIRCH算法就完成了,對(duì)應(yīng)的輸出就是若干個(gè)CF節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)里的樣本點(diǎn)就是一個(gè)聚類的簇。也就是說BIRCH算法的主要過程,就是建立CF Tree的過程。
真實(shí)的BIRCH算法除了建立CF Tree來聚類,其實(shí)還有一些可選的算法步驟的,現(xiàn)在我們就來看看 BIRCH算法的流程。1) 將所有的樣本依次讀入,在內(nèi)存中建立一顆CF Tree, 建立的方法參考上一節(jié)。
2)(可選)將第一步建立的CF Tree進(jìn)行篩選,去除一些異常CF節(jié)點(diǎn),這些節(jié)點(diǎn)一般里面的樣本點(diǎn)很少。對(duì)于一些超球體距離非常近的元組進(jìn)行合并
3)(可選)利用其它的一些聚類算法比如K-Means對(duì)所有的CF元組進(jìn)行聚類,得到一顆比較好的CF Tree.這一步的主要目的是消除由于樣本讀入順序?qū)е碌牟缓侠淼臉浣Y(jié)構(gòu),以及一些由于節(jié)點(diǎn)CF個(gè)數(shù)限制導(dǎo)致的樹結(jié)構(gòu)分裂。
4)(可選)利用第三步生成的CF Tree的所有CF節(jié)點(diǎn)的質(zhì)心,作為初始質(zhì)心點(diǎn),對(duì)所有的樣本點(diǎn)按距離遠(yuǎn)近進(jìn)行聚類。這樣進(jìn)一步減少了由于CF Tree的一些限制導(dǎo)致的聚類不合理的情況。
BIRCH算法小結(jié)
BIRCH算法可以不用輸入類別數(shù)K值,這點(diǎn)和K-Means,Mini Batch K-Means不同。如果不輸入K值,則最后的CF元組的組數(shù)即為最終的K,否則會(huì)按照輸入的K值對(duì)CF元組按距離大小進(jìn)行合并。
一般來說,BIRCH算法適用于樣本量較大的情況,這點(diǎn)和Mini Batch K-Means類似,但是BIRCH適用于類別數(shù)比較大的情況,而Mini Batch K-Means一般用于類別數(shù)適中或者較少的時(shí)候。BIRCH除了聚類還可以額外做一些異常點(diǎn)檢測(cè)和數(shù)據(jù)初步按類別規(guī)約的預(yù)處理。但是如果數(shù)據(jù)特征的維度非常大,比如大于20,則BIRCH不太適合,此時(shí)Mini Batch K-Means的表現(xiàn)較好。
對(duì)于調(diào)參,BIRCH要比K-Means,Mini Batch K-Means復(fù)雜,因?yàn)樗枰獙?duì)CF Tree的幾個(gè)關(guān)鍵的參數(shù)進(jìn)行調(diào)參,這幾個(gè)參數(shù)對(duì)CF Tree的最終形式影響很大。
最后總結(jié)下BIRCH算法的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)有:
1) 節(jié)約內(nèi)存,所有的樣本都在磁盤上,CF Tree僅僅存了CF節(jié)點(diǎn)和對(duì)應(yīng)的指針。
2) 聚類速度快,只需要一遍掃描訓(xùn)練集就可以建立CF Tree,CF Tree的增刪改都很快。
3) 可以識(shí)別噪音點(diǎn),還可以對(duì)數(shù)據(jù)集進(jìn)行初步分類的預(yù)處理
4)如果需要減少數(shù)據(jù)實(shí)例的數(shù)量,或者如果想要將大量子群集作為預(yù)處理步驟或其他方式,則Birch比MiniBatchKMeans更有用。
缺點(diǎn)有:
1) 由于CF Tree對(duì)每個(gè)節(jié)點(diǎn)的CF個(gè)數(shù)有限制,導(dǎo)致聚類的結(jié)果可能和真實(shí)的類別分布不同.
2) 對(duì)高維特征的數(shù)據(jù)聚類效果不好。此時(shí)可以選擇Mini Batch K-Means.根據(jù)經(jīng)驗(yàn),如果 n_features大于20,通常使用MiniBatchKMeans會(huì)更好。
3) 如果數(shù)據(jù)集的分布簇不是類似于超球體,或者說不是凸的,則聚類效果不好。
sklearn的使用
class sklearn.cluster.Birch(threshold=0.5, branching_factor=50, n_clusters=3, compute_labels=True, copy=True)1) threshold:即葉節(jié)點(diǎn)每個(gè)CF的最大樣本半徑閾值T,它決定了每個(gè)CF里所有樣本形成的超球體的半徑閾值。一般來說threshold越小,則CF Tree的建立階段的規(guī)模會(huì)越大,即BIRCH算法第一階段所花的時(shí)間和內(nèi)存會(huì)越多。但是選擇多大以達(dá)到聚類效果則需要通過調(diào)參決定。默認(rèn)值是0.5.如果樣本的方差較大,則一般需要增大這個(gè)默認(rèn)值。2) branching_factor:即CF Tree內(nèi)部節(jié)點(diǎn)的最大CF數(shù)B,以及葉子節(jié)點(diǎn)的最大CF數(shù)L。這里scikit-learn對(duì)這兩個(gè)參數(shù)進(jìn)行了統(tǒng)一取值。也就是說,branching_factor決定了CF Tree里所有節(jié)點(diǎn)的最大CF數(shù)。默認(rèn)是50。如果樣本量非常大,比如大于10萬(wàn),則一般需要增大這個(gè)默認(rèn)值。選擇多大的branching_factor以達(dá)到聚類效果則需要通過和threshold一起調(diào)參決定3)n_clusters:即類別數(shù)K,在BIRCH算法是可選的,如果類別數(shù)非常多,我們也沒有先驗(yàn)知識(shí),則一般輸入None,此時(shí)BIRCH算法第4階段不會(huì)運(yùn)行。但是如果我們有類別的先驗(yàn)知識(shí),則推薦輸入這個(gè)可選的類別值。默認(rèn)是3,即最終聚為3類。4)compute_labels:布爾值,表示是否標(biāo)示類別輸出,默認(rèn)是True。一般使用默認(rèn)值挺好,這樣可以看到聚類效果。- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
4.譜聚類
譜聚類(spectral clustering)是廣泛使用的聚類算法,比起傳統(tǒng)的K-Means算法,譜聚類對(duì)數(shù)據(jù)分布的適應(yīng)性更強(qiáng),聚類效果也很優(yōu)秀,同時(shí)聚類的計(jì)算量也小很多。它的主要思想是把所有的數(shù)據(jù)看做空間中的點(diǎn),這些點(diǎn)之間可以用邊連接起來。距離較遠(yuǎn)的兩個(gè)點(diǎn)之間的邊權(quán)重值較低,而距離較近的兩個(gè)點(diǎn)之間的邊權(quán)重值較高,通過對(duì)所有數(shù)據(jù)點(diǎn)組成的圖進(jìn)行切圖,讓切圖后不同的子圖間邊權(quán)重和盡可能的低,而子圖內(nèi)的邊權(quán)重和盡可能的高,從而達(dá)到聚類的目的。
5.圖團(tuán)體檢測(cè)
2.性能度量
比較好的聚類結(jié)果是,“簇類相似度高”且“簇間相似度低”。
聚類的性能度量大致分為兩類,一類是將簇類結(jié)果與某個(gè)“參考模型”進(jìn)行比較,稱為“外部指標(biāo)”,另一類是直接參考聚類結(jié)果而不利用任何參考模型,稱為“內(nèi)部指標(biāo)”。
1)外部指標(biāo)
“外部指標(biāo)”通常有Jaccard系數(shù)(Jaccard Coefficient,簡(jiǎn)稱JC)、FM系數(shù)(Fowlkes and Mallows Index,簡(jiǎn)稱FMI)、Rand指數(shù)(Rand Index,簡(jiǎn)稱RI)。
- JC:
JC=aa+b+cJC=aa+b+c
DBI的值越小越好,DI的值越大越好
3.常用的距離計(jì)算
4.各聚類方法的比較
參考的博客和資料:
1.scikit-learn:cluster
2.劉建平Pinard-DBSCAN,BIRCH,譜聚類
3.常見的六大聚類算法
3.聚類算法深度詳解
4.Mean Shift聚類算法
5.機(jī)器學(xué)習(xí)中常用的距離公式
6.機(jī)器學(xué)習(xí) –周志華
(2).學(xué)習(xí)向量化(LVQ)
假設(shè)數(shù)據(jù)樣本帶有類別標(biāo)記,利用這些監(jiān)督信息來輔助聚類。
(3).高斯混合聚類
與k均值采用原型向量來刻畫聚類結(jié)構(gòu)不同的是,高斯混合聚類采用的概率模型來表達(dá)聚類原型。–西瓜書
用k-means算法解決聚類問題非常簡(jiǎn)單,將數(shù)據(jù)聚為一個(gè)一個(gè)的點(diǎn),但這樣往往比較粗糙,不適用于很多數(shù)據(jù)集。所以是采用概率模型來表達(dá)原型,即通過統(tǒng)計(jì)得到每個(gè)樣本點(diǎn)屬于各個(gè)類的概率,而不是判定它完全屬于一個(gè)類,所以有時(shí)也會(huì)被稱為軟聚類。從貝葉斯我們可以看出,給出一個(gè)概率來估計(jì)比直接得出一個(gè)結(jié)果要好得多。利用高斯分布函數(shù)估計(jì)出概率值。
自己理解:
一堆數(shù)據(jù),先初始化幾個(gè)高斯分布,然后根據(jù)貝葉斯的后驗(yàn)定理計(jì)算每個(gè)數(shù)據(jù)屬于該簇的概率,然后將該數(shù)據(jù)點(diǎn)劃分到該簇。一輪之后,重新根據(jù)屬于該簇的點(diǎn)計(jì)算高斯分布,在計(jì)算概(E操作)率,重復(fù)操作,直到點(diǎn)的聚類信息不再發(fā)生變化。(M操作的)
2. 密度聚類
基于密度的聚類假設(shè)聚類結(jié)構(gòu)能通過樣本分布的緊密程度確定,通常情形下,密度聚類算法從樣本密度的角度來考察樣本之間的可連接性,并基于可連接樣本的不斷擴(kuò)展聚類粗以獲得最終的聚類結(jié)果。–西瓜書
這類密度聚類算法一般假定類別可以通過樣本分布的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠(yuǎn)處一定有同類別的樣本存在。通過將緊密相連的樣本劃為一類,這樣就得到了一個(gè)聚類類別。通過將所有各組緊密相連的樣本劃為各個(gè)不同的類別,則我們就得到了最終的所有聚類類別結(jié)果。
(1).DBSCAN
DBSCAN是基于一組鄰域來描述樣本集的緊密程度的,參數(shù)(?, MinPts)用來描述鄰域的樣本分布緊密程度。其中,?描述了某一樣本的鄰域距離閾值,MinPts描述了某一樣本的距離為?的鄰域中樣本個(gè)數(shù)的閾值。
假設(shè)我的樣本集是D=(x1,x2,…,xm),則DBSCAN具體的密度描述定義如下:
1) ?-鄰域:對(duì)于xj∈D,其?-鄰域包含樣本集D中與xj的距離不大于?的子樣本集,即N?(xj)={xi∈D|distance(xi,xj)≤?}, 這個(gè)子樣本集的個(gè)數(shù)記為|N?(xj)|
2) 核心對(duì)象:對(duì)于任一樣本xj∈D,如果其?-鄰域?qū)?yīng)的N?(xj)至少包含MinPts個(gè)樣本,即如果|N?(xj)|≥MinPts,則xj是核心對(duì)象。
3)密度直達(dá):如果xi位于xj的?-鄰域中,且xj是核心對(duì)象,則稱xi由xj密度直達(dá)。注意反之不一定成立,即此時(shí)不能說xj由xi密度直達(dá), 除非且xi也是核心對(duì)象。
4)密度可達(dá):對(duì)于xi和xj,如果存在樣本樣本序列p1,p2,…,pT,滿足p1=xi,pT=xj, 且pt+1由pt密度直達(dá),則稱xj由xi密度可達(dá)。也就是說,密度可達(dá)滿足傳遞性。此時(shí)序列中的傳遞樣本p1,p2,…,pT?1均為核心對(duì)象,因?yàn)橹挥泻诵膶?duì)象才能使其他樣本密度直達(dá)。注意密度可達(dá)也不滿足對(duì)稱性,這個(gè)可以由密度直達(dá)的不對(duì)稱性得出。
5)密度相連:對(duì)于xi和xj,如果存在核心對(duì)象樣本xk,使xi和xj均由xk密度可達(dá),則稱xi和xj密度相連。注意密度相連關(guān)系是滿足對(duì)稱性的。
DBSCAN的聚類定義很簡(jiǎn)單:由密度可達(dá)關(guān)系導(dǎo)出的最大密度相連的樣本集合,即為我們最終聚類的一個(gè)類別,或者說一個(gè)簇。
這個(gè)DBSCAN的簇里面可以有一個(gè)或者多個(gè)核心對(duì)象。如果只有一個(gè)核心對(duì)象,則簇里其他的非核心對(duì)象樣本都在這個(gè)核心對(duì)象的?-鄰域里;如果有多個(gè)核心對(duì)象,則簇里的任意一個(gè)核心對(duì)象的?-鄰域中一定有一個(gè)其他的核心對(duì)象,否則這兩個(gè)核心對(duì)象無(wú)法密度可達(dá)。這些核心對(duì)象的?-鄰域里所有的樣本的集合組成的一個(gè)DBSCAN聚類簇。
那么怎么才能找到這樣的簇樣本集合呢?DBSCAN使用的方法很簡(jiǎn)單,它任意選擇一個(gè)沒有類別的核心對(duì)象作為種子,然后找到所有這個(gè)核心對(duì)象能夠密度可達(dá)的樣本集合,即為一個(gè)聚類簇。接著繼續(xù)選擇另一個(gè)沒有類別的核心對(duì)象去尋找密度可達(dá)的樣本集合,這樣就得到另一個(gè)聚類簇。一直運(yùn)行到所有核心對(duì)象都有類別為止。
自己理解:
給定一個(gè)半徑長(zhǎng)度r和一個(gè)最小點(diǎn)的數(shù)目m,然后以某個(gè)點(diǎn)為圓心,r為半徑,如果在該圓內(nèi)的點(diǎn)的數(shù)目大于m值,則把該點(diǎn)標(biāo)記為中心點(diǎn),如果數(shù)目小于m值,則被標(biāo)記為噪聲點(diǎn)。重復(fù)該步驟,如果一個(gè)噪聲點(diǎn)存在于某個(gè)中心點(diǎn)的圓內(nèi),則標(biāo)記該點(diǎn)為邊緣點(diǎn)。直到所有點(diǎn)都被標(biāo)記了,然后連接在一個(gè)圓內(nèi)中心點(diǎn)以及每個(gè)中心點(diǎn)的邊緣點(diǎn)組成一個(gè)簇。
算法實(shí)現(xiàn)流程:
sklearn實(shí)現(xiàn):
DBSCAN算法是確定性的,當(dāng)以相同的順序給出相同的數(shù)據(jù)時(shí),總是生成相同的簇。但是,當(dāng)以不同順序提供數(shù)據(jù)時(shí),結(jié)果可能不同。
class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’, metric_params=None, algorithm=’auto’, leaf_size=30, p=None, n_jobs=1)eps:兩個(gè)樣本之間的最大距離,以便將它們視為在同一鄰域中。 min_samples:對(duì)于要被視為核心點(diǎn)的點(diǎn),鄰域中的樣本數(shù)(或總權(quán)重)。這包括點(diǎn)本身。 metric:最近鄰距離度量參數(shù)。可以使用的距離度量較多,一般來說DBSCAN使用默認(rèn)的歐式距離 algorithm:最近鄰搜索算法參數(shù)(暴力實(shí)現(xiàn),kd數(shù),球樹實(shí)現(xiàn))時(shí)間復(fù)雜度:
(1)DBSCAN的基本時(shí)間復(fù)雜度是 O(N*找出Eps領(lǐng)域中的點(diǎn)所需要的時(shí)間), N是點(diǎn)的個(gè)數(shù)。最壞情況下時(shí)間復(fù)雜度是O(N2)
(2)在低維空間數(shù)據(jù)中,有一些數(shù)據(jù)結(jié)構(gòu)如KD樹,使得可以有效的檢索特定點(diǎn)給定距離內(nèi)的所有點(diǎn),時(shí)間復(fù)雜度可以降低到O(NlogN)
空間復(fù)雜度:低維和高維數(shù)據(jù)中,其空間都是O(N),對(duì)于每個(gè)點(diǎn)它只需要維持少量數(shù)據(jù),即簇標(biāo)號(hào)和每個(gè)點(diǎn)的標(biāo)識(shí)(核心點(diǎn)或邊界點(diǎn)或噪音點(diǎn))
DBSCAN小結(jié)
和傳統(tǒng)的K-Means算法相比,DBSCAN最大的不同就是不需要輸入類別數(shù)k,當(dāng)然它最大的優(yōu)勢(shì)是可以發(fā)現(xiàn)任意形狀的聚類簇,而不是像K-Means,一般僅僅使用于凸的樣本集聚類。同時(shí)它在聚類的同時(shí)還可以找出異常點(diǎn),這點(diǎn)和BIRCH算法類似。
那么我們什么時(shí)候需要用DBSCAN來聚類呢?一般來說,如果數(shù)據(jù)集是稠密的,并且數(shù)據(jù)集不是凸的,那么用DBSCAN會(huì)比K-Means聚類效果好很多。如果數(shù)據(jù)集不是稠密的,則不推薦用DBSCAN來聚類。
下面對(duì)DBSCAN算法的優(yōu)缺點(diǎn)做一個(gè)總結(jié)。
1) 可以對(duì)任意形狀的稠密數(shù)據(jù)集進(jìn)行聚類,相對(duì)的,K-Means之類的聚類算法一般只適用于凸數(shù)據(jù)集。
2) 可以在聚類的同時(shí)發(fā)現(xiàn)異常點(diǎn),對(duì)數(shù)據(jù)集中的異常點(diǎn)不敏感。
3) 聚類結(jié)果沒有偏倚,相對(duì)的,K-Means之類的聚類算法初始值對(duì)聚類結(jié)果有很大影響。
總結(jié)
以上是生活随笔為你收集整理的【聚类算法】常见聚类算法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【聚类算法】常见的六大聚类算法
- 下一篇: 【聚类算法】sklearn聚类方法详解