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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【聚类算法】sklearn聚类方法详解

發布時間:2025/3/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【聚类算法】sklearn聚类方法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:https://blog.csdn.net/ustbbsy/article/details/80960652
感謝博主

1 KMeans

1.1 算法描述

  • 隨機選擇k個中心
  • 遍歷所有樣本,把樣本劃分到距離最近的一個中心
  • 劃分之后就有K個簇,計算每個簇的平均值作為新的質心
  • 重復步驟2,直到達到停止條件
  • 停止條件:

    聚類中心不再發生變化;所有的距離最小;迭代次數達到設定值,

    代價函數:誤差平方和(SSE)

    1.2 算法優缺點

    優點:

    • 算法容易理解,聚類效果不錯
    • 具有出色的速度
    • 當簇近似高斯分布時,效果比較好

    缺點:

    • 需要自己確定K值,k值的選定是比較難確定
    • 對初始中心點敏感
    • 不適合發現非凸形狀的簇或者大小差別較大的簇
    • 特殊值/離群值對模型的影響比較大
    • ?從數據先驗的角度來說,在 Kmeans 中,我們假設各個 cluster 的先驗概率是一樣的,但是各個 cluster 的數據量可能是不均勻的。舉個例子,cluster A 中包含了10000個樣本,cluster B 中只包含了100個。那么對于一個新的樣本,在不考慮其與A cluster、 B cluster 相似度的情況,其屬于 cluster A 的概率肯定是要大于 cluster B的。

    1.3 效果評價

    從簇內的稠密程度和簇間的離散程度來評估聚類的效果。

    常見的方法有輪廓系數Silhouette Coefficient和Calinski-Harabasz Index

    1.3.1 輪廓系數

    輪廓系數(Silhouette Coefficient)結合了聚類的凝聚度(Cohesion)和分離度(Separation),用于評估聚類的效果。該值處于-1~1之間,值越大,表示聚類效果越好。具體計算方法如下:

  • 對于第i個元素x_i,計算x_i與其同一個簇內的所有其他元素距離的平均值,記作a_i,用于量化簇內的凝聚度。
  • 選取x_i外的一個簇b,計算x_i與b中所有點的平均距離,遍歷所有其他簇,找到最近的這個平均距離,記作b_i,用于量化簇之間分離度。
  • 對于元素x_i,輪廓系數s_i = (b_i – a_i)/max(a_i,b_i)
  • 計算所有x的輪廓系數,求出平均值即為當前聚類的整體輪廓系數
  • 先是計算每一個樣本的輪廓系數,然后計算所有樣本的輪廓系數,求平均值作為整體輪廓系數

    從上面的公式,不難發現若s_i小于0,a_i ?> b_i, 說明x_i與其簇內元素的平均距離大于最近的其他簇,表示聚類效果不好。如果a_i趨于0,或者b_i足夠大,那么s_i趨近與1,說明聚類效果比較好。

    相關代碼:

  • import numpy as np
  • from sklearn.cluster import KMeans
  • kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
  • labels = kmeans_model.labels_
  • metrics.silhouette_score(X, labels, metric='euclidean')
  • 1.3.2 Calinski-Harabasz Index

    這個不知道怎么翻譯,估計是兩個人名。

    類別內部數據的協方差越小越好,類別之間的協方差越大越好,這樣的Calinski-Harabasz分數會高。?
    在scikit-learn中, Calinski-Harabasz Index對應的方法是metrics.calinski_harabaz_score。

  • import numpy as np
  • from sklearn.cluster import KMeans
  • kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
  • labels = kmeans_model.labels_
  • metrics.calinski_harabaz_score(X, labels)
  • 參考博客:KMeans

    1.4 K值確定

    • 結合業務分析,確定需要分類的個數,這種情況往往有業務上聚類的個數范圍
    • 手肘原則,選定不同的K值,計算每個k值時的代價函數。Kmeans聚類的效果評估方法是SSE,是計算所有點到相應簇中心的距離均值,當然,k值越大?SSE越小,我們就是要求出隨著k值的變化SSE的變化規律,找到SSE減幅最小的k值,這時k應該是相對比較合理的值。

    如圖,在k=3之后,代價函數變化緩慢,選擇聚類的個數為3

    ?

    2 DBSCAN

    ? ? DBSCAN(Density-Based Spatial Clustering of Application with Noise)基于密度的空間聚類算法。

    兩個參數:

    ?

    • Eps鄰域半徑(epsilon,小量,小的值)
    • MinPts(minimum number of points required to form a cluster)定義核心點時的閾值。

    3個點

    ?

    • 核心點:對應稠密區域內部的點
    • 邊界點:對應稠密區域邊緣的點
    • 噪音點:對應稀疏區域中的點

    ?

    上圖紅色為核心點,黃色為邊界點,藍色為噪音點

    ????

    幾個概念:

    • 核心對象:對于任一樣本點,如果其Eps鄰域內至少包含MinPts個樣本點,那么這個樣本點就是核心對象。(一個點)
    • 直接密度可達:如果一個樣本點p處于一個核心對象q的Eps鄰域內,則稱該樣本點p從對象q出發時是直接密度可達的。
    • 密度相連:對于樣本點p和q,如果存在核心對象m,使得p、p均由m直接密度可達,則稱p和q密度相連。

    DBSCAN的聚類是一個不斷生長的過程。先找到一個核心對象,從整個核心對象出發,找出它的直接密度可達的對象,再從這些對象出發,尋找它們直接密度可達的對象,一直重復這個過程,直至最后沒有可尋找的對象了,那么一個簇的更新就完成了。也可以認為,簇是所有密度可達的點的集合。

    ????DBSCAN核心思想:從某個選定的核心點出發,不斷向密度可達的區域擴張,從而得到一個包含核心點和邊界點的最大化區域,區域中任意兩點密度相連。

    優點:

    ?

    • 不需要指定cluster的數目
    • 聚類的形狀可以是任意的
    • 能找出數據中的噪音,對噪音不敏感
    • 算法應用參數少,只需要兩個
    • 聚類結果幾乎不依賴于節點的遍歷順序

    缺點:

    ?

    • 如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。
    • DBSCAN算法的聚類效果依賴于距離公式的選取,實際中常用的距離是歐幾里得距離,由于‘維數災難’,距離的度量標準已變得不再重要。(分類器的性能隨著特征數量的增加而不斷提升,但過了某一值后,性能不升反而下降,這種現象稱為維數災難。對于維度災難的理解:維度災難的理解)
    • 不適合數據集中密度差異很大的情形,因為這種情形,參數Eps,MinPts不好選擇。(個人理解,如果是密度大的,你選一個小的鄰域半徑就可以把這些數據點聚類,但對于那些密度小的數據點,你設置的小的鄰域半徑,并不能把密度小的這些點給全部聚類。)

    聚類形狀可以是任意的,來個圖直觀感覺一下:

    在sklearn中的應用

  • from sklearn.cluster import DBSCAN
  • DBSCAN(eps=0.5, # 鄰域半徑
  • min_samples=5, # 最小樣本點數,MinPts
  • metric='euclidean',
  • metric_params=None,
  • algorithm='auto', # 'auto','ball_tree','kd_tree','brute',4個可選的參數 尋找最近鄰點的算法,例如直接密度可達的點
  • leaf_size=30, # balltree,cdtree的參數
  • p=None, #
  • n_jobs=1)
  • ?

    3 OPTICS

    ? ? 是基于密度的聚類算法,OPTICS(Ordering Point To Idenfy the Cluster Structure),不顯式地生成數據聚類,只是對數據對象集合中的對象進行排序,得到一個有序的對象列表。

    ?

    • 核心距離(core-distance)

    ? ? 給定參數eps,MinPts,使得某個樣本點成為核心對象(核心點)的最小鄰域半徑,這個最小鄰域半徑為該樣本點的核心距離。

    在DBSCAN中,給定領域半徑eps和MinPts可以確定一個核心對象,如果eps比較大,在核心對象的鄰域半徑eps內的點的總數就會大于你所設定的MinPts,所以核心距離就是一個核心點在滿足MinPts時的一個最小鄰域半徑。

    ?

    • 可達距離(reachability-distance)

    rd(y,x)表示使得‘x為核心點’且‘y從x直接密度可達’同時成立的最小鄰域半徑。

    ?

    參考資料

    https://blog.csdn.net/itplus/article/details/10089323

    4?Spectral Clustering 譜聚類

    ? ? ?1)概述

    ? ? ?Spectral Clustering(SC,即譜聚類),是一種基于圖論的聚類方法,它能夠識別任意形狀的樣本空間且收斂于全局最有解,其基本思想是利用樣本數據的相似矩陣進行特征分解后得到的特征向量進行聚類.它與樣本特征無關而只與樣本個數有關。

    ? ? ?基本思路:將樣本看作頂點,樣本間的相似度看作帶權的邊,從而將聚類問題轉為圖分割問題:找到一種圖分割的方法使得連接不同組的邊的權重盡可能低(這意味著組間相似度要盡可能低),組內的邊的權重盡可能高(這意味著組內相似度要盡可能高).

    ? ? ?2)圖解過程

    ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? 圖5

    ? ? ? ? ? 如上圖所示,斷開虛線,六個數據被聚成兩類。

    ? ? ?3)Spectral Clustering算法函數

    ? ? ? ? ?a)核心函數:sklearn.cluster.SpectralClustering

    ? ? ? ? ? ? ?因為是基于圖論的算法,所以輸入必須是對稱矩陣。

    ? ? ? ? b)主要參數(參數較多,詳細參數)

    ? ? ? ? ? ? ?n_clusters:聚類的個數。(官方的解釋:投影子空間的維度)

    ? ? ? ? ? ? ?affinity:核函數,默認是'rbf',可選:"nearest_neighbors","precomputed","rbf"或sklearn.metrics.pairwise_kernels支持的其中一個內核之一。

    ? ? ? ? ? ? ?gamma :affinity指定的核函數的內核系數,默認1.0

    ? ? ? ? c)主要屬性

    ? ? ? ? ? ??labels_ :每個數據的分類標簽

    5?Hierarchical Clustering 層次聚類

    1)概述

    ? ? ?Hierarchical Clustering(層次聚類):就是按照某種方法進行層次分類,直到滿足某種條件為止。

    ? ? ?主要分成兩類:

    ? ? ? ? ? a)凝聚:從下到上。首先將每個對象作為一個簇,然后合并這些原子簇為越來越大的簇,直到所有的對象都在一個簇中,或者某個終結條件被滿足。

    ? ? ? ? ? b)分裂:從上到下。首先將所有對象置于同一個簇中,然后逐漸細分為越來越小的簇,直到每個對象自成一簇,或者達到了某個終止條件。(較少用)

    ? ? ?2)算法步驟

    ? ? ? ? ??a)將每個對象歸為一類, 共得到N類, 每類僅包含一個對象. 類與類之間的距離就是它們所包含的對象之間的距離.

    ? ? ? ? ? b)找到最接近的兩個類并合并成一類, 于是總的類數少了一個.

    ? ? ? ? ??c)重新計算新的類與所有舊類之間的距離.
    ? ? ? ? ??d)重復第2步和第3步, 直到最后合并成一個類為止(此類包含了N個對象).

    ? ? ? 3)圖解過程

    ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖6

    ? ? ? ? ?4)Hierarchical Clustering算法函數

    ? ? ? ? ? ? ?a)sklearn.cluster.AgglomerativeClustering

    ? ? ? ? ? ? ?b)主要參數(詳細參數)

    ? ? ? ? ? ? ? ? ?n_clusters:聚類的個數

    ? ? ? ? ? ? ? ? ?linkage:指定層次聚類判斷相似度的方法,有以下三種:

    ? ? ? ? ? ? ? ? ? ? ? ? ? ward:組間距離等于兩類對象之間的最小距離。(即single-linkage聚類)

    ? ? ? ? ? ? ? ? ? ? ? ? ??average:組間距離等于兩組對象之間的平均距離。(average-linkage聚類)

    ? ? ? ? ? ? ? ? ? ? ? ? ??complete:組間距離等于兩組對象之間的最大距離。(complete-linkage聚類)

    ? ? ? ? ? ? ? c)主要屬性

    ? ? ? ? ? ? ? ? ??labels_: 每個數據的分類標簽

    參考資料?聚類算法

    6?Mean-shift 均值遷移

    1)概述

    ? ? ? ?Mean-shift(即:均值遷移)的基本思想:在數據集中選定一個點,然后以這個點為圓心,r為半徑,畫一個圓(二維下是圓),求出這個點到所有點的向量的平均值,而圓心與向量均值的和為新的圓心,然后迭代此過程,直到滿足一點的條件結束。(Fukunage在1975年提出)

    ? ? ? 后來Yizong?Cheng 在此基礎上加入了 核函數 和 權重系數 ,使得Mean-shift 算法開始流行起來。目前它在聚類、圖像平滑、分割、跟蹤等方面有著廣泛的應用。

    ? ? 2)圖解過程

    ? ? ? ?為了方便大家理解,借用下幾張圖來說明Mean-shift的基本過程。

    ? ? ? ?

    ? ? ? ? 由上圖可以很容易看到,Mean-shift 算法的核心思想就是不斷的尋找新的圓心坐標,直到密度最大的區域。

    ? ? 3)Mean-shift 算法函數

    ? ? ? ?a)核心函數:sklearn.cluster.MeanShift(核函數:RBF核函數)

    ? ? ? ? ? ?由上圖可知,圓心(或種子)的確定和半徑(或帶寬)的選擇,是影響算法效率的兩個主要因素。所以在sklearn.cluster.MeanShift中重點說明了這兩個參數的設定問題。

    ? ? ? ?b)主要參數

    ? ? ? ? ? ?bandwidth :半徑(或帶寬),float型。如果沒有給出,則使用sklearn.cluster.estimate_bandwidth計算出半徑(帶寬).(可選)

    ? ? ? ? ? ?seeds :圓心(或種子),數組類型,即初始化的圓心。(可選)

    ? ? ? ? ? ?bin_seeding :布爾值。如果為真,初始內核位置不是所有點的位置,而是點的離散版本的位置,其中點被分類到其粗糙度對應于帶寬的網格上。將此選項設置為True將加速算法,因為較少的種子將被初始化。默認值:False.如果種子參數(seeds)不為None則忽略。

    ? ? ? ?c)主要屬性

    ? ? ? ? ??cluster_centers_ : 數組類型。計算出的聚類中心的坐標。

    ? ? ? ? ??labels_ :數組類型。每個數據點的分類標簽。、

    7 BIRCH?

    這篇文章寫的很詳細,可以參考一下BIRCH

    8?GaussianMixtureModel(混合高斯模型,GMM)

    ? ? ? ??正太分布也叫高斯分布,正太分布的概率密度曲線也叫高斯分布概率曲線。

    ? ? ? ? GaussianMixtureModel(混合高斯模型,GMM)。

    ? ? ? ? ?聚類算法大多數通過相似度來判斷,而相似度又大多采用歐式距離長短作為衡量依據。而GMM采用了新的判斷依據:概率,即通過屬于某一類的概率大小來判斷最終的歸屬類別。

    ? ? ? ? GMM的基本思想就是:任意形狀的概率分布都可以用多個高斯分布函數去近似,也就是說GMM就是有多個單高斯密度分布(Gaussian)組成的,每個Gaussian叫一個"Component",這些"Component"線性加成在一起就組成了 GMM 的概率密度函數,也就是下面的函數。

    ? ? 2)數學公式

    ? ? ? ? ?

    ? ? ? ? ?這里不講公式的具體推導過程,也不實現具體算法。列出來公式只是方便理解下面的函數中為什么需要那些參數。

    ? ? ? ? ?K:模型的個數,即Component的個數(聚類的個數)

    ? ? ? ? ?為第k個高斯的權重

    ? ? ? ???p(x |k) 則為第k個高斯概率密度,其均值為μk,方差為σk

    ? ? ? ? ?上述參數,除了K是直接給定之外,其他參數都是通過EM算法估算出來的。(有個參數是指定EM算法參數的)

    ? ? ?3)GaussianMixtureModel 算法函數

    ? ? ? ? ?a)from sklearn.mixture.GaussianMixture

    ? ? ? ? ?b)主要參數(詳細參數)

    ? ? ? ? ? ? ?n_components :高斯模型的個數,即聚類的目標個數

    ? ? ? ? ? ??covariance_type : 通過EM算法估算參數時使用的協方差類型,默認是"full"

    ? ? ? ? ? ? ? ? ? full:每個模型使用自己的一般協方差矩陣

    ? ? ? ? ? ? ? ? ? tied:所用模型共享一個一般協方差矩陣

    ? ? ? ? ? ? ? ? ? diag:每個模型使用自己的對角線協方差矩陣

    ? ? ? ? ? ? ? ? ? spherical:每個模型使用自己的單一方差

    總結

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

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