可以使用模塊 sklearn.cluster
對未標(biāo)記的數(shù)據(jù)進(jìn)行 聚類(Clustering) 。
每個聚類算法都有兩個變體:一個是類,它實現(xiàn)了 fit
方法來學(xué)習(xí)訓(xùn)練數(shù)據(jù)上的簇,另一個是函數(shù),給定訓(xùn)練數(shù)據(jù),返回對應(yīng)于不同簇的整數(shù)標(biāo)簽數(shù)組。對于類,可以在 labels_
屬性中找到訓(xùn)練數(shù)據(jù)上的標(biāo)簽。
輸入數(shù)據(jù)
特別需要注意的一點是,本模塊實現(xiàn)的算法可以采用不同類型的矩陣作為輸入。所有算法的調(diào)用接口都接受 shape
[n_samples, n_features]
的標(biāo)準(zhǔn)數(shù)據(jù)矩陣。 這些矩陣可以通過使用sklearn.feature_extraction
模塊中的類獲得。對于AffinityPropagation
,SpectralClustering
和DBSCAN
也可以輸入 shape[n_samples, n_samples]
的相似矩陣,可以通過sklearn.metrics.pairwise
模塊中的函數(shù)獲得。
? scikit-learn 中聚類算法的比較
Method name(方法名稱) | Parameters(參數(shù)) | Scalability(可擴(kuò)展性) | Usecase(使用場景) | Geometry (metric used)(幾何圖形(公制)) |
---|---|---|---|---|
K-Means(K-均值) | number of clusters(聚類形成的簇的個數(shù)) | 非常大的 n_samples , 中等的 n_clusters 使用 MiniBatch 代碼) |
通用, 均勻的 cluster size(簇大?。? flat geometry(平面幾何), 不是太多的 clusters(簇) | Distances between points(點之間的距離) |
Affinity propagation | damping(阻尼), sample preference(樣本偏好) | Not scalable with n_samples(n_samples 不可擴(kuò)展) | Many clusters, uneven cluster size, non-flat geometry(許多簇,不均勻的簇大小,非平面幾何) | Graph distance (e.g. nearest-neighbor graph)(圖距離(例如,最近鄰圖)) |
Mean-shift | bandwidth(帶寬) | Not scalable with n_samples (n_samples 不可擴(kuò)展) |
Many clusters, uneven cluster size, non-flat geometry(許多簇,不均勻的簇大小,非平面幾何) | Distances between points(點之間的距離) |
Spectral clustering | number of clusters(簇的個數(shù)) | 中等的 n_samples , 小的 n_clusters |
Few clusters, even cluster size, non-flat geometry(幾個簇,均勻的簇大小,非平面幾何) | Graph distance (e.g. nearest-neighbor graph)(圖距離(例如最近鄰圖)) |
Ward hierarchical clustering | number of clusters(簇的個數(shù)) | 大的 n_samples 和 n_clusters |
Many clusters, possibly connectivity constraints(很多的簇,可能連接限制) | Distances between points(點之間的距離) |
Agglomerative clustering | number of clusters(簇的個數(shù)), linkage type(鏈接類型), distance(距離) | 大的 n_samples 和 n_clusters |
Many clusters, possibly connectivity constraints, non Euclidean distances(很多簇,可能連接限制,非歐氏距離) | Any pairwise distance(任意成對距離) |
DBSCAN | neighborhood size(neighborhood 的大?。?/td> | 非常大的 n_samples , 中等的 n_clusters |
Non-flat geometry, uneven cluster sizes(非平面幾何,不均勻的簇大?。?/td> | Distances between nearest points(最近點之間的距離) |
Gaussian mixtures(高斯混合) | many(很多) | Not scalable(不可擴(kuò)展) | Flat geometry, good for density estimation(平面幾何,適用于密度估計) | Mahalanobis distances to centers( 與中心的馬氏距離) |
Birch | branching factor(分支因子), threshold(閾值), optional global clusterer(可選全局簇). | 大的 n_clusters 和 n_samples |
Large dataset, outlier removal, data reduction.(大型數(shù)據(jù)集,異常值去除,數(shù)據(jù)簡化) |
當(dāng)簇具有一個特定的形狀,即非平面流體,并且標(biāo)準(zhǔn)歐氏距離不是正確的度量標(biāo)準(zhǔn)時,非平面幾何聚類是非常有用的。這種情況出現(xiàn)在上圖的前兩行中。
用于聚類(clustering)的高斯混合模型,將在文檔的另一章描述混合模型。KMeans可以看作是每個分量協(xié)方差相等的高斯混合模型的一個特例。
KMeans
算法通過把樣本分離成 n 個具有相同方差的類的方式來對數(shù)據(jù)進(jìn)行聚類,最小化一個稱為慣量或簇內(nèi)平方和的準(zhǔn)則(見下文)。該算法需要指定簇的數(shù)量。它可以很好地擴(kuò)展到大量樣本,并已經(jīng)在許多不同領(lǐng)域的應(yīng)用領(lǐng)域被廣泛使用。
k-means 算法將一組 樣本 劃分成 個不相交的簇 ,每個都用該簇中樣本的均值 描述。 這個均值通常被稱為簇的 “質(zhì)心”; 盡管它們處在同一個空間,但它們通常不是從 中挑選出的點,雖然它們是處在同一個空間。
K-means算法旨在選擇一個質(zhì)心, 能夠最小化慣性或簇內(nèi)平方和的標(biāo)準(zhǔn):
? $$\sum_{i=0}^{n} \min {\mu{j} \in C}\left(\left|x_{i}-\mu_{j}\right|^{2}\right)$$
慣性被認(rèn)為是測量簇內(nèi)聚程度的尺度。它有很多缺點:
K-means 通常被稱為 Lloyd 算法。簡單來說,算法有三個步驟。第一步是選擇初始質(zhì)心,最基本的方法是從數(shù)據(jù)集中選擇個樣本。初始化之后,K-means由其他兩個步驟之間的循環(huán)組成。第一步將每個樣本分配到其最近的質(zhì)心。第二步是通過取分配給前一個質(zhì)心的所有樣本的平均值來創(chuàng)建新的質(zhì)心。計算新舊質(zhì)心之間的差值,算法重復(fù)最后兩個步驟,直到該值小于閾值。換句話說,算法重復(fù)這個步驟,直到質(zhì)心不再明顯移動。
K-means 相當(dāng)于一個具有小的、完全相等的、對角協(xié)方差矩陣的期望最大化算法。
算法也可以通過 Voronoi diagrams(voronoi圖)的概念來理解。首先,使用當(dāng)前質(zhì)心計算點的Voronoi圖。Voronoi圖中的每個段成為一個單獨的簇。其次,將質(zhì)心更新為每個段的平均值。然后算法重復(fù)這個過程,直到滿足停止條件。通常,當(dāng)?shù)g目標(biāo)函數(shù)的相對下降量小于給定的公差值時,算法停止。在此實現(xiàn)中不是這樣的:當(dāng)質(zhì)心移動小于公差時迭代停止。
只要有足夠的時間,K-means 將總是收斂的,但這可能是局部的最小值。這很大程度上取決于質(zhì)心的初始化。 因此,初始化不同質(zhì)心的計算通常會進(jìn)行幾次。幫助解決這個問題的一種方法是 k-means++ 初始化方案,它已經(jīng)在 scikit-learn 中實現(xiàn)(使用 init='k-means++'
參數(shù))。 這將初始化質(zhì)心(通常)彼此遠(yuǎn)離,相對隨機(jī)初始化得到更好的結(jié)果,如參考文獻(xiàn)所示。
該算法支持樣本權(quán)重功能,樣本權(quán)重可以由參數(shù)sample_weight
給出。該功能允許計算簇中心和慣性值時為一些樣本分配更多的權(quán)重。 例如,給某個樣本分配一個權(quán)重值2,相當(dāng)于在數(shù)據(jù)集X中增加一個該樣本的重復(fù)項。
K-means可用于矢量量化。這是利用 KMeans
訓(xùn)練模型的變換方法實現(xiàn)的。
KMeans
通過Cython從基于OpenMP的并行性中獲益。并行處理小塊數(shù)據(jù)(256個樣本),這還會產(chǎn)生較低的內(nèi)存占用。有關(guān)如何控制線程數(shù)量的詳細(xì)信息,請參閱我們的Parallelism說明。
示例:
參考資料:
MiniBatchKMeans
是 KMeans
算法的變體,它使用小批量(mini-batches)來減少計算時間,同時仍然試圖優(yōu)化相同的目標(biāo)函數(shù)。小批量是輸入數(shù)據(jù)的子集,在每次訓(xùn)練迭代中隨機(jī)抽樣。這些小批量極大減少了收斂到局部解所需的計算量。 與其他降低 k-means 收斂時間的算法相比,小批量 k-means 產(chǎn)生的結(jié)果一般只比標(biāo)準(zhǔn)算法略差。
算法在兩個主要步驟之間迭代,類似于普通的k-means。在第一步中,從數(shù)據(jù)集中隨機(jī)抽取樣本,以形成一個小批量。然后把它們分配給最近的質(zhì)心。在第二步,質(zhì)心被更新。與k-means相比,這是在每個樣本的基礎(chǔ)上完成的。對于小批量的每個樣本,將通過對樣本和之前分配給該樣本的所有樣本的流平均值更新分配的質(zhì)心。這具有隨時間減少質(zhì)心變化率的效果。這些步驟一直執(zhí)行到收斂或達(dá)到預(yù)定的迭代次數(shù)。
MiniBatchKMeans
收斂速度比 KMeans
快 ,但是結(jié)果的質(zhì)量會降低。在實踐中,質(zhì)量差異可能非常小,如示例和引用的參考文獻(xiàn)所示。
示例:
參考文獻(xiàn):
AffinityPropagation
AP聚類是通過在樣本對之間發(fā)送消息直到收斂的方式來創(chuàng)建聚類。然后使用少量有代表性的樣本作為聚類中心來描述數(shù)據(jù)集,而這些樣本對可以被認(rèn)為是最能代表數(shù)據(jù)集中其它數(shù)據(jù)的樣本。把樣本對之間發(fā)送的消息作為一個樣本對另一個樣本的模范樣本的適合程度,適合程度值在根據(jù)來自其他對的值不斷更新。這種更新以迭代的方式進(jìn)行,直到收斂為止,此時會選擇最終的范例,從而給出最終的聚類。
Affinity Propagation 算法非常有趣,因為它可以根據(jù)提供的數(shù)據(jù)決定聚類的數(shù)量。 因此有兩個比較重要的參數(shù)是preference(控制使用多少模范樣本 )和阻尼因子(damping factor) 減少吸引信息和歸屬信息以避免更新信息時的數(shù)據(jù)振蕩。
AP聚類算法主要的缺點是它的復(fù)雜度。Affinity Propagation 聚類算法的時間復(fù)雜度是 , 其中是樣本的個數(shù) ,是收斂前迭代的次數(shù)。如果使用密集相似矩陣,其空間復(fù)雜度是。但如果使用稀疏相似性矩陣可以降低空間復(fù)雜度。 這使得Affinity Propagation 算法最適合中小型數(shù)據(jù)集。
示例:
Algorithm description(算法描述): 樣本之間傳遞的信息有兩種。 第一種是吸引信息 (responsibility) , 樣本 適合作為樣本 的聚類中心的程度。第二種是歸屬信息(availability) , 的合適程度。 這樣,選取示例樣本作為聚類中心, 如果 (1) 該樣本與其許多樣本相似,并且 (2) 被許多樣本選擇可以代表他們自己,樣本就會被選擇。
樣本對樣本吸引度計算公式為:
?
其中 是樣本 和樣本 之間的相似度。樣本 作為樣本 的示例樣本的合適程度:
?
算法開始時 和 都被置 0,然后開始迭代計算直到收斂。 為了防止更新數(shù)據(jù)時出現(xiàn)數(shù)據(jù)振蕩,在迭代過程中引入阻尼因子 :
? ?
其中 是迭代的次數(shù)。
MeanShift
算法目的是在一個平滑的樣本密度中返現(xiàn) blobs 。它是一種基于質(zhì)心的算法,其工作原理是將候選質(zhì)心的位置更新為給定區(qū)域內(nèi)點的平均值。然后在后處理階段對這些候選質(zhì)心位置進(jìn)行篩選,以消除近似重復(fù),形成最終的質(zhì)心集合。
給定第次迭代中的候選質(zhì)心 , 候選質(zhì)心的位置按照如下公式更新:
?
其中 是圍繞 周圍一個給定距離范圍內(nèi)的樣本鄰域, 是均值偏移向量(mean shift vector), 該向量是所有質(zhì)心中指向點密度增加最多的區(qū)域的偏移向量。使用以下等式計算,有效地將質(zhì)心更新為其鄰域內(nèi)樣本的平均值:
?
該算法自動設(shè)置簇的數(shù)量,而不是依賴參數(shù)bandwidth
指示要搜索的區(qū)域大小的參數(shù)。該參數(shù)可以手動設(shè)置,但如果未設(shè)置帶寬,可以使用提供的estimate_bandwidth
函數(shù)進(jìn)行估算 。
該算法不是高度可擴(kuò)展的,因為在執(zhí)行該算法時需要進(jìn)行多個最近鄰搜索。該算法保證收斂,但是當(dāng)質(zhì)心的變化較小時,該算法將停止迭代。
通過找到給定樣本的最近質(zhì)心來標(biāo)記新樣本。
示例:
參考文獻(xiàn):
SpectralClustering
對樣本之間的關(guān)聯(lián)矩陣執(zhí)行低維嵌入,然后在低維空間中對特征向量的分量進(jìn)行聚類(例如,通過K-Means聚類)。amg
求解器用于特征值問題,如果關(guān)聯(lián)矩陣是稀疏的,那么在計算效率會很高。(請注意,amg
求解器需要安裝pyamg模塊。)
當(dāng)前版本的SpectralClustering需要預(yù)先指定簇的數(shù)量。它適用于簇數(shù)量少時,簇數(shù)量多時不建議使用。
對于兩個簇,SpectralClustering解決了相似性圖形上歸一化切割問題的凸松弛問題:將圖形切割成兩半,以使所切邊緣的權(quán)重比每個簇內(nèi)邊緣的權(quán)重小。此標(biāo)準(zhǔn)特別有趣:當(dāng)處理圖形的頂點為像素,相似圖形的邊緣是圖像的漸變函數(shù)。
警告:將距離轉(zhuǎn)換為行為良好的相似性
請注意,如果相似性矩陣的值分布不均,例如具有負(fù)值或距離矩陣并不表示相似性,則 spectral problem 問題將變成奇異的,并且無法解決。在這種情況下,建議對矩陣的 entries 進(jìn)行轉(zhuǎn)換。例如,在有向距離矩陣上應(yīng)用heat kernel:
similarity = np.exp(-beta * distance / distance.std())
請參閱此類應(yīng)用程序的示例。
SpectralClustering
對應(yīng)的assign_labels
參數(shù),可以使用不同的標(biāo)簽分配策略。 "kmeans"
可以匹配更詳細(xì)的數(shù)據(jù)信息,但可能不穩(wěn)定。特別是,除非你可以控制random_state
,否則它可能無法復(fù)現(xiàn)運行的結(jié)果,因為它取決于隨機(jī)初始化。使用"discretize"
策略是100%可復(fù)現(xiàn)的,但往往會創(chuàng)建幾何形狀相當(dāng)均勻的閉合包。
譜聚類還可用于通過其頻譜嵌入對圖形進(jìn)行分區(qū)。在這種情況下,親和度矩陣是圖的鄰接矩陣,并且SpectralClustering可以由affinity='precomputed'
進(jìn)行初始化:
>>> from sklearn.cluster import SpectralClustering
>>> sc = SpectralClustering(3, affinity='precomputed', n_init=100,
... assign_labels='discretize')
>>> sc.fit_predict(adjacency_matrix)
參考文獻(xiàn):
層次聚類是一種通過連續(xù)合并或拆分內(nèi)置聚類來構(gòu)建最終聚類的聚類算法。聚類的層次結(jié)構(gòu)表示為樹(或樹形圖)。樹的根是所有的樣本中唯一的聚類,葉子是只有一個樣本的集群。有關(guān)更多詳細(xì)信息,請參見Wikipedia頁面。
AgglomerativeClustering
使用自下而上的方法執(zhí)行層次聚類:每個觀察都從其自己的聚類開始,并且聚類連續(xù)合并在一起。連接標(biāo)準(zhǔn)確定用于合并策略的度量標(biāo)準(zhǔn):
AgglomerativeClustering
在聯(lián)合使用同一個連接矩陣時,也可以擴(kuò)大到大量樣本,但是在樣本之間沒有添加連接約束時,在計算上代價很大:在每一步都要考慮所有可能的合并。
FeatureAgglomeration
使用凝聚聚類將看上去相似的特征組合在一起,從而減少特征的數(shù)量。它是一個降維工具, 請參閱 無監(jiān)督降維。
AgglomerativeClustering
支持Ward,single, average, 和 complete linkage 策略。
Agglomerative cluster 存在 “rich get richer” 現(xiàn)象,導(dǎo)致聚類大小不均勻。在這方面,Single linkage 是最差的策略,而Ward給出的規(guī)則大小最大。但是, affinity (或聚類中使用的距離)不能隨Ward一起變化,因此對于非歐氏度量,average linkage 是一個很好的選擇。average linkage雖然對嘈雜的數(shù)據(jù)的魯棒性并不強(qiáng),但是對規(guī)模較大的數(shù)據(jù)集提供了非常有效的層次聚類算法。 Single linkage 同樣對非全局?jǐn)?shù)據(jù)有很好的效果。
示例:
可以將表示聚類層次合并的樹可視化為樹狀圖。視覺檢查通常有助于理解數(shù)據(jù)的結(jié)構(gòu),在小樣本情況下更是如此。
AgglomerativeClustering
的一個有趣的特點是可以通過一個連接矩陣將連接約束添加到該算法中(只能將相鄰的聚類合并在一起),連接矩陣為每個樣本定義了遵循給定數(shù)據(jù)結(jié)構(gòu)的相鄰樣本。例如,在下面的swiss-roll示例中,連接約束禁止合并不相鄰的 swiss roll ,從而避免形成在 roll 上折疊的簇。
這些約束對于強(qiáng)加特定的局部結(jié)構(gòu)是有用的,而且也使算法更快,特別是當(dāng)樣本數(shù)量很大的時候。
連通性約束是通過連通性矩陣施加的:一個稀疏矩陣,其僅在行和列的交點處具有要連接的數(shù)據(jù)集索引。該矩陣可以由先驗信息構(gòu)建:例如,您可能希望僅通過具有指向彼此的鏈接的合并頁面來對web頁面進(jìn)行聚類。也可以從數(shù)據(jù)中得知,例如,sklearn.neighbors.kneighbors_graph
,用于限制與最近鄰的合并,如本例所示;或sklearn.feature_extraction.image.grid_to_graph
,如coin示例中,用于僅允許合并圖像上的相鄰像素 點。
示例:
警告:single, average and complete linkage的連接約束
single, average and complete linkage的連接約束可以增強(qiáng)聚合聚類中的 ‘rich getting richer’ 現(xiàn)象,尤其是如果他們是用sklearn.neighbors.kneighbors_graph
來構(gòu)建時。在少數(shù)簇的限制下,它們傾向于給出一些宏觀上占據(jù)的簇,并且?guī)缀跏强盏拇?。(請參?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" style="text-decoration: none; color: #1e6bb8; word-wrap: break-word; font-weight: bold; border-bottom: 1px solid #1e6bb8;">帶結(jié)構(gòu)和無結(jié)構(gòu)的凝聚聚類的討論 )。就此問題而言,single是最脆弱的linkage選項。
Single, verage and complete linkage 可以使用各種距離 (or affinities), 特別是歐氏距離 (l2), 曼哈頓距離(Manhattan distance)(or Cityblock, or l1), 余弦距離(cosine distance), 或者任何預(yù)先計算的關(guān)聯(lián)矩陣(affinity matrix).
選擇度量標(biāo)準(zhǔn)的知道原則是使得不同類樣本之間距離最大化,并且最小化同類樣本之間的距離
示例:
該DBSCAN
算法將簇視為低密度區(qū)域?qū)⒏呙芏葏^(qū)域分隔開。由于這種相當(dāng)通用的觀點,DBSCAN發(fā)現(xiàn)的簇可以是任何形狀,而k-均值假定簇是凸形的。DBSCAN的核心組件是core samples,即高密度區(qū)域中的樣本。因此,一個簇是一組核心樣本,每個樣本彼此接近(通過某種距離度量來衡量),以及一組與核心樣本接近(但本身不是核心樣本)的非核心樣本。該算法有兩個參數(shù), min_samples
和eps
,它們正式定義了我們說稠密 (dense)時的含義。更高的min_samples
或更低的eps
都表示形成簇所需的更高密度。
更正式地說,我們將核心樣本定義為數(shù)據(jù)集中的一個樣本的 eps
距離范圍內(nèi)的min_samples
其他樣本,以便在距離內(nèi)存在其他樣本eps
,這些樣本被定義為核心樣本的鄰居。這告訴我們核心樣本位于向量空間的稠密區(qū)域。 簇中還具有一組非核心樣本,它們是簇中核心樣本的鄰居的樣本,但本身并不是核心樣本。 顯然,這些樣本位于簇的邊緣。
根據(jù)定義,任何核心樣本都是簇的一部分,任何不是核心樣本并且和任意一個核心樣本距離都大于eps
的樣本將被視為異常值。
參數(shù)min_samples
主要控制算法對噪聲的容忍度(當(dāng)處理大型噪聲數(shù)據(jù)集時, 需要考慮增加該參數(shù)的值), 如何選擇適當(dāng)?shù)?code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; color: #1e6bb8; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all;">eps 對具體地數(shù)據(jù)集和距離函數(shù)非常關(guān)鍵,通常不能使用默認(rèn)值。參數(shù)eps
控制了點地領(lǐng)域范圍。如果取值太小,大多數(shù)數(shù)據(jù)并不會被聚類(并將“噪音”標(biāo)記為-1); 如果取值太大,可能會導(dǎo)致相近的多個簇被合并成一個,并最終將整個數(shù)據(jù)集分配到單個簇返回。文獻(xiàn)上已經(jīng)討論過了一些啟發(fā)式(heuristics)參數(shù)選擇方法。例如,在最近鄰距離圖種,基于Knee的參數(shù)選擇方式(如下面的參考文獻(xiàn)中所討論的)。
在下圖中,顏色表示簇成員屬性,大圓圈表示算法找到的核心樣本。較小的圓圈表示仍是簇的一部分的非核心樣本。 此外,下面的黑點表示異常值。
示例:
實現(xiàn)
DBSCAN 算法是確定性的,當(dāng)以相同的順序給出相同的數(shù)據(jù)時總是形成相同的簇。 然而,當(dāng)以不同的順序提供數(shù)據(jù)時,結(jié)果可能不相同。首先,盡管核心樣本總是被分配給相同的簇,但這些簇的標(biāo)簽將取決于數(shù)據(jù)中遇到這些樣本的順序。其次,更重要的是,分配給非核心樣本的簇可能因數(shù)據(jù)順序而有所不同。 當(dāng)一個非核心樣本到兩個不同簇的核心樣本的距離都小于 eps
時,就會發(fā)生這種情況。 根據(jù)三角不等式,這兩個核心樣本距離必須大于 eps
,否則他們將處于同一個簇中。 非核心樣本將被分配給在數(shù)據(jù)傳遞過程中首先生成的任何簇,因此結(jié)果也將取決于數(shù)據(jù)排序。
當(dāng)前版本使用 ball trees 和 kd-trees 來確定點的領(lǐng)域,從而避免了計算完整的距離矩陣 (就像在0.14之前的scikit-learn版本中所做的那樣)。保留使用自定義指標(biāo)(custom metrics)的可能性。更多細(xì)節(jié)請參照 NearestNeighbors
。
在大規(guī)模樣本上運行時的內(nèi)存消耗
這個實現(xiàn)在默認(rèn)情況下內(nèi)存效率不高,因為在不能使用 kd-trees 或 ball-trees 的情況下情況下構(gòu)建一個完整的相似度矩陣(例如,使用稀疏矩陣情況下)。這個矩陣會消耗n2個浮點數(shù)。 解決這個問題的幾種機(jī)制:
extract_dbscan
方式。 OPTICS 聚類算法同樣需要計算全結(jié)對矩陣(full pairwise matrix),但每次僅在內(nèi)存中保持一行(內(nèi)存復(fù)雜度為 n)。metric='precomputed'
來運行 dbscan。sample_weight
參數(shù)。參考文獻(xiàn):
OPTICS算法與DBSCAN算法有許多相似之處,可以認(rèn)為是DBSCAN算法的推廣,將eps
要求從一個值放寬到一個值范圍。OPTICS與DBSCAN的只要區(qū)別在于OPTICS算法建立了一個可達(dá)性圖,它為每個樣本分配了一個reachability_
距離(可達(dá)性距離)和一個簇ordering_
屬性中的點;擬合模型時會分配這兩個屬性,用于確定簇的成員關(guān)系。如果運行OPTICS時max_eps
設(shè)置為默認(rèn)值inf
,則可以使用cluster_optics_dbscan
方法對任意給定的eps
值在線性時間內(nèi)針對任何給定值重復(fù)執(zhí)行DBSCAN
樣式的簇提取。將max_eps
設(shè)置為較低的值將縮短運行時間,并可以視為從每個點開始尋找其他可能的可到達(dá)點的最大鄰域半徑。
OPTICS生成的可達(dá)性距離允許在單個數(shù)據(jù)集中進(jìn)行可變密度的簇提取。如上圖所示,將可達(dá)性距離和數(shù)據(jù)集
ordering_
結(jié)合生成可達(dá)性圖,其中點密度在Y軸上表示,并且對點進(jìn)行排序以使附近的點相鄰。在單個值處“切割”可達(dá)性圖會產(chǎn)生類似DBSCAN
的結(jié)果; “切割”上方的所有點都會被歸類為噪聲,每次從左到右讀取時都表示新的簇。使用OPTICS進(jìn)行默認(rèn)的簇提取時,會查看圖中的陡峭斜率以查找簇,用戶可以使用參數(shù)xi
定義什么算作陡峭斜率。還可以對圖形本身進(jìn)行其他分析,例如通過可達(dá)性圖樹狀圖生成數(shù)據(jù)的層次表示,并且可以通過cluster_hierarchy_
參數(shù)訪問算法檢測到的聚類的層次。上面的圖已經(jīng)過顏色編碼,因此平面空間中的簇顏色與可達(dá)性圖的線性段簇匹配。請注意,藍(lán)色和紅色群集在可達(dá)性圖中相鄰,可以分層次地表示為較大父簇的子簇。
示例:
與DBSCAN相比
OPTICS cluster_optics_dbscan
方法和DBSCAN的結(jié)果非常相似,但并不總是相同; 具體而言,是在標(biāo)記離群點和噪聲點方面。這部分是因為由OPTICS處理的每個密集區(qū)域的第一個樣本具有大的可達(dá)性值,使得接近其區(qū)域中的其他點,因此有時將被標(biāo)記為噪聲而不是離群點。當(dāng)它們被視為被標(biāo)記為離群點或噪聲的候選點時,這會影響相鄰點的判斷。
請注意,對于任何單個值eps,DBSCAN的運行時間往往比OPTICS短; 但是,對于不同eps 值的重復(fù)運行,單次運行OPTICS可能需要比DBSCAN更少的累積運行時間。同樣重要的是要注意的是OPTICS的輸出接近DBSCAN的只有eps和max_eps接近。
計算復(fù)雜度
采用空間索引樹以避免計算整個距離矩陣,并允許在大量樣本上有效地使用內(nèi)存??梢酝ㄟ^metric
關(guān)鍵字提供不同的距離度量。
對于大型數(shù)據(jù)集,可以通過HDBSCAN
獲得類似(但不相同)的結(jié)果 。HDBSCAN實現(xiàn)是多線程的,并且具有比OPTICS更好的算法運行時間復(fù)雜性,代價是更高的內(nèi)存代價。對于使用HDBSCAN將耗盡系統(tǒng)內(nèi)存的極大數(shù)據(jù)集,OPTICS將維持n(而不是n^2)內(nèi)存縮放; 然而,可能需要使用max_eps
參數(shù)的調(diào)優(yōu)來在合理的時間內(nèi)給出解。
參考文獻(xiàn):
該Birch
為給定數(shù)據(jù)構(gòu)建了一個稱為聚類特征樹 (CFT)的樹。數(shù)據(jù)本質(zhì)上是被有損壓縮到一組“聚類特征”節(jié)點(CF Nodes)上。CF Nodes 具有許多稱為聚類特征的子簇(CF Subclusters),并且位于非終端位置的 CF 子簇可以將 CF 節(jié)點作為子節(jié)點。
CF Subclusters 保存了用于簇的必要信息,從而避免了將整個輸入數(shù)據(jù)保存在內(nèi)存中。這些信息包括:
Birch 算法有兩個參數(shù),閾值和分支因子。分支因子限制了節(jié)點中子簇的數(shù)量,而閾值則限制了新輸入樣本與現(xiàn)有子簇之間的距離。
該算法可以視為一種實例或?qū)?shù)據(jù)簡化的方法,因為它將輸入數(shù)據(jù)簡化為一組直接從CFT葉子結(jié)點中獲取的一組子簇。被簡化的數(shù)據(jù)可以通過將其集合到全局簇 (global clusterer) 來進(jìn)一步處理??梢酝ㄟ^n_clusters
來設(shè)置global clusterer)。如果n_clusters
設(shè)置為 “none”,則直接讀取葉子節(jié)點中的子簇,否則全局聚類步驟會將這些子簇標(biāo)記為全局簇(標(biāo)簽),然后將樣本映射到最近的子簇的全局簇的標(biāo)簽。
算法描述:
Birch or MiniBatchKMeans?
n_features
大于20,通常使用 MiniBatchKMeans 更好。How to use partial_fit?
為了避免對 global clustering 的計算,每次調(diào)用 partial_fit
,建議進(jìn)行如下操作:
n_clusters=None
。partial_fit
訓(xùn)練所有數(shù)據(jù)。brc.set_params(n_clusters=n_clusters)
,設(shè)置 n_clusters
為必需值。partial_fit
, 即 brc.partial_fit()
執(zhí)行全局聚類。
參考資料:
評估聚類算法的性能并不像統(tǒng)計錯誤數(shù)量或計算監(jiān)督分類算法的準(zhǔn)確率和召回率那么簡單。特別是任何度量指標(biāo)不應(yīng)考慮簇標(biāo)簽的絕對值,而是如果這個聚類方式分離的數(shù)據(jù)類似與一些真實類或滿足某些假設(shè),這樣在同于一個相似性度量下,屬于同一個類內(nèi)的成員比不同類的成員更加類似。
已知真實簇標(biāo)簽分配 labels_true
和我們的聚類算法是基于相同樣本所得到的 labels_pred
,**調(diào)整后的蘭德指數(shù)是一個函數(shù),它測量兩個簇標(biāo)簽分配的值的 **相似度 ,忽略排列(permutations)和 機(jī)會歸一化(chance normalization):
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
在預(yù)測的標(biāo)簽列表中重新排列 0 和 1, 把 2 重命名為 3, 得到相同的得分:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
0.24...
此外, adjusted_rand_score
是 對稱的(symmetric) : 交換參數(shù)不會改變得分。它可以作為一種 共識度量(consensus measure):
>>> metrics.adjusted_rand_score(labels_pred, labels_true)
0.24...
完美標(biāo)簽的得分為1.0:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
1.0
不良標(biāo)簽 (e.g. 獨立標(biāo)簽(independent labelings)) 的得分是負(fù)數(shù)或接近于0.0:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
-0.12...
n_clusters
和 n_samples
的任何值,(隨機(jī)(統(tǒng)一)標(biāo)簽分配的 ARI 得分接近于 0.0)(這并不適用于原始的 Rand index 或者 V-measure 的情況)。與慣性相反,**ARI需要了解真實簇信息,**而在實踐中幾乎是不可用的,或者需要人工標(biāo)注者手動分配(如在監(jiān)督學(xué)習(xí)環(huán)境中)。
但是,
示例:
如果 C 是一個真實簇的標(biāo)簽分配, K 是簇的個數(shù),定義 和 為:
原始(未排序)的 蘭德指數(shù) 由下式給出:
其中 是數(shù)據(jù)集中可能的數(shù)據(jù)對總數(shù)(未排序)。
然而,RI評分并不能保證隨機(jī)標(biāo)簽分配會得到接近于零的值(特別是,如果簇的數(shù)量與樣本數(shù)量具有相同的數(shù)量級)。
為了抵消這種影響,我們可以通過定義 adjusted Rand index 來低估(discount)隨機(jī)標(biāo)簽的預(yù)期 RI
,如下所示:參考資料:
已知真實簇的標(biāo)簽分配 labels_true
和我們的聚類算法基于相同樣本所得到的 labels_pred
, 互信息 是度量兩個標(biāo)簽分配的 一致性的函數(shù),忽略排列。這種度量方案有兩個不同的歸一化版本,Normalized Mutual Information(NMI) 和 Adjusted Mutual Information(AMI)。NMI 經(jīng)常在文獻(xiàn)中使用,而 AMI 最近才提出的,并且 隨偶然性而歸一化(normalized against chance) :
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504...
在預(yù)測的標(biāo)簽列表中重新排列 0 和 1, 把 2 重命名為 3, 得到相同的得分:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
0.22504...
全部的, mutual_info_score
, adjusted_mutual_info_score
和 normalized_mutual_info_score
是對稱的: 交換參數(shù)不會更改得分。因此,它們可以用作共識度量(consensus measure):
>>> metrics.adjusted_mutual_info_score(labels_pred, labels_true)
0.22504...
完美標(biāo)簽得分是 1.0:
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
1.0
>>> metrics.normalized_mutual_info_score(labels_true, labels_pred)
1.0
而 mutual_info_score
不是這樣,因為它更難判斷:
>>> metrics.mutual_info_score(labels_true, labels_pred)
0.69...
不良標(biāo)簽 (例如(無相關(guān)標(biāo)簽)independent labelings) 具有非正分?jǐn)?shù):
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.adjusted_mutual_info_score(labels_true, labels_pred)
-0.10526...
n_clusters
和 n_samples
取任何值(這不適用于原始 Rand index 或 V-measure 的情況)。與慣量相反,MI-based measures 需要先得知 ground truth classes ,而在實踐中幾乎從來沒有使用過,或者需要人工標(biāo)注者手動分配(如在監(jiān)督學(xué)習(xí)環(huán)境中)。
然而,基于 MI 的測量方式(MI-based measures)也可在完全無監(jiān)督的情況下作為聚類模型選擇過程中共識索引的一個構(gòu)建模塊。
NMI 和 MI 不能進(jìn)行使得隨機(jī)標(biāo)簽度量的得分為0的調(diào)整。
示例:
假設(shè)兩個標(biāo)簽分配(在相同的 N 個對象中進(jìn)行), 和 。 它們的熵是一個分區(qū)集合的不確定性量,被定義為:
其中: 是從 中選取的對象,選取對象落入類 的概率。同樣對于:
采用 , 和 之間的mutual information (MI) 由下式計算:
其中 是隨機(jī)選擇的對象同時落入兩個類的概率 和
也可以用設(shè)定的基數(shù)表達(dá)式表示:
normalized mutual可以定義為:
mutual information 的值以及歸一化變量的值都不會隨著隨機(jī)標(biāo)簽度量進(jìn)行調(diào)整,但是會隨著不同的簇標(biāo)簽數(shù)量的增加而增加,不管標(biāo)簽分配之間的 “mutual information” 的實際數(shù)量是多少。
可以用以下公式[VEB2009]來計算 mutual information 的期望值。在這個方程式中 , 中元素的數(shù)量) 和 (中元素的數(shù)量).
使用期望值,然后可以使用與調(diào)整后的蘭德指數(shù)相似的形式來計算調(diào)整后的mutual information:
對于歸一化互信息和調(diào)整互信息,歸一化值通常是每個聚類熵的某個廣義均值。存在在各種廣義的手段,并且不存在一種確定的規(guī)則確定某種方法優(yōu)于其他方法。這個決定很大程度上根據(jù)不同領(lǐng)域有不同方法;例如,在社區(qū)檢測算法(Community Detection)中,算術(shù)平均是最為常見。每一種歸一化方法都提供了定性相似行為(qualitatively similar behaviours)[YAT2016]。在我們的實現(xiàn)中,這由average_method
參數(shù)控制的。
Vinh等(2010)用平均法命名NMI和AMI的變體[VEB2010]。它們的“ sqrt”和“ sum”平均值是幾何和算術(shù)平均值;我們使用這些更廣泛的通用名稱。
參考文獻(xiàn):
Strehl, Alexander, and Joydeep Ghosh (2002). “Cluster ensembles – a knowledge reuse framework for combining multiple partitions”. Journal of Machine Learning Research 3: 583–617. doi:10.1162/153244303321897735.
VEB2009Vinh, Epps, and Bailey, (2009). “Information theoretic measures for clusterings comparison”. Proceedings of the 26th Annual International Conference on Machine Learning - ICML ‘09. doi:10.1145/1553374.1553511. ISBN 9781605585161.
VEB2010Vinh, Epps, and Bailey, (2010). “Information Theoretic Measures for Clusterings Comparison: Variants, Properties, Normalization and Correction for Chance”. JMLR http://jmlr.csail.mit.edu/papers/volume11/vinh10a/vinh10a.pdf
YAT2016Yang, Algesheimer, and Tessone, (2016). “A comparative analysis of community detection algorithms on artificial networks”. Scientific Reports 6: 30750. doi:10.1038/srep30750.
已知真實簇的標(biāo)簽分配,可以使用條件熵(conditional entropy)分析定義一些直觀的度量(intuitive metric)。
特別是 Rosenberg 和 Hirschberg (2007) 為任何簇的分配定義了以下兩個理想的目標(biāo):
我們可以把這些概念轉(zhuǎn)化為得分 homogeneity_score
和 completeness_score
。兩者均在 0.0 以下 和 1.0 以上(越高越好):
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>> metrics.homogeneity_score(labels_true, labels_pred)
0.66...
>>> metrics.completeness_score(labels_true, labels_pred)
0.42...
稱為 V-measure 的調(diào)和平均數(shù)由 v_measure_score
計算得出:
>>> metrics.v_measure_score(labels_true, labels_pred)
0.51...
該函數(shù)的公式如下:
beta
默認(rèn)為1.0,但對于beta小于1時,為:
>>> metrics.v_measure_score(labels_true, labels_pred, beta=0.6)
0.54...
更大的beta
權(quán)重將提高同質(zhì)性,當(dāng)使用大于1的beta
值時:
>>> metrics.v_measure_score(labels_true, labels_pred, beta=1.8)
0.48...
更大的beta
權(quán)重將提高完整性。
V-measure 實際上等價于上面討論的 mutual information (NMI) , 僅聚合函數(shù)(aggregation function)是算術(shù)均值[B2011]。
同質(zhì)性, 完整性 和 V-measure 可以使用 homogeneity_completeness_v_measure
進(jìn)行計算,計算方法如下:
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...
(0.66..., 0.42..., 0.51...)
以下聚類分配稍微好一些,因為它是同質(zhì)但并不完整:
>>> labels_pred = [0, 0, 0, 1, 2, 2]
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
(1.0, 0.68..., 0.81...)
注意:
v_measure_score
是對稱的:可用于評估同一數(shù)據(jù)集上兩個獨立的標(biāo)簽分配。
completeness_score
和homogeneity_score
的情況并非如此:兩者都受以下關(guān)系約束:homogeneity_score(a, b) == completeness_score(b, a)
先前引入的度量標(biāo)準(zhǔn)并不針對隨機(jī)標(biāo)記進(jìn)行標(biāo)準(zhǔn)化: 這意味著,根據(jù)樣本數(shù)量,簇數(shù)量和標(biāo)定過的真實數(shù)據(jù)類數(shù)量,完全隨機(jī)的標(biāo)注方式并不總是產(chǎn)生同質(zhì)性,完整性 和 v-measure 的相同值。特別是特別是當(dāng)簇數(shù)量很大時,隨機(jī)標(biāo)記不會產(chǎn)生零分。
當(dāng)樣本數(shù)量超過 1000且簇的數(shù)量小于 10 時,可以安全地忽略此問題。對于較小的樣本數(shù)量或者較大數(shù)量的簇,使用 adjusted index (例如 Adjusted Rand Index (ARI))。
這,而實踐中卻幾乎不可用,或者需要或需要人工標(biāo)注者人工分配(如在受監(jiān)督的學(xué)習(xí)環(huán)境中)。
示例: |
---|
聚類表現(xiàn)評估中的機(jī)會調(diào): 分析數(shù)據(jù)集大小對隨機(jī)分配聚類度量值的影響。 |
同質(zhì)性和完整性的得分由下面公式給出:
其中是給定簇分配的類的條件熵 ,由下式給出:
是 已聚合的類的熵 (entropy of the classes),并且由下式給出:
個樣本總數(shù), 和 分別屬于 類 和 簇 的樣本數(shù),最后 分配給 簇 的類, 的樣本數(shù)。
給定類分配的簇的條件熵(conditional entropy of clusters given class) 和 簇的熵 以對稱的形式 義。
Rosenberg 和 Hirschberg 進(jìn)一步定義 V-measure 作為 同質(zhì)性和完整性的調(diào)和均值:
參考資料
V-Measure: A conditional entropy-based external cluster evaluation measure Andrew Rosenberg and Julia Hirschberg, 2007 [B2011] Identication and Characterization of Events in Social Media, Hila Becker, PhD Thesis.
當(dāng)已標(biāo)定樣本的真實類分配已知時,可以使用 Fowlkes-Mallows 指數(shù) (sklearn.metrics.fowlkes_mallows_score
) 。Fowlkes-Mallows 得分 FMI 被定義為 成對的準(zhǔn)確率和召回率的幾何平均值:
其中 TP
是 真正例(True Positive) 的數(shù)量(即真標(biāo)簽組和預(yù)測標(biāo)簽組中屬于相同簇的點對數(shù)),FP
是 假正例(False Positive) (即不在預(yù)測標(biāo)簽組,僅在真標(biāo)簽組中屬于同一簇的點對數(shù)),FN
是 假負(fù)例(False Negative) 的數(shù)量(即不在真實標(biāo)簽組中,僅在預(yù)測標(biāo)簽組中屬于同一簇的點對數(shù))。
得分范圍為 0 到 1。較高的值表示兩個簇之間的良好相似性。
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]Copy
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.47140...Copy
在預(yù)測的標(biāo)簽列表中重新排列 0 和 1, 把 2 重命名為 3, 得到相同的得分:
>>> labels_pred = [1, 1, 0, 0, 3, 3]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.47140...Copy
完美的標(biāo)簽得分是 1.0:
>>> labels_pred = labels_true[:]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
1.0Copy
不良標(biāo)簽(例如,無相關(guān)標(biāo)簽)的得分為 0:
>>> labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
>>> labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)
0.0
n_clusters
和 n_samples
取任何值(但并不適用于原始的Rand index 或 V-measure )。參考資料
E. B. Fowkles and C. L. Mallows, 1983. “A method for comparing two hierarchical clusterings”. Journal of the American Statistical Association. http://wildfire.stat.ucla.edu/pdflibrary/fowlkes.pdf Wikipedia entry for the Fowlkes-Mallows Index
如果真實簇標(biāo)簽不知道,則必須使用模型本身進(jìn)行度量。Silhouette 系數(shù) (sklearn.metrics.silhouette_score
) 這種度量的一個示例,其中較高的 Silhouette 系數(shù)得分和具有更好定義的聚類的模型有關(guān)。Silhouette 系數(shù)根據(jù)每個樣本進(jìn)行定義,由兩個得分組成:
給出單個樣本的 Silhouette 系數(shù) s :
其中每個樣本的 Silhouette 系數(shù)的平均值可以使用一組樣本的 Silhouette 系數(shù)。
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> X, y = datasets.load_iris(return_X_y=True)
在正常使用情況下,將 Silhouette 系數(shù)應(yīng)用于聚類結(jié)果的分析。
>>> 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')
0.55...
參考資料:
Peter J. Rousseeuw (1987). “Silhouettes: a Graphical Aid to the Interpretation and Validation of Cluster Analysis”. Computational and Applied Mathematics 20: 53–65. doi:10.1016/0377-0427(87)90125-7.
示例:
基于KMeans聚類分析使用silhouette選擇聚類的數(shù)目 : 在此示例中,silhouette 分析用于為 n_clusters 選擇最佳值.
當(dāng)不知道真實簇標(biāo)簽時,可使用 Calinski-Harabaz 指數(shù) (sklearn.metrics.calinski_harabaz_score
)(也稱為方差比準(zhǔn)則)來評估模型,其中較高的 Calinski-Harabaz 得分和能夠更好定義的聚類模型有關(guān)。
該指數(shù)是通過簇間色散平均值(between-clusters dispersion mean)與簇內(nèi)色散之間(within-cluster dispersion)的比值給出的(其中,離散度定義為距離平方的總和):
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> X, y = datasets.load_iris(return_X_y=True)
在正常使用中,將 Calinski-Harabasz 指數(shù)應(yīng)用于聚類分析的結(jié)果:
>>> 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_harabasz_score(X, labels)
561.62...
對于 簇,Calinski-Harabaz 得分 是通過簇間色散平均值(between-clusters dispersion mean)與 簇內(nèi)色散之間(within-cluster dispersion)的比值給出的:
其中 是組間色散矩陣(between group dispersion matrix), 是簇內(nèi)色散矩陣(within-cluster dispersion matrix):
為簇 中的點集, 為簇 的中心, 為 的中心, 為簇 中的點數(shù)。
參考文獻(xiàn)
Caliński, T., & Harabasz, J. (1974). “A Dendrite Method for Cluster Analysis”. Communications in Statistics-theory and Methods 3: 1-27. doi:10.1080/03610927408827101.
如果不知道真實簇標(biāo)簽,則可以使用Davies-Bouldin指數(shù)sklearn.metrics.davies_bouldin_score
度量模型,其中較低的Davies-Bouldin指數(shù)與具有更好簇間分割表現(xiàn)的模型。
該指數(shù)表示簇之間的平均“相似度”,其中相似度是將簇之間的距離與簇本身的大小進(jìn)行比較的度量。
零是最低的分?jǐn)?shù)。值越接近零表示更好的分割。
在正常使用中,將Davies-Bouldin索引應(yīng)用于簇分析的結(jié)果,如下所示:
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> X = iris.data
>>> from sklearn.cluster import KMeans
>>> from sklearn.metrics import davies_bouldin_score
>>> kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
>>> labels = kmeans.labels_
>>> davies_bouldin_score(X, labels)
0.6619...
該指數(shù)被定義為每個簇 ()和它的最大相似度 之間的平均相似度,在該指數(shù)的上下文里,:
, 簇 內(nèi)每個點和簇心的平均距離 -- 也稱簇直徑。
, 簇質(zhì)心 和 之間的距離。
以下是一個簡單構(gòu)建 的方法,使得它具有非負(fù)性和對稱性:
然后將Davies-Bouldin索引定義為:
參考文獻(xiàn)
Davies, David L.; Bouldin, Donald W. (1979). “A Cluster Separation Measure” IEEE Transactions on Pattern Analysis and Machine Intelligence. PAMI-1 (2): 224-227. doi:10.1109/TPAMI.1979.4766909. Halkidi, Maria; Batistakis, Yannis; Vazirgiannis, Michalis (2001). “On Clustering Validation Techniques” Journal of Intelligent Information Systems, 17(2-3), 107-145. doi:10.1023/A:1012801612483. Wikipedia entry for Davies-Bouldin index.
列聯(lián)矩陣(Contingency Matrix)(sklearn.metrics.cluster.contingency_matrix) 記錄了每個真實/預(yù)測簇對之間的交叉基數(shù)。 列聯(lián)矩陣為所有的聚類度量提供了足夠的統(tǒng)計數(shù)據(jù),在這些度量中樣本都是獨立和均勻分布的,不需要考慮某些未聚類的樣本。
這是一個例子:
>>> from sklearn.metrics.cluster import contingency_matrix
>>> x = ["a", "a", "a", "b", "b", "b"]
>>> y = [0, 0, 1, 1, 2, 2]
>>> contingency_matrix(x, y)
array([[2, 1, 0],
[0, 1, 2]])
輸出數(shù)組的第一行指示存在三個樣本的真實簇是''a''。其中兩個的預(yù)測簇是 0,一個是 1, 沒有一個是 2。而第二行表示有三個樣本的真實簇是‘’b‘’ 。 其中,沒有一個樣本的預(yù)測簇是 0, 一個是 1, 兩個是 2。
用于分類的混淆矩陣(confusion matrix) 是平方列矩陣,其中行和列的順序?qū)?yīng)于類別列表。
列聯(lián)矩陣很容易解釋小數(shù)量的簇,但對于數(shù)量較大的簇則很難解釋。
沒有給出一個單一的指標(biāo)來做聚類優(yōu)化。
參考文獻(xiàn)
更多建議: