日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常用聚类算法综述

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用聚类算法综述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聚類的概念
對于有標簽的數據,我們進行有監督學習,常見的分類任務就是監督學習;而對于無標簽的數據,我們希望發現無標簽的數據中的潛在信息,這就是無監督學習。聚類,就是無監督學習的一種,它的概念是:將相似的對象歸到同一個簇中,使得同一個簇內的數據對象的相似性盡可能大,同時不在同一個簇中的數據對象的差異性也盡可能地大。即聚類后同一類的數據盡可能聚集到一起,不同數據盡量分離。

聚類算法的分類
聚類算法有很多種分法,體系也很大,這里舉例幾種分法:

基于劃分的聚類:聚類目標是使得類內的點足夠近,類間的點足夠遠,常見的如k-means及其衍生算法

基于密度的聚類:當鄰近區域的密度超過某個閾值,則繼續聚類,如DBSCAN; OPTICS

層次聚類:這個下面會具體介紹到,包括合并的層次聚類,分裂的層次聚類,實際上可以看作是二叉樹的生成和分裂過程。下面會介紹實際應用中常用的HDBSCAN

基于圖的聚類: 通過建圖來進行聚類,這是聚類算法中的大頭,很多較新的聚類算法都有圖聚類的思想。這篇文章會介紹以Chinese Whisper,譜聚類兩大具有代表性的圖聚類算法

基于GCN(圖神經網絡)的聚類:實際上這個本質上也是基于圖的聚類,然而基于GCN的聚類算法會有深度學習中的訓練的概念,而傳統的聚類算法則是通過人工設定閾值來決定的,所以這里也分開列了一類, 這篇文章會介紹《Learning to Cluster Faces on Affinity Graph》、CDP兩篇論文的思想

其實還有很多分類,但這里不再列舉了,有興趣的同學可以參考sklearn文檔中關于聚類的劃分 https://scikit-learn.org/stable/modules/clustering.html#clustering

K-Means
這個可以說是最基礎的聚類算法了,它的輸入需要簇的個數k,這個k是用戶指定的,也就是說需要提前確定類別,其算法流程是:

隨機確定k個初始點u1, u2…uk作為聚類質心
重復以下過程直到收斂:
對于每一個樣例,找到離它最近的質心作為label:

對于每一個類j, 更新其質心:
[公式]

優點: 速度快

缺點:

必須提前知道"k", 也就是有多少個簇
容易陷入局部最優
數據必須符合“數據之間的相似度可以使用歐式距離衡量”,這個是什么意思呢,看下圖,這種數據的分布,樣本點的距離不能簡單地用歐式距離來衡量,否則分類效果會非常差。這里的距離衡量應該是“測地距離”,也就是樣本沿著曲面到達另一個樣本點的距離。如果在這種數據空間想要使用kmeans,必須先進行空間的轉化

k-means有一些改進算法,多是針對k-means會受異常點的影響這一點來改進的,比如K-Means++, K-Medians…

基于密度的算法-DBSCAN
基于密度的算法,要求聚類空間的一定區域所包含的對象的數目不小于某一給定閾值,先了解一些基本概念:

(1)Eps鄰域:給定對象半徑Eps內的鄰域稱為該對象的Eps鄰域;

(2)核心對象(core point):如果對象的Eps鄰域至少包含最小數目MinPts的對象,則稱該對象為核心對象;

(3)直接密度可達(directly density-reachable):若某點p在點的q的Eps領域內,且q是一個核心對象,則p-q直接密度可達

(4)密度可達(density-reachable):如果存在一個對象鏈 p1, …,pi,…, pn,如果對于任意pi, pi-1都是直接密度可達的,則稱pi到pi-1密度可達,實際上是直接密度可達的傳播鏈

(5)密度相連(density-connected):如果從某個核心對象p出發,點q和點k都是密度可達的,則稱點q和k是密度相連的。

(6)邊界點(edge point):邊界點不是核心對象,但落在某個核心對象的鄰域內;

(7)噪音點(outlier point):既不是核心點,也不是邊界點的任何點;

看看上圖,紅色點是所謂的核心對象,以它為圓心,Eps為半徑去畫圓,在圓內樣本點數目大于MinPts的就是核心對象;被包含在核心對象的范圍內,但是自身不是核心對象的點是樣本點;即不被包含在核心對象內,自身也不是核心對象的點為噪音點,將被拋棄。

DBSCAN的核心思想是從某個核心點出發,不斷向密度可達的區域擴張,從而得到一個包含核心點和邊界點的最大化區域,區域中任意兩點密度相連。現在我們來看看DBSCAN的一個算法流程,會更容易理解:

輸入:給定點在領域內成為核心對象的最小領域點數(MinPts), 領域半徑: Eps

輸出:簇集合

首先將數據集D中所有的對象標記為未處理狀態:
對數據集D中的每個對象p:
if p已經歸入了某個簇:
continue
else:
檢查對象p的Eps領域 NEps§
if NEps§包含的對象數小于MinPts:
標記對象p為邊界點或者噪聲點;
else:
標記對象p為核心點,并建立新簇C,將p領域內的所有點加入C
for (NEPs§中所有尚未處理的對象q):
檢查對象q的領域NEps(q), 若NEps(q)包含至少MInPts個對象,則將NEps(q)中未歸入
任何一個簇的對象加入C
優點:

不需要指定簇的數目(不需要 k)
可以發現任意形狀的聚類簇
對噪聲不敏感

從這張圖中kmeans和DBSCAN的對比可以看出DBSCAN對這種數據分布的擬合更好
缺點:

需要設置半徑Eps和MinPts, 空間聚類密度不均勻時難以設置參數,所以有一個問題就是,在數據集A上挑好的參數很可能到數據集B上就不能用了
隨著數據量的增大,計算量顯著增大,反正大規模數據集用DBSCAN很可能會崩的
層次密度聚類 HDBSCAN
這是一個對DBSCAN的改進算法,結合了密度聚類和層次聚類。它的優化點主要如下:

使用相互可達距離替換歐氏距離,該距離可以使得密度低的點離密度高的區域更遠,減少dbscan對Eps閾值的依賴性
使用最小生成樹構建層次聚類模型,引入層次聚類思想
對最小生成樹的最小子樹做了限制,減少計算量,同時保證生成的類簇不要過小
使用“簇穩定性”的度量方式自動劃分類簇,不需要自行設定閾值
這里面有一些專業術語可能一看起來不太能明白,我們來逐一解釋。

可達距離

可達距離是對DBSCAN中核心距離的一個改進版,也是DBSCAN的改進算法OPTICS的主要核心思想,也就是通過改變距離的度量方式減少dbscan對閾值Eps的敏感性;該距離可以讓稀疏的點離密度高的區域更遠。了解可達距離之前,我們先看看核心距離:

核心距離:對于給定的樣本點,使得該點成為核心點的最小Eps為該點的核心距離。假設樣本點為p, 找到以p為圓心,剛好滿足minPts的最外層的點q,則p和q的距離為核心距離;看下圖,加入我們的MinPts設為3,那么找到以紅色點P為圓心,MinPts正好為3的半徑 [公式] 即為核心距離

可達距離:對于樣本點p周圍的點q1,q2…,1n,如果這些點到點p的距離大于p的核心距離,則可達距離為該點到p的實際距離;如小于,則可達距離為點x的核心距離。我們繼續看上圖,點1,2,3的可達距離均為核心距離,而在核心距離之外的點4, 5, 它們到點P的距離仍然是歐式距離。那么為什么要用可達距離替換歐氏距離呢?我們看看下面這張圖就知道了,下圖中,藍色核心點和綠色核心點原本的距離應該是兩點的歐氏距離,但是因為藍色核心點在綠色核心點的核心距離內,所以此時它們的可達距離為綠色核心點的半徑>兩點的歐氏距離,相當于把藍色核心點和綠色核心點區分開了;紅色核心點到藍色核心點的距離一樣,它們的可達距離要大于藍色核心點和紅色核心點的實際距離,這樣以藍色核心點為代表的高密度區域與紅色核心點、綠色核心點的低密度區域就被推開了;而綠色核心點和紅色核心點的距離則依舊是它們的歐氏距離。

層次聚類

要理解HDBSCAN,首先要搞清楚層次聚類到底是什么。層次聚類有自上而下的方式和自下而上的方式。在這里我們只介紹自下而上的方式,也就是HDBSCAN算法中用到的方式。

假設有 n 個待聚類的樣本
(初始化)將每個樣本都視為一個簇;
計算各個聚類之間的相似度;
尋找最近的兩個聚類,將他們歸為一類;
重復步驟二,步驟三;直到所有樣本歸為一類。

其實就是一個不斷歸一化最后歸成一類的過程。實際上層次不同的層次聚類算法考慮的主要是相似度的衡量方式和終止聚類的條件的不同。相似度的衡量方式決定了哪些樣本將被聚到一起,而中止聚類的條件決定了選擇哪一層級的類別作為最終的聚類輸出。

而HDBSCAN是以可達距離作為領接邊權重,對所有節點構建最小生成樹,之后進行層次聚類

簇壓縮

我們將HDBSCAN的樣本點進行層次聚類,構造成上面的生成樹圖之后,HDBSCAN會進行一個壓縮樹的過程。它的原理是,對于我們生成的最小生成樹,從上往下遍歷,在一個簇被劃分為兩個子簇的過程中,如果子簇的樣本點數量小于設定的最小值(也就是前面可達距離的概念中設置的MinPts,那么這個小于MinPts的子簇將會不會被保留,子簇中的樣本將作為-1類被刪除。

簇選擇

在聚類的簇完成簇壓縮的過程后,此時我們得到了一個更小的最小生成樹,此時,我們需要開始決定保留那些簇作為我們的類。對于DBSCAN算法來說,實際上是在某個閾值下畫了一條線,來決定選取哪些類作為聚類類別。

DBSCAN的簇選擇方式
而HDBSCAN使用了一個簇穩定性的概念。

定義s為簇穩定性,其計算方式如下:

實際上是說,我們可以將 [公式] 看作是一個相似度,而簇穩定性則是說,在不同的 [公式] 的取值下,有一些簇會被合并為一個更大的簇,此時我們說這些被合并的簇“消失了”,而在一個 [公式] 值更小的時候,也就是相似度更低,不那么嚴格的情況下,這些簇剛剛被它們的子簇合并出來。也就是說,簇穩定性定義的是這些簇從第一次出現到被合并進更高層次的的簇的范圍,代表著這個簇的生存周期。在做簇選擇的時候,實際上要選擇那些簇穩定性最高的簇。那么選擇原則就是:

如果當前節點的穩定性大于兩個子節點的簇穩定性,將當前節點作為提取簇,不再提取其子節點;如果當前節點的穩定性小于兩個子節點的穩定性總和,將該節點設置為其子節點的穩定性之和

上圖中,只選擇了簇穩定性最高的簇
到這里,整個HDBSCAN的算法就介紹完了。

優點:

不需要自行設置閾值,只需定義最小簇的數量

計算消耗相對小,速度較快(使用最小生成樹建圖,并使用了簇壓縮)

參數敏感度較低

基于Graph的聚類算法–Chinese Whisper
下面說到基于Graph的聚類算法,這種類型的算法實際應用效果比較好,還挺重要的。其中代表的基礎算法Chinese Whisper還挺簡單的:

初始化:將所有的樣本點初始化為不同的類,自下而上的進行聚類

建圖:根據樣本點之間的距離,設定相似度,低于相似度閾值的兩個樣本點之間建立邊,高于閾值則無邊,由此構建加權無向圖,邊的權重為相似度

迭代:

  • 隨機選取一個節點i開始,在其相連節點中選取邊權重最大者j, 并將i歸為節點j類(若相連節點中有多個節點屬于同一類,則將這些權重相加再做比較)

  • 遍歷所有節點后,重復迭代至滿足迭代次數

  • 優點:不用設定k,只需指定相似度閾值

    缺點:

  • 對向量的要求度較高,需要向量能夠增大類間距離,減小類內距離

  • 由于隨機初始化,每次聚類的結果有可能不一致

  • 中間的節點可能被歸到任何一類,由于隨機初始化
    改進:

    CW需要自行設置相似度閾值,且該閾值敏感度較高,后續優化方向是自動選擇閾值,有興趣可以參考下面這篇論文:

    Linkage Based Face Clustering via GCN(CVPR2019)

    譜聚類是相對來說比較復雜的一個聚類算法,所以這里也不詳細展開說了,大概說一下它的原理:它解決的問題是kmeans中無法對非歐式空間的分布進行聚類的問題,主要原理是對聚類數據進行變換,然后進行k-means聚類,之后再還原到原空間。

    算法思路:它的主要思想是把所有的數據看做空間中的點,這些點之間可以用邊連接起來。距離較遠的兩個點之間的邊權重值較低,而距離較近的兩個點之間的邊權重值較高,通過對所有數據點組成的圖進行切圖,讓切圖后不同的子圖間邊權重和盡可能的低,而子圖內的邊權重和盡可能的高,從而達到聚類的目的。

    譜聚類的流程是:

    輸入:n個樣本, 類別k

    根據輸入的相似度的衡量方式對樣本建圖,根據相似圖建立鄰接矩陣W
    計算出拉普拉斯矩陣L, 其中L=D-W, D為度矩陣
    計算L的最小的k個特征向量u1, u2,…,uk(此步相當于降維),將這些向量組成為n*k維的矩陣U
    將U中的每一行作為一個樣本,共n個樣本,使用k-means對這n個樣本進行聚類
    得到簇劃分C(c1,c2,…ck).
    這里的拉普拉斯、度矩陣的推斷都需要一定篇幅,之前寫過一篇譜聚類的算法原理,有興趣可移步至:

    譜聚類的原理和優化目標

    這里只簡單介紹幾個概念:

    鄰接矩陣:

    鄰接矩陣是聚類中經常聽到的一個概念,實際上是表示定點之間相鄰關系的矩陣,也就是其實可以看作一個表格,每個元素代表兩個點的關聯程度

    最小割

    最小割是指去掉圖中的一些帶權邊,在使得圖從聯通圖變為不聯通圖的前提下,盡可能的讓去掉的邊權值之和盡可能小。對于數據的相似性圖來說,最小割就是要去除一些很弱的相似性,把數據點從一個互相連接的整體分為兩個或者多個獨立的部分,這其實就是一個聚類的過程

    具體的最小割的優化可參見:譜聚類的原理和優化目標

    優點:在算法中使用了降維,對于高維空間效果較好

    缺點:

  • 如果向量維度過高,而降維的幅度不夠,則最后的聚類效果與運行速度均不好

  • 需要提前知道k

  • 不同的領接矩陣的聚類結果可能不一樣

  • 最新
    這里再介紹兩篇比較新的論文,也可以看作是未來聚類的一個發展趨勢。在現在萬物皆可深度學習的潮流下,如今的聚類也開始向GNN(圖神經)網絡的方向去發展了。

    基于GNN的聚類
    GNN這塊的話,其實簡單來說,我們知道CNN的輸入是圖片,RNN的輸入是文本或者語音等序列,而GNN的輸入則是圖。實際上走的都是深度學習梯度下降的優化路線, 只是不同網絡的輸入不一樣而已。

    Learning to Cluster Faces on Affinity Graphy(CVPR2019)
    第一篇paper就是基于圖神經網絡(GCN)的聚類算法

    算法流程(級聯式的算法流程,類似mtcnn):

  • 將樣本點建圖(如何建圖可以參照前面圖聚類算法,實際上有很多種構建方式,主要取決于相似度如何衡量以及如何建邊)

  • Cluster Proposal:從前面建好的圖中選擇出多個sub-graph,也就是proposal,就是子圖的概念。(這里其實和Faster RCNN等檢測網絡有些像),這一步實際上主要是為了降低計算消耗,我們不在一整幅圖上去做聚類,而是在子圖上去做。每一個cluster proposal里的向量數是比較少的。比如說一個包含1M向量的全圖可以轉化為50K包含20向量的proposal

  • Cluster Detection: 將上面的Cluster Proposal利用GCN提取特征后聚類,計算預測類別與gt的差異,評價指標為:

  • 這個IoU目標檢測的同學應該很熟了,原理是類似的,總之是用這個指標來進行訓練

  • Cluster Segmentation: 上面那個模塊是檢測,這個模塊是剔除負樣本點,評價指標和上面那一步是一樣的。使用的loss均為MSE,訓練然后梯度下降
  • 這篇文章中還用到了Ablation Study,這也算是近年來Paper必備的一個部分吧。可以參考

    Affinity Graph: Graph在半監督學習和聚類上經常出現。Affinity graph的節點是數據樣本,邊代表數據之間的相似度。

    標題的Affinity Graphy也是在半監督學習中經常出現的一個術語,實際上就是指節點代表數據樣本,邊代表數據之間相似度的圖。

    CDP(ECCV2018)
    這一篇是針對人臉識別提出的優化算法,解決的是在大數據集下傳統算法聚類性能過差的問題

    級聯模型的思想,想象一下mtcnn。

    流程:

    該算法有3個部分,base model, committe model(決策者模型)和Mediator(融合模型), 其實就是base model建一個大圖,多個簡單的committe model對大圖進行斷邊,Mediator根據多個committe的結果來判斷兩個節點之間的邊是保留還是斷開。

    base model: 建knn圖

    Committe model: 多個committe model對base model建的圖,對每一條邊,判斷其是否應該斷開,輸出多個子圖

    Mediator: 集成committe輸出的pairs的關系,最終輸出聚類結果。看下圖,假設我們有6個committe model, 對于節點1和節點2的邊,所有的committe model均判斷其有邊,則保留邊;對于節點4,8,6個model中有四個committe model將其斷開,則mediator將其斷開,最后就會是節點4和節點8在不同的cluster中。

    各個模塊都是使用GCN來訓練,而非設置閾值

    優點: 只探索局部關系,因為它的主要計算量集中在兩個節點組成的pairs的關系,而不是整個圖的關系,計算效率較高,可以用于大規模數據集

    聚類算法選型
    下面是一點個人經驗,如何進行聚類算法選型

    ?特征:聚類算法達到瓶頸時,應該優化特征,減少類內距離,增大類間距離;對于雜質較多的特征,需要采取一定的過濾措施:如根據圖像質量、光照、模糊、內容識別等進行過濾

    ?參數配置:實際應用中能否知道“k”,如果不能,k-means和譜聚類就不能用

    ?性能: 聚類算法往往涉及兩兩計算相似度,如果算法不做優化時間消耗可能很大,常見優化如使用向量運算替換循環;像一些沒有經過計算效率優化的算法,如DBSCAN,其實在大規模數據集上是用不了的

    ?參數敏感度:聚類時需要考慮參數敏感度的分析,如果算法對參數過于敏感,可以尋找是否有基于當前算法的參數自調整算法;

    總結

    以上是生活随笔為你收集整理的常用聚类算法综述的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。