常見聚類算法總結
1.常見算法
1.原型聚類
“原型”是指樣本空間中具有代表性的店。此類算法假設聚類結構能夠通過一組原型刻畫,通常情形下,算法先對原型進行初始化,然后對原型進行迭代更新求解。–西瓜書
(1).K均值聚類(K-Means)
給定樣本集D={x1,x2,..xn},K均值算法針對聚類所得簇划分C={C1,C2,..CK}最小化平方誤差,采用的貪心算法來迭代優化求解近似解。

在基本術語中,算法有三個步驟。第一步選擇初始質心,最基本的方法是ķ從數據集中選擇樣本 X。初始化之后,K-means包括在其他兩個步驟之間循環。第一步將每個樣品分配到最近的質心。第二步通過獲取分配給每個先前質心的所有樣本的平均值來創建新質心。計算舊的和新的質心之間的差異,並且算法重復這最后兩個步驟,直到該值小於閾值。換句話說,它重復直到質心不顯着移動。

sklearn的實現:
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'
)
參數的意義:
n_clusters:簇的個數,即你想聚成幾類
init: 初始簇中心的獲取方法
n_init: 獲取初始簇中心的更迭次數,為了彌補初始質心的影響,算法默認會初始10次質心,實現算法,然后返回最好的結果。
max_iter: 最大迭代次數(因為kmeans算法的實現需要迭代)
tol: 容忍度,即kmeans運行准則收斂的條件
precompute_distances:是否需要提前計算距離,這個參數會在空間和時間之間做權衡,如果是True 會把整個距離矩陣都放到內存中,auto 會默認在數據樣本大於featurs*samples 的數量大於12e6 的時候False,False 時核心實現的方法是利用Cpython 來實現的
verbose: 冗長模式(不太懂是啥意思,反正一般不去改默認值)
random_state: 隨機生成簇中心的狀態條件。
copy_x: 對是否修改數據的一個標記,如果True,即復制了就不會修改數據。bool 在scikit-learn 很多接口中都會有這個參數的,就是是否對輸入數據繼續copy 操作,以便不修改用戶的輸入數據。這個要理解Python 的內存機制才會比較清楚。
n_jobs: 並行設置
algorithm: kmeans的實現算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式實現
優點
原理比較簡單,實現也是很容易,收斂速度快。
算法的可解釋度比較強。
主要需要調參的參數僅僅是簇數k。
缺點、
需要事先確定分類的簇數,即k值。
采用迭代方法,得到的結果只是局部最優。
對初始值的選取比較敏感。(改進1:k-means++(sklearn已經添加該參數的取值);改進2:二分K-means)
當數據量非常大時,算法的時間開銷是非常大的(改進:Mini Batch K-Means(精確度會降低,在可接受的范圍即可));
若簇中含有異常點,將導致均值偏離嚴重,對噪聲和孤立點數據敏感(改進1:離群點檢測的LOF算法,通過去除離群點后再聚類,可以減少離群點和孤立點對於聚類效果的影響;改進2:改成求點的中位數,這種聚類方式即K-Mediods聚類(K中值));
對於不是凸的數據集比較難收斂(改進:基於密度的聚類算法更加適合,比如DESCAN算法)
(2).學習向量化(LVQ)
假設數據樣本帶有類別標記,利用這些監督信息來輔助聚類。

(3).高斯混合聚類
與k均值采用原型向量來刻畫聚類結構不同的是,高斯混合聚類采用的概率模型來表達聚類原型。–西瓜書
用k-means算法解決聚類問題非常簡單,將數據聚為一個一個的點,但這樣往往比較粗糙,不適用於很多數據集。所以是采用概率模型來表達原型,即通過統計得到每個樣本點屬於各個類的概率,而不是判定它完全屬於一個類,所以有時也會被稱為軟聚類。從貝葉斯我們可以看出,給出一個概率來估計比直接得出一個結果要好得多。利用高斯分布函數估計出概率值。


自己理解:
一堆數據,先初始化幾個高斯分布,然后根據貝葉斯的后驗定理計算每個數據屬於該簇的概率,然后將該數據點划分到該簇。一輪之后,重新根據屬於該簇的點計算高斯分布,在計算概(E操作)率,重復操作,直到點的聚類信息不再發生變化。(M操作的)
2. 密度聚類
基於密度的聚類假設聚類結構能通過樣本分布的緊密程度確定,通常情形下,密度聚類算法從樣本密度的角度來考察樣本之間的可連接性,並基於可連接樣本的不斷擴展聚類粗以獲得最終的聚類結果。–西瓜書
這類密度聚類算法一般假定類別可以通過樣本分布的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠處一定有同類別的樣本存在。通過將緊密相連的樣本划為一類,這樣就得到了一個聚類類別。通過將所有各組緊密相連的樣本划為各個不同的類別,則我們就得到了最終的所有聚類類別結果。
(1).DBSCAN
DBSCAN是基於一組鄰域來描述樣本集的緊密程度的,參數(ϵ, MinPts)用來描述鄰域的樣本分布緊密程度。其中,ϵ描述了某一樣本的鄰域距離閾值,MinPts描述了某一樣本的距離為ϵ的鄰域中樣本個數的閾值。
假設我的樣本集是D=(x1,x2,…,xm),則DBSCAN具體的密度描述定義如下:
1) ϵ-鄰域:對於xj∈D,其ϵ-鄰域包含樣本集D中與xj的距離不大於ϵ的子樣本集,即Nϵ(xj)={xi∈D|distance(xi,xj)≤ϵ}, 這個子樣本集的個數記為|Nϵ(xj)|
2) 核心對象:對於任一樣本xj∈D,如果其ϵ-鄰域對應的Nϵ(xj)至少包含MinPts個樣本,即如果|Nϵ(xj)|≥MinPts,則xj是核心對象。
3)密度直達:如果xi位於xj的ϵ-鄰域中,且xj是核心對象,則稱xi由xj密度直達。注意反之不一定成立,即此時不能說xj由xi密度直達, 除非且xi也是核心對象。
4)密度可達:對於xi和xj,如果存在樣本樣本序列p1,p2,…,pT,滿足p1=xi,pT=xj, 且pt+1由pt密度直達,則稱xj由xi密度可達。也就是說,密度可達滿足傳遞性。此時序列中的傳遞樣本p1,p2,…,pT−1均為核心對象,因為只有核心對象才能使其他樣本密度直達。注意密度可達也不滿足對稱性,這個可以由密度直達的不對稱性得出。
5)密度相連:對於xi和xj,如果存在核心對象樣本xk,使xi和xj均由xk密度可達,則稱xi和xj密度相連。注意密度相連關系是滿足對稱性的。
DBSCAN的聚類定義很簡單:由密度可達關系導出的最大密度相連的樣本集合,即為我們最終聚類的一個類別,或者說一個簇。
這個DBSCAN的簇里面可以有一個或者多個核心對象。如果只有一個核心對象,則簇里其他的非核心對象樣本都在這個核心對象的ϵ-鄰域里;如果有多個核心對象,則簇里的任意一個核心對象的ϵ-鄰域中一定有一個其他的核心對象,否則這兩個核心對象無法密度可達。這些核心對象的ϵ-鄰域里所有的樣本的集合組成的一個DBSCAN聚類簇。
那么怎么才能找到這樣的簇樣本集合呢?DBSCAN使用的方法很簡單,它任意選擇一個沒有類別的核心對象作為種子,然后找到所有這個核心對象能夠密度可達的樣本集合,即為一個聚類簇。接着繼續選擇另一個沒有類別的核心對象去尋找密度可達的樣本集合,這樣就得到另一個聚類簇。一直運行到所有核心對象都有類別為止。
自己理解:
給定一個半徑長度r和一個最小點的數目m,然后以某個點為圓心,r為半徑,如果在該圓內的點的數目大於m值,則把該點標記為中心點,如果數目小於m值,則被標記為噪聲點。重復該步驟,如果一個噪聲點存在於某個中心點的圓內,則標記該點為邊緣點。直到所有點都被標記了,然后連接在一個圓內中心點以及每個中心點的邊緣點組成一個簇。
算法實現流程:

sklearn實現:
DBSCAN算法是確定性的,當以相同的順序給出相同的數據時,總是生成相同的簇。但是,當以不同順序提供數據時,結果可能不同。
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:兩個樣本之間的最大距離,以便將它們視為在同一鄰域中。
min_samples:對於要被視為核心點的點,鄰域中的樣本數(或總權重)。這包括點本身。
metric:最近鄰距離度量參數。可以使用的距離度量較多,一般來說DBSCAN使用默認的歐式距離
algorithm:最近鄰搜索算法參數(暴力實現,kd數,球樹實現)
時間復雜度:
(1)DBSCAN的基本時間復雜度是 O(N*找出Eps領域中的點所需要的時間), N是點的個數。最壞情況下時間復雜度是O(N2)
(2)在低維空間數據中,有一些數據結構如KD樹,使得可以有效的檢索特定點給定距離內的所有點,時間復雜度可以降低到O(NlogN)
空間復雜度:低維和高維數據中,其空間都是O(N),對於每個點它只需要維持少量數據,即簇標號和每個點的標識(核心點或邊界點或噪音點)
DBSCAN小結
和傳統的K-Means算法相比,DBSCAN最大的不同就是不需要輸入類別數k,當然它最大的優勢是可以發現任意形狀的聚類簇,而不是像K-Means,一般僅僅使用於凸的樣本集聚類。同時它在聚類的同時還可以找出異常點,這點和BIRCH算法類似。
那么我們什么時候需要用DBSCAN來聚類呢?一般來說,如果數據集是稠密的,並且數據集不是凸的,那么用DBSCAN會比K-Means聚類效果好很多。如果數據集不是稠密的,則不推薦用DBSCAN來聚類。
下面對DBSCAN算法的優缺點做一個總結。
優點:
1) 可以對任意形狀的稠密數據集進行聚類,相對的,K-Means之類的聚類算法一般只適用於凸數據集。
2) 可以在聚類的同時發現異常點,對數據集中的異常點不敏感。
3) 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。
缺點:
1)如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類一般不適合。
2) 如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。
3) 調參相對於傳統的K-Means之類的聚類算法稍復雜,主要需要對距離閾值ϵ,鄰域樣本數閾值MinPts聯合調參,不同的參數組合對最后的聚類效果有較大影響。
(1).Mean-Shift
Mean shift 算法是基於核密度估計的爬山算法
(Meanshift算法實際是一個自適應的梯度上升搜索峰值的算法)
自己理解:
對於樣本點,給定一個半徑r,首先隨機選擇一個樣本,計算以這個點為圓心,落在r為半徑的圓內的樣本點,然后計算這些樣本點到圓心的向量和,該向量和為一個均值偏移,圓心加上這個向量和更新為新的圓心,即圓朝着這個均值方向進行移動。重復該步驟,直到圓心不在移動,標記為一類。如果新類和已有類的中心距離小於半徑,則合並。重復操作,直到每個點都被標記,最后把該點歸為被某個簇標記次數最多的類。
假設在一個多維空間中有很多數據點需要進行聚類,Mean Shift的過程如下:
1、在未被標記的數據點中隨機選擇一個點作為中心center;
2、找出離center距離在bandwidth之內的所有點,記做集合M,認為這些點屬於簇c。同時,把這些求內點屬於這個類的概率加1,這個參數將用於最后步驟的分類
3、以center為中心點,計算從center開始到集合M中每個元素的向量,將這些向量相加,得到向量shift。
4、center = center+shift。即center沿着shift的方向移動,移動距離是||shift||。
5、重復步驟2、3、4,直到shift的大小很小(就是迭代到收斂),記住此時的center。注意,這個迭代過程中遇到的點都應該歸類到簇c。
6、如果收斂時當前簇c的center與其它已經存在的簇c2中心的距離小於閾值,那么把c2和c合並。否則,把c作為新的聚類,增加1類。
6、重復1、2、3、4、5直到所有的點都被標記訪問。
7、分類:根據每個類,對每個點的訪問頻率,取訪問頻率最大的那個類,作為當前點集的所屬類。
簡單的說,mean shift就是沿着密度上升的方向尋找同屬一個簇的數據點。
加入核函數的漂移向量
核函數的作用,就是把一個高維空間映射到一個低維空間,使之線性可分。
給向量加上了一個權重?
Mean-Shift小結
meanshift方法適合概率密度函數有極值且在某一局部區域內唯一,即選擇的特征數據點能夠較為明顯的判定目標,亦即顯著特征點。meanshift的基本形式不適合等概率特征點,即特征點是均勻分布的情況。
優點:
1.不用事先確定分類的個數
2.計算較為簡便,對數據中的異常點不敏感。
3.適用於追蹤或者圖像分割
缺點:
1.受初始值影響較大
2.算法收斂的速度和程度,很大程度上和選取的窗口有關
sklearn實現:
class sklearn.cluster.MeanShift(bandwidth=None,
seeds=None,
bin_seeding=False,
min_bin_freq=1,
cluster_all=True,
n_jobs=1)[source]
3.層次聚類
層次聚類試圖在不同的層次上對數據集記性划分,從而形成樹形的聚類結構。–西瓜書
(1).AGNES
是一種自底向上聚合策略的層次聚類算法。他先將數據集中的每個樣本看做是一個廚師聚類簇,然后在算法運行的每一步中找出距離最近的兩個聚類簇進行合並。該過程不斷重復,直至達到預設的聚類簇個數。
如何計算簇之間的距離。實際上每個簇是一個樣本集合,因此采用關於聚合的某種距離即可。
單鏈接算法:(最小距離)兩個簇中距離最近的樣本的距離
全鏈接算法:(最大距離)兩個簇中距離最遠的樣本的距離
均鏈接算法:(平均距離)兩個簇中每兩個樣本之間的距離相加求平均的距離
算法流程:

優點:
1,距離和規則的相似度容易定義,限制少;
2,不需要預先制定聚類數;
3,可以發現類的層次關系;
4,可以聚類成其它形狀
缺點:
1,計算復雜度太高;
2,奇異值也能產生很大影響;
3,算法很可能聚類成鏈狀
(2).BIRCH
BIRCH算法比較適合於數據量大,類別數K也比較多的情況。它運行速度很快,只需要單遍掃描數據集就能進行聚類。BIRCH算法是個樹形結構,這顆樹的每一個節點是由若干個聚類特征(Clustering Feature,簡稱CF)組成。一個聚類特征CF是這樣定義的:每一個CF是一個三元組,可以用(N,LS,SS)表示。其中N代表了這個CF中擁有的樣本點的數量,這個好理解;LS代表了這個CF中擁有的樣本點各特征維度的和向量,SS代表了這個CF中擁有的樣本點各特征維度的平方和。
CF有一個很好的性質,就是滿足線性關系,也就是CF1+CF2=(N1+N2,LS1+LS2,SS1+SS2)。如果把這個性質放在CF Tree上,也就是說,在CF Tree中,對於每個父節點中的CF節點,它的(N,LS,SS)三元組的值等於這個CF節點所指向的所有子節點的三元組之和。
對於CF Tree,我們一般有幾個重要參數,第一個參數是每個內部節點的最大CF數B,第二個參數是每個葉子節點的最大CF數L,第三個參數是針對葉子節點中某個CF中的樣本點來說的,它是葉節點每個CF的最大樣本半徑閾值T,也就是說,在這個CF中的所有樣本點一定要在半徑小於T的一個超球體內。
聚類特征樹CF Tree的生成
自己的理解:
先將第一個點加入進去,成為樹的一個節點,再把第二個點加進去,如果第二個點在以第一個點為球心的求體內,則加入,然后依舊加入點,如果所有點都在一個球體內,則作為一個節點,如果不在,則新建立一個節點,放入新點。如果該節點內的樣本超過了設定的閾值,則對該節點進行分裂,把該求體內距離最遠的兩個點分開分別作為新的節點,然后計算剩下的點到哪個節點的距離近就分到那邊的節點里去。如果在分裂的時候發現父節點的子節點個數也達到了設定的閾值,則按照上面的分裂步驟,先把該層的節點進行分裂。然后再進行下一步的構建。
總結下CF Tree的插入:
1. 從根節點向下尋找和新樣本距離最近的葉子節點和葉子節點里最近的CF節點
2. 如果新樣本加入后,這個CF節點對應的超球體半徑仍然滿足小於閾值T,則更新路徑上所有的CF三元組,插入結束。否則轉入3.
3. 如果當前葉子節點的CF節點個數小於閾值L,則創建一個新的CF節點,放入新樣本,將新的CF節點放入這個葉子節點,更新路徑上所有的CF三元組,插入結束。否則轉入4。
4.將當前葉子節點划分為兩個新葉子節點,選擇舊葉子節點中所有CF元組里超球體距離最遠的兩個CF元組,分布作為兩個新葉子節點的第一個CF節點。將其他元組和新樣本元組按照距離遠近原則放入對應的葉子節點。依次向上檢查父節點是否也要分裂,如果需要按和葉子節點分裂方式相同。

將所有的訓練集樣本建立了CF Tree,一個基本的BIRCH算法就完成了,對應的輸出就是若干個CF節點,每個節點里的樣本點就是一個聚類的簇。也就是說BIRCH算法的主要過程,就是建立CF Tree的過程。
真實的BIRCH算法除了建立CF Tree來聚類,其實還有一些可選的算法步驟的,現在我們就來看看 BIRCH算法的流程。
1) 將所有的樣本依次讀入,在內存中建立一顆CF Tree, 建立的方法參考上一節。
2)(可選)將第一步建立的CF Tree進行篩選,去除一些異常CF節點,這些節點一般里面的樣本點很少。對於一些超球體距離非常近的元組進行合並
3)(可選)利用其它的一些聚類算法比如K-Means對所有的CF元組進行聚類,得到一顆比較好的CF Tree.這一步的主要目的是消除由於樣本讀入順序導致的不合理的樹結構,以及一些由於節點CF個數限制導致的樹結構分裂。
4)(可選)利用第三步生成的CF Tree的所有CF節點的質心,作為初始質心點,對所有的樣本點按距離遠近進行聚類。這樣進一步減少了由於CF Tree的一些限制導致的聚類不合理的情況。
BIRCH算法小結
BIRCH算法可以不用輸入類別數K值,這點和K-Means,Mini Batch K-Means不同。如果不輸入K值,則最后的CF元組的組數即為最終的K,否則會按照輸入的K值對CF元組按距離大小進行合並。
一般來說,BIRCH算法適用於樣本量較大的情況,這點和Mini Batch K-Means類似,但是BIRCH適用於類別數比較大的情況,而Mini Batch K-Means一般用於類別數適中或者較少的時候。BIRCH除了聚類還可以額外做一些異常點檢測和數據初步按類別規約的預處理。但是如果數據特征的維度非常大,比如大於20,則BIRCH不太適合,此時Mini Batch K-Means的表現較好。
對於調參,BIRCH要比K-Means,Mini Batch K-Means復雜,因為它需要對CF Tree的幾個關鍵的參數進行調參,這幾個參數對CF Tree的最終形式影響很大。
最后總結下BIRCH算法的優缺點:
優點有:
1) 節約內存,所有的樣本都在磁盤上,CF Tree僅僅存了CF節點和對應的指針。
2) 聚類速度快,只需要一遍掃描訓練集就可以建立CF Tree,CF Tree的增刪改都很快。
3) 可以識別噪音點,還可以對數據集進行初步分類的預處理
4)如果需要減少數據實例的數量,或者如果想要將大量子群集作為預處理步驟或其他方式,則Birch比MiniBatchKMeans更有用。
缺點有:
1) 由於CF Tree對每個節點的CF個數有限制,導致聚類的結果可能和真實的類別分布不同.
2) 對高維特征的數據聚類效果不好。此時可以選擇Mini Batch K-Means.根據經驗,如果 n_features大於20,通常使用MiniBatchKMeans會更好。
3) 如果數據集的分布簇不是類似於超球體,或者說不是凸的,則聚類效果不好。
sklearn的使用
class sklearn.cluster.Birch(threshold=0.5,
branching_factor=50,
n_clusters=3,
compute_labels=True,
copy=True)
1) threshold:即葉節點每個CF的最大樣本半徑閾值T,它決定了每個CF里所有樣本形成的超球體的半徑閾值。一般來說threshold越小,則CF Tree的建立階段的規模會越大,即BIRCH算法第一階段所花的時間和內存會越多。但是選擇多大以達到聚類效果則需要通過調參決定。默認值是0.5.如果樣本的方差較大,則一般需要增大這個默認值。
2) branching_factor:即CF Tree內部節點的最大CF數B,以及葉子節點的最大CF數L。這里scikit-learn對這兩個參數進行了統一取值。也就是說,branching_factor決定了CF Tree里所有節點的最大CF數。默認是50。如果樣本量非常大,比如大於10萬,則一般需要增大這個默認值。選擇多大的branching_factor以達到聚類效果則需要通過和threshold一起調參決定
3)n_clusters:即類別數K,在BIRCH算法是可選的,如果類別數非常多,我們也沒有先驗知識,則一般輸入None,此時BIRCH算法第4階段不會運行。但是如果我們有類別的先驗知識,則推薦輸入這個可選的類別值。默認是3,即最終聚為3類。
4)compute_labels:布爾值,表示是否標示類別輸出,默認是True。一般使用默認值挺好,這樣可以看到聚類效果。

(3)Chameleon(變色龍)算法
——使用動態建模的多階段層次聚類
一種層次聚類算法,它采用動態建模來確定一對簇之間的相似度。
算法思想:
首先由數據集構造一個 k-最近鄰圖 Gk;
再通過一種圖的划分算法,將Gk圖划分成大量較小的子圖,每個子圖代表一個初始的子簇;
最后使用凝聚層次聚類算法,基於子簇的相似度反復合並子簇。
**為引出**Chameleon變色龍算法的一些定義,先說一下以往的聚類算法的不足之處:
忽略簇與簇之間的互聯性
互聯性:簇間距離較近的數據對之間的數量,即臨接區域的大小。
忽略簇與簇之間的近似性
近似性:簇間數據對的相似度,即不同簇的對象間最近距離。
如圖4所示:如果只看最近鄰的鏈接,即只看近似性,則算法會傾向於合並c和d而不是a和b,但實際上a、b的臨接區域較大,距離也不遠(相對於a、b內部),即互連性更好,所以應該屬於同一個cluster簇。
如圖5所示:另一種情況,就是過分強調臨接區域的大小,傾向於合並a、c,而不是a、b。

Chameleon算法就是努力保持這兩種情況之間平衡,即考慮最近鄰節點的靠近程度,也考慮臨接區域的大小。
Chameleon算法的聚類步驟:
第一階段:圖划分算法,將數據對象划分成大量子簇;
第二階段:凝聚層次聚類算法,合並子簇。

3個關鍵知識點:
1. k-最近鄰圖Gk的構造(第一階段)
Gk圖中的每個點,表示數據集中的一個數據點。對於數據集中的每一個數據點找出它的所有k-最近鄰對象,然后分別在它們之間加帶權邊。
如何找k-最近鄰對象呢??即找離該對象最近的k個對象點,
(定義:若點ai到另一個點bi的距離值是所有數據點到bi的距離值中k個最小值之一,則稱ai是bi的k-最近鄰對象。)
若一個數據點是另一個數據點的k-最近鄰對象之一,則在這兩點之間加一條帶權邊,邊的權值表示這兩個數據點之間的相似度,即距離越大邊權值越小,則近似度越小。
2. 划分k-最近鄰圖Gk(得到初始子簇)
目的:把Gk圖划分為大量的無連接的子圖,每一個子圖就是第二階段層次聚類的初始子簇。
划分步驟:首先把圖Gk划分成兩個近似的等大小的子圖,使分區的邊的總權重和最小,即(割邊最小化);我個人覺得它就是最小二分法。也就是說,簇C划分為兩個子簇Ci和Cj時需要割斷的邊的加權和最小。割邊用Ec(Ci,Cj)表示,用於評估簇Ci和Cj之間的絕對互連性。然后把每個子圖看成一個初始的子圖,重復上述過程直至生成每一個子圖中節點數量達到一定標准。
3. 合並成最終的簇(第二階段)
Chameleon算法根據每對簇Ci和Cj的 相對互連度 RI(Ci,Cj)和 相對接近度
RC(Ci,Cj)來決定兩個簇之間的相似度。
兩個簇Ci和Cj之間的 相對互連度 RI(Ci,Cj)定義為Ci和Cj之間的絕對互連度關於兩個簇Ci和Cj之間的內部互連度的規范化:


絕對互連性:連接子簇Ci和Cj之間的邊的權重之和。
相對互連性:一個子簇Ci做最小截斷時需要去掉的邊的權重和。
兩個簇Ci和Cj的的 相對接近度 RC(Ci,Cj)定義為Ci和Cj之間的絕對接近度關於兩個簇Ci和Cj的內部接近度的規范化,定義如下:


相對近似度:一個子簇Ci做最小截斷時需要去掉的邊的平均權重。
絕對近似度:連接子簇Ci和Cj之間的邊的平均權重。
相似度函數:是相對互連度與相對近似度兩個指標的乘積。
RI(Ci,Cj)* RC(Ci,Cj)^a ,選擇使該函數值最大的簇對進行合並。其中,a是用來調節兩個參量的比重的參數。a>1,更重視相對近似性,a<1更重視相對互連性。
合並子簇具體過程:
給定度量函數和閥值minMetric(用戶指定閥值TRI和TRC);
訪問每個簇,計算它與鄰近的每個簇的RI和RC,通過度量函數公式計算出值tempMetric,將值存放於一個列表中;
從列表找出最大的tempMetric值,若它超過閥值minMetric,將簇與此值對應的簇合並,(合並RI和RC分別超過TRI和TRC的簇對);
若找到的最大tempMetric沒超過閥值,則表明此聚類已合並完成,移除聚簇列表,加入到結果聚簇中,(重復直到沒有可合並的簇);
遞歸步驟2,直到待合並聚簇列表最終大小為空。
總結:
變色龍算法將互連性和近似性都大的簇合並;
可以發現高質量的任意形狀的簇
問題:
k-最近鄰圖中K值難以選取;
最小二等分的選取;
用戶指定的閥值的選取;
最壞情況下,高維數據的處理代價可能需要O(n^2)的時間。
Matlab實現
CSDN地址下載:
https://download.csdn.net/download/qiu1440528444/10489144
————————————————
版權聲明:本文為CSDN博主「Jomaron」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qiu1440528444/article/details/80725142
4.譜聚類
譜聚類(spectral clustering)是廣泛使用的聚類算法,比起傳統的K-Means算法,譜聚類對數據分布的適應性更強,聚類效果也很優秀,同時聚類的計算量也小很多。它的主要思想是把所有的數據看做空間中的點,這些點之間可以用邊連接起來。距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,通過對所有數據點組成的圖進行切圖,讓切圖后不同的子圖間邊權重和盡可能的低,而子圖內的邊權重和盡可能的高,從而達到聚類的目的。
5.圖團體檢測
2.性能度量
比較好的聚類結果是,“簇類相似度高”且“簇間相似度低”。
聚類的性能度量大致分為兩類,一類是將簇類結果與某個“參考模型”進行比較,稱為“外部指標”,另一類是直接參考聚類結果而不利用任何參考模型,稱為“內部指標”。
1)外部指標
“外部指標”通常有Jaccard系數(Jaccard Coefficient,簡稱JC)、FM系數(Fowlkes and Mallows Index,簡稱FMI)、Rand指數(Rand Index,簡稱RI)。



DBI的值越小越好,DI的值越大越好
3.常用的距離計算
4.各聚類方法的比較
參考的博客和資料:
1.scikit-learn:cluster
2.劉建平Pinard-DBSCAN,BIRCH,譜聚類
3.常見的六大聚類算法
3.聚類算法深度詳解
4.Mean Shift聚類算法
5.機器學習中常用的距離公式
6.機器學習 –周志華
————————————————
版權聲明:本文為CSDN博主「raining7989」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010062386/article/details/82499777
