【Scikit-Learn 中文文檔】聚類 - 無監督學習 - 用戶指南 | ApacheCN

中文文檔: http://sklearn.apachecn.org/cn/stable/modules/clustering.html

英文文檔: http://sklearn.apachecn.org/en/stable/modules/clustering.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html




2.3. 聚類

未標記的數據的 Clustering(聚類) 可以使用模塊 sklearn.cluster 來實現。

每個 clustering algorithm (聚類算法)有兩個變體: 一個是 class, 它實現了 fit 方法來學習 train data(訓練數據)的 clusters(聚類),還有一個 function(函數),是給定 train data(訓練數據),返回與不同 clusters(聚類)對應的整數標籤 array(數組)。對於 class(類),training data(訓練數據)上的標籤可以在 labels_ 屬性中找到。

輸入數據

需要注意的一點是,該模塊中實現的算法可以採用不同種類的 matrix (矩陣)作爲輸入。所有這些都接受 shape [n_samples, n_features] 的標準數據矩陣。 這些可以從以下的 sklearn.feature_extraction 模塊的 classes (類)中獲得。對於 AffinityPropagationSpectralClustering 和 DBSCAN 也可以輸入 shape [n_samples, n_samples]的相似矩陣。這些可以從 sklearn.metrics.pairwise 模塊中的函數獲得。

2.3.1. 聚類方法概述

../_images/sphx_glr_plot_cluster_comparison_0011.png

在 scikit-learn 中的 clustering algorithms (聚類算法)的比較

Method name(方法名稱) Parameters(參數) Scalability(可擴展性) Usecase(使用場景) Geometry (metric used)(幾何圖形(公制使用))
K-Means(K-均值) number of clusters(聚類形成的簇的個數) 非常大的 n_samples, 中等的 n_clusters 使用 MiniBatch code(MiniBatch 代碼) 通用, 均勻的 cluster size(簇大小), flat geometry(平面幾何), 不是太多的 clusters(簇) Distances between points(點之間的距離)
Affinity propagation damping(阻尼), sample preference(樣本偏好) Not scalable with n_samples(n_samples 不可擴展) 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 Many clusters, uneven cluster size, non-flat geometry(許多簇,不均勻的簇大小,非平面幾何) Distances between points(點之間的距離)
Spectral clustering number of clusters(簇的個數) 中等的 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(簇的個數) 大的 n_samples 和 n_clusters Many clusters, possibly connectivity constraints(很多的簇,可能連接限制) Distances between points(點之間的距離)
Agglomerative clustering number of clusters(簇的個數), linkage type(鏈接類型), distance(距離) 大的 n_samples 和 n_clusters Many clusters, possibly connectivity constraints, non Euclidean distances(很多簇,可能連接限制,非歐幾里得距離) Any pairwise distance(任意成對距離)
DBSCAN neighborhood size(neighborhood 的大小) 非常大的 n_samples, 中等的 n_clusters Non-flat geometry, uneven cluster sizes(非平面幾何,不均勻的簇大小) Distances between nearest points(最近點之間的距離)
Gaussian mixtures(高斯混合) many(很多) Not scalable(不可擴展) Flat geometry, good for density estimation(平面幾何,適用於密度估計) Mahalanobis distances to centers(Mahalanobis 與中心的距離)
Birch branching factor(分支因子), threshold(閾值), optional global clusterer(可選全局簇). 大的 n_clusters 和 n_samples Large dataset, outlier removal, data reduction.(大數據集,異常值去除,數據簡化) Euclidean distance between points(點之間的歐式距離)

當 clusters (簇)具有 specific shape (特殊的形狀),即 non-flat manifold(非平面 manifold),並且標準歐幾里得距離不是正確的 metric (度量標準)時,Non-flat geometry clustering (非平面幾何聚類)是非常有用的。這種情況出現在上圖的兩個頂行中。

用於 clustering (聚類)的 Gaussian mixture models (高斯混合模型),專用於 mixture models (混合模型)描述在 文檔的另一章節 。可以將 KMeans 視爲具有 equal covariance per component (每個分量相等協方差)的 Gaussian mixture model (高斯混合模型)的特殊情況。

2.3.2. K-means

KMeans 算法通過試圖分離 n groups of equal variance(n 個相等方差組)的樣本來聚集數據,minimizing (最小化)稱爲 inertia 或者 within-cluster sum-of-squares (簇內和平方)的 criterion (標準)。 該算法需要指定 number of clusters (簇的數量)。它可以很好地 scales (擴展)到 large number of samples(大量樣本),並已經被廣泛應用於許多不同領域的應用領域。

k-means 算法將一組 N 樣本 X 劃分成 K 不相交的 clusters (簇) C, 每個都用 cluster (該簇)中的樣本的均值 \mu_j 描述。 這個 means (均值)通常被稱爲 cluster(簇)的 “centroids(質心)”; 注意,它們一般不是從 X 中挑選出的點,雖然它們是處在同一個 space(空間)。 K-means(K-均值)算法旨在選擇最小化 inertia(慣性) 或 within-cluster sum of squared(簇內和的平方和)的標準的 centroids(質心):

\sum_{i=0}^{n}\min_{\mu_j \in C}(||x_j - \mu_i||^2)

Inertia(慣性), 或 the within-cluster sum of squares(簇內和平方差) criterion(標準),可以被認爲是 internally coherent clusters (內部想幹聚類)的 measure (度量)。 它有各種缺點:

  • Inertia(慣性)假設 clusters (簇)是 convex(凸)的和 isotropic (各項同性),這並不是總是這樣。它對 elongated clusters (細長的簇)或具有不規則形狀的 manifolds 反應不佳。
  • Inertia(慣性)不是一個 normalized metric(歸一化度量): 我們只知道 lower values (較低的值)是更好的,並且 零 是最優的。但是在 very high-dimensional spaces (非常高維的空間)中,歐幾里得距離往往會變得 inflated (膨脹)(這就是所謂的 “curse of dimensionality (維度詛咒/維度懲罰)”)。在 k-means 聚類之前運行諸如 PCA 之類的 dimensionality reduction algorithm (降維算法)可以減輕這個問題並加快計算速度。
../_images/sphx_glr_plot_kmeans_assumptions_0011.png

K-means 通常被稱爲 Lloyd’s algorithm(勞埃德算法)。在基本術語中,算法有三個步驟。、 第一步是選擇 initial centroids (初始質心),最基本的方法是從 X 數據集中選擇 k 個樣本。初始化完成後,K-means 由兩個其他步驟之間的循環組成。 第一步將每個樣本分配到其 nearest centroid (最近的質心)。第二步通過取分配給每個先前質心的所有樣本的平均值來創建新的質心。計算舊的和新的質心之間的差異,並且算法重複這些最後的兩個步驟,直到該值小於閾值。換句話說,算法重複這個步驟,直到質心不再顯著移動。

../_images/sphx_glr_plot_kmeans_digits_0011.png

K-means 相當於具有 small, all-equal, diagonal covariance matrix (小的全對稱協方差矩陣)的 expectation-maximization algorithm (期望最大化算法)。

該算法也可以通過 `Voronoi diagrams(Voronoi圖)<https://en.wikipedia.org/wiki/Voronoi_diagram>`_ 的概念來理解。首先使用 current centroids (當前質心)計算點的 Voronoi 圖。 Voronoi 圖中的每個 segment (段)都成爲一個 separate cluster (單獨的簇)。其次,centroids(質心)被更新爲每個 segment (段)的 mean(平均值)。然後,該算法重複此操作,直到滿足停止條件。 通常情況下,當 iterations (迭代)之間的 objective function (目標函數)的相對減小小於給定的 tolerance value (公差值)時,算法停止。在此實現中不是這樣: 當質心移動小於 tolerance (公差)時,迭代停止。

給定足夠的時間,K-means 將總是收斂的,但這可能是 local minimum (局部最小)的。這很大程度上取決於 initialization of the centroids (質心的初始化)。 因此,通常會進行幾次 different initializations of the centroids (初始化不同質心)的計算。幫助解決這個問題的一種方法是 k-means++ 初始化方案,它已經在 scikit-learn 中實現(使用 init='k-means++' 參數)。 這將初始化 centroids (質心)(通常)彼此遠離,導致比隨機初始化更好的結果,如參考文獻所示。

可以給出一個參數,以允許 K-means 並行運行,稱爲 n_jobs。給這個參數一個正值使用許多處理器(默認值: 1)。值 -1 使用所有可用的處理器,-2 使用一個,等等。Parallelization (並行化)通常以 cost of memory(內存的代價)加速計算(在這種情況下,需要存儲多個質心副本,每個作業使用一個)。

Warning

 

當 numpy 使用 Accelerate 框架時,K-Means 的並行版本在 OS X 上損壞。這是 expected behavior (預期的行爲): Accelerate 可以在 fork 之後調用,但是您需要使用 Python binary(二進制)(該多進程在 posix 下不執行)來執行子進程。

K-means 可用於 vector quantization (矢量量化)。這是使用以下類型的 trained model (訓練模型)的變換方法實現的 KMeans 。

示例:

參考:

2.3.2.1. 小批量 K-Means

MiniBatchKMeans 是 KMeans 算法的一個變體,它使用 mini-batches (小批量)來減少計算時間,同時仍然嘗試優化相同的 objective function (目標函數)。 Mini-batches(小批量)是輸入數據的子集,在每次 training iteration (訓練迭代)中 randomly sampled (隨機抽樣)。這些小批量大大減少了融合到本地解決方案所需的計算量。 與其他降低 k-means 收斂時間的算法相反,mini-batch k-means 產生的結果通常只比標準算法略差。

該算法在兩個主要步驟之間進行迭代,類似於 vanilla k-means 。 在第一步, b 樣本是從數據集中隨機抽取的,形成一個 mini-batch (小批量)。然後將它們分配到最近的 centroid(質心)。 在第二步,centroids (質心)被更新。與 k-means 相反,這是在每個樣本的基礎上完成的。對於 mini-batch (小批量)中的每個樣本,通過取樣本的 streaming average (流平均值)和分配給該質心的所有先前樣本來更新分配的質心。 這具有隨時間降低 centroid (質心)的 rate (變化率)的效果。執行這些步驟直到達到收斂或達到預定次數的迭代。

MiniBatchKMeans 收斂速度比 KMeans ,但是結果的質量會降低。在實踐中,質量差異可能相當小,如示例和引用的參考。

../_images/sphx_glr_plot_mini_batch_kmeans_0011.png

示例:

參考:

2.3.3. Affinity Propagation

AffinityPropagation AP聚類是通過在樣本對之間發送消息直到收斂來創建聚類。然後使用少量示例樣本作爲聚類中心來描述數據集, 聚類中心是數據集中最能代表一類數據的樣本。在樣本對之間發送的消息表示一個樣本作爲另一個樣本的示例樣本的 適合程度,適合程度值在根據通信的反饋不斷更新。更新迭代直到收斂,完成聚類中心的選取,因此也給出了最終聚類。

../_images/sphx_glr_plot_affinity_propagation_0011.png
Affinity Propagation 算法比較有趣的是可以根據提供的數據決定聚類的數目。 因此有兩個比較重要的參數
preference, 決定使用多少個示例樣本 *damping factor*(阻尼因子) 減少吸引信息和歸屬信息以防止 更新減少吸引度和歸屬度信息時數據振盪。

AP聚類算法主要的缺點是算法的複雜度. AP聚類算法的時間複雜度是 O(N^2 T), 其中 N 是樣本的個數 , T 是收斂之前迭代的次數. 如果使用密集的相似性矩陣空間複雜度是 O(N^2) 如果使用稀疏的相似性矩陣空間複雜度可以降低。 這使得AP聚類最適合中小型數據集。

示例:

Algorithm description(算法描述): 樣本之間傳遞的信息有兩種。 第一種是 responsibility(吸引信息) r(i, k), 樣本 k 適合作爲樣本 i 的聚類中心的程度。

第二種是 availability(歸屬信息) a(i, k) 樣本 i 選擇樣本 k 作爲聚類中心的適合程度,並且考慮其他所有樣本選取 k 做爲聚類中心的合適程度。 通過這個方法,選取示例樣本作爲聚類中心如果 (1) 該樣本與其許多樣本相似,並且 (2) 被許多樣本選取 爲它們自己的示例樣本。

樣本 k 對樣本 i 吸引度計算公式:

r(i, k) \leftarrow s(i, k) - max [ a(i, k') + s(i, k') \forall k' \neq k ]

其中 s(i, k) 是樣本 i 和樣本 k 之間的相似度。 樣本 k 作爲樣本 i 的示例樣本的合適程度:

a(i, k) \leftarrow min [0, r(k, k) + \sum_{i'~s.t.~i' \notin \{i, k\}}{r(i', k)}]

算法開始時 r 和 a 都被置 0,然後開始迭代計算直到收斂。 爲了防止更新數據時出現數據振盪,在迭代過程中引入阻尼因子 \lambda :

r_{t+1}(i, k) = \lambda\cdot r_{t}(i, k) + (1-\lambda)\cdot r_{t+1}(i, k)

a_{t+1}(i, k) = \lambda\cdot a_{t}(i, k) + (1-\lambda)\cdot a_{t+1}(i, k)

其中 t 迭代的次數。

2.3.4. Mean Shift

MeanShift 算法旨在於發現一個樣本密度平滑的 blobs 。 均值漂移算法是基於質心的算法,通過更新質心的候選位置爲所選定區域的偏移均值。 然後,這些候選者在後處理階段被過濾以消除近似重複,從而形成最終質心集合。

給定第 t 次迭代中的候選質心 x_i , 候選質心的位置將被安裝如下公式更新:

x_i^{t+1} = x_i^t + m(x_i^t)

其中 N(x_i) 是圍繞 x_i 周圍一個給定距離範圍內的樣本空間 and m 是 mean shift vector(均值偏移向量) 是所有質心中指向 點密度增加最多的區域的偏移向量。使用以下等式計算,有效地將質心更新爲其鄰域內樣本的平均值:

m(x_i) = \frac{\sum_{x_j \in N(x_i)}K(x_j - x_i)x_j}{\sum_{x_j \in N(x_i)}K(x_j - x_i)}

算法自動設定聚類的數目,取代依賴參數 bandwidth``(帶寬),帶寬是決定搜索區域的size的參數。 這個參數可以手動設置,但是如果沒有設置,可以使用提供的評估函數 ``estimate_bandwidth進行評估。

該算法不是高度可擴展的,因爲在執行算法期間需要執行多個最近鄰搜索。 該算法保證收斂,但是當 質心的變化較小時,算法將停止迭代。

通過找到給定樣本的最近質心來給新樣本打上標籤。

../_images/sphx_glr_plot_mean_shift_0011.png

示例:

參考:

2.3.5. Spectral clustering

SpectralClustering 是在樣本之間進行親和力矩陣的低維度嵌入,其實是低維空間中的 KMeans。 如果親和度矩陣稀疏,則這是非常有效的並且 pyamg module 以及安裝好。 SpectralClustering 需要指定聚類數。這個算法適用於聚類數少時,在聚類數多是不建議使用。

對於兩個聚類,它解決了相似圖上的 normalised cuts 問題: 將圖形切割成兩個,使得切割的邊緣的重量比每個簇內的邊緣的權重小。在圖像處理時,這個標準是特別有趣的: 圖像的頂點是像素,相似圖的邊緣是圖像的漸變函數。

noisy_img segmented_img

Warning

 

Transforming distance to well-behaved similarities

請注意,如果你的相似矩陣的值分佈不均勻,例如:存在負值或者距離矩陣並不表示相似性 spectral problem 將會變得奇異,並且不能解決。 在這種情況下,建議對矩陣的 entries 進行轉換。比如在符號距離有符號的情況下通常使用 heat kernel:

similarity = np.exp(-beta * distance / distance.std())

請看這樣一個應用程序的例子。

示例:

2.3.5.1. 不同的標記分配策略

可以使用不同的分配策略, 對應於 assign_labels 參數 SpectralClustering。 "kmeans" 可以匹配更精細的數據細節,但是可能更加不穩定。 特別是,除非你設置 random_state 否則可能無法復現運行的結果 ,因爲它取決於隨機初始化。另一方, 使用 "discretize" 策略是 100% 可以復現的,但是它往往會產生相當均勻的幾何形狀的邊緣。

assign_labels="kmeans" assign_labels="discretize"
face_kmeans face_discretize

參考:

2.3.6. 層次聚類

Hierarchical clustering 是一個常用的聚類算法,它通過不斷的合併或者分割來構建聚類。 聚類的層次被表示成樹(或者 dendrogram(樹形圖))。樹根是擁有所有樣本的唯一聚類,葉子是僅有一個樣本的聚類。 請參照 Wikipedia page 查看更多細節。

The AgglomerativeClustering 使用自下而上的方法進行層次聚類:開始是每一個對象是一個聚類, 並且聚類別相繼合併在一起。 linkage criteria 確定用於合併的策略的度量:

  • Ward 最小化所有聚類內的平方差總和。這是一種 variance-minimizing (方差最小化)的優化方向, 這是與k-means 的目標函數相似的優化方法,但是用 agglomerative hierarchical(聚類分層)的方法處理。
  • Maximum 或 complete linkage 最小化聚類對兩個樣本之間的最大距離。
  • Average linkage 最小化聚類兩個聚類中樣本距離的平均值。

AgglomerativeClustering 在於連接矩陣聯合使用時,也可以擴大到大量的樣本,但是 在樣本之間沒有添加連接約束時,計算代價很大:每一個步驟都要考慮所有可能的合併。

FeatureAgglomeration

The FeatureAgglomeration 使用 agglomerative clustering 將看上去相似的 特徵組合在一起,從而減少特徵的數量。這是一個降維工具, 請參照 無監督降維

2.3.6.1. Different linkage type: Ward, complete and average linkage

AgglomerativeClustering 支持 Ward, average, and complete linkage 策略.

../_images/sphx_glr_plot_digits_linkage_0011.png ../_images/sphx_glr_plot_digits_linkage_0021.png ../_images/sphx_glr_plot_digits_linkage_0031.png

Agglomerative cluster 存在 “rich get richer” 現象導致聚類大小不均勻。這方面 complete linkage 是最壞的策略,Ward 給出了最規則的大小。然而,在 Ward 中 affinity (or distance used in clustering) 不能被改變,對於 non Euclidean metrics 來說 average linkage 是一個好的選擇。

示例:

2.3.6.2. 添加連接約束

AgglomerativeClustering 中一個有趣的特點是可以使用 connectivity matrix(連接矩陣) 將連接約束添加到算法中(只有相鄰的聚類可以合併到一起),連接矩陣爲每一個樣本給定了相鄰的樣本。 例如,在 swiss-roll 的例子中,連接約束禁止在不相鄰的 swiss roll 上合併,從而防止形成在 roll 上 重複摺疊的聚類。

unstructured structured

這些約束對於強加一定的局部結構是很有用的,但是這也使得算法更快,特別是當樣本數量巨大時。

連通性的限制是通過連接矩陣來實現的:一個 scipy sparse matrix(稀疏矩陣),僅在一行和 一列的交集處具有應該連接在一起的數據集的索引。這個矩陣可以通過 a-priori information (先驗信息) 構建:例如,你可能通過僅僅將從一個連接指向另一個的鏈接合併頁面來聚類頁面。也可以從數據中學習到,

例如使用 sklearn.neighbors.kneighbors_graph 限制與最臨近的合併 :ref:`this example
<sphx_glr_auto_examples_cluster_plot_agglomerative_clustering.py>`, 或者使用
sklearn.feature_extraction.image.grid_to_graph 僅合併圖像上相鄰的像素點, 例如 raccoon face 。

示例:

Warning

 

Connectivity constraints with average and complete linkage

Connectivity constraints 和 complete or average linkage 可以增強 agglomerative clustering 中的 ‘rich getting richer’ 現象。特別是,如果建立的是 sklearn.neighbors.kneighbors_graph。 在少量聚類的限制中, 更傾向於給出一些 macroscopically occupied clusters 並且幾乎是空的 (討論內容請查看 Agglomerative clustering with and without structure)。

../_images/sphx_glr_plot_agglomerative_clustering_0011.png ../_images/sphx_glr_plot_agglomerative_clustering_0021.png ../_images/sphx_glr_plot_agglomerative_clustering_0031.png ../_images/sphx_glr_plot_agglomerative_clustering_0041.png

2.3.6.3. Varying the metric

Average and complete linkage 可以使用各種距離 (or affinities), 特別是 Euclidean distance (l2), Manhattan distance(曼哈頓距離)(or Cityblock(城市區塊距離), or l1), cosine distance(餘弦距離),

或者任何預先計算的 affinity matrix(親和度矩陣).
  • l1 distance 有利於稀疏特徵或者稀疏噪聲: 例如很多特徵都是0,就想在文本挖掘中使用 rare words 一樣。
  • cosine distance 非常有趣因爲它對全局放縮是一樣的。

選擇度量標準的方針是使得不同類樣本之間距離最大化,並且最小化同類樣本之間的距離。

../_images/sphx_glr_plot_agglomerative_clustering_metrics_0051.png ../_images/sphx_glr_plot_agglomerative_clustering_metrics_0061.png ../_images/sphx_glr_plot_agglomerative_clustering_metrics_0071.png

2.3.7. DBSCAN

The DBSCAN 算法將聚類視爲被低密度區域分隔的高密度區域。由於這個相當普遍的觀點, DBSCAN發現的聚類可以是任何形狀的,與假設聚類是 convex shaped 的 K-means 相反。 DBSCAN 的核心概念是 core samples, 是指位於高密度區域的樣本。 因此一個聚類是一組核心樣本,每個核心樣本彼此靠近(通過一定距離度量測量) 和一組接近核心樣本的非核心樣本(但本身不是核心樣本)。算法中的兩個參數, min_samples 和 eps,正式的定義了我們所說的 *dense*(稠密)。較高的 min_samples 或者

較低的 ``eps``表示形成聚類所需的較高密度。

更正式的,我們定義核心樣本是指數據集中的一個樣本,存在 min_samples 個其他樣本在 eps 距離範圍內,這些樣本被定爲爲核心樣本的鄰居 neighbors 。這告訴我們核心樣本在向量空間稠密的區域。 一個聚類是一個核心樣本的集合,可以通過遞歸來構建,選取一個核心樣本,查找它所有的 neighbors (鄰居樣本) 中的核心樣本,然後查找 their (新獲取的核心樣本)的 neighbors (鄰居樣本)中的核心樣本,遞歸這個過程。 聚類中還具有一組非核心樣本,它們是集羣中核心樣本的鄰居的樣本,但本身並不是核心樣本。 顯然,這些樣本位於聚類的邊緣。

根據定義,任何核心樣本都是聚類的一部分,任何不是核心樣本並且和任意一個核心樣本距離都大於
eps 的樣本將被視爲異常值。

在下圖中,顏色表示聚類成員屬性,大圓圈表示算法發現的核心樣本。 較小的圈子是仍然是羣集的 一部分的非核心樣本。 此外,異常值由下面的黑點表示。

dbscan_results

實現

DBSCAN 算法是具有確定性的,當以相同的順序給出相同的數據時總是形成相同的聚類。 然而,當以不同的順序提供數據時聚類的結果可能不相同。首先,即使核心樣本總是被 分配給相同的聚類,這些集羣的標籤將取決於數據中遇到這些樣本的順序。第二個更重 要的是,非核心樣本的聚類可能因數據順序而有所不同。 當一個非核心樣本距離兩個核心樣本的距離都小於 eps 時,就會發生這種情況。 通過三角不等式可知,這兩個核心樣本距離一定大於 eps 或者處於同一個聚類中。 非核心樣本將被非配到首先查找到改樣本的類別,因此結果將取決於數據的順序。

當前版本使用 ball trees 和 kd-trees 來確定領域,這樣避免了計算全部的距離矩陣 (0.14 之前的 scikit-learn 版本計算全部的距離矩陣)。保留使用 custom metrics (自定義指標)的可能性。細節請參照 NearestNeighbors

大量樣本的內存消耗

默認的實現方式並沒有充分利用內存,因爲在不使用 kd-trees 或者 ball-trees 的情況下構建一個 完整的相似度矩陣(e.g. 使用稀疏矩陣)。這個矩陣將消耗 n^2 個浮點數。 解決這個問題的幾種機制:

  • A sparse radius neighborhood graph (稀疏半徑鄰域圖)(其中缺少條目被假定爲距離超出eps) 可以以高效的方式預先編譯,並且可以使用 metric='precomputed' 來運行 dbscan。

  • 數據可以壓縮,當數據中存在準確的重複時,可以刪除這些重複的數據,或者使用BIRCH。 任何。然後僅需要使用相對少量的樣本來表示大量的點。當訓練DBSCAN時,可以提供一個

    sample_weight 參數。

引用:

  • “A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise” Ester, M., H. P. Kriegel, J. Sander, and X. Xu, In Proceedings of the 2nd International Conference on Knowledge Discovery and Data Mining, Portland, OR, AAAI Press, pp. 226–231. 1996

2.3.8. Birch

The Birch 爲提供的數據構建一顆 Characteristic Feature Tree (CFT,聚類特徵樹)。 數據實質上是被有損壓縮成一組 Characteristic Feature nodes (CF Nodes,聚類特徵節點)。 CF Nodes 中有一部分子聚類被稱爲 Characteristic Feature subclusters (CF Subclusters), 並且這些位於非終端位置的CF Subclusters 可以擁有 CF Nodes 作爲孩子節點。

CF Subclusters 保存用於聚類的必要信息,防止將整個輸入數據保存在內存中。 這些信息包括:

  • Number of samples in a subcluster(子聚類中樣本數).
  • Linear Sum - A n-dimensional vector holding the sum of all samples(保存所有樣本和的n維向量)
  • Squared Sum - Sum of the squared L2 norm of all samples(所有樣本的L2 norm的平方和).
  • Centroids - To avoid recalculation linear sum / n_samples(爲了防止重複計算 linear sum / n_samples).
  • Squared norm of the centroids(質心的 Squared norm ).

Birch 算法有兩個參數,即 threshold (閾值)和 branching factor 分支因子。Branching factor (分支因子) 限制了一個節點中的子集羣的數量 ,threshold (簇半徑閾值)限制了新加入的樣本和存在與現有子集羣中樣本的最大距離。

該算法可以視爲將一個實例或者數據簡化的方法,因爲它將輸入的數據簡化到可以直接從CFT的葉子結點中獲取的一組子聚類。 這種簡化的數據可以通過將其饋送到global clusterer(全局聚類)來進一步處理。Global clusterer(全局聚類)可以 通過 ``n_clusters``來設置。

如果 n_clusters 被設置爲 None,將直接讀取葉子結點中的子聚類,否則,global clustering(全局聚類) 將逐步標記他的 subclusters 到 global clusters (labels) 中,樣本將被映射到 距離最近的子聚類的global label中。

算法描述:

  • 一個新的樣本作爲一個CF Node 被插入到 CF Tree 的根節點。然後將其合併到根節點的子聚類中去,使得合併後子聚類 擁有最小的半徑,子聚類的選取受 threshold 和 branching factor 的約束。如果子聚類也擁有孩子節點,則重複執 行這個步驟直到到達葉子結點。在葉子結點中找到最近的子聚類以後,遞歸的更新這個子聚類及其父聚類的屬性。
  • 如果合併了新樣本和最近的子聚類獲得的子聚類半徑大約square of the threshold(閾值的平方), 並且子聚類的數量大於branching factor(分支因子),則將爲這個樣本分配一個臨時空間。 最遠的兩個子聚類被選取,剩下的子聚類按照之間的距離分爲兩組作爲被選取的兩個子聚類的孩子節點。
  • If this split node has a parent subcluster and there is room for a new subcluster, then the parent is split into two. If there is no room, then this node is again split into two and the process is continued recursively, till it reaches the root. 如果拆分的節點有一個 parent subcluster ,並且有一個容納一個新的子聚類的空間,那麼父聚類拆分成兩個。 如果沒有空間容納一個新的聚類,那麼這個節點將被再次拆分,依次向上檢查父節點是否需要分裂, 如果需要按葉子節點方式相同分裂。

Birch or MiniBatchKMeans?

  • Birch 在高維數據上表現不好。一條經驗法則,如果 n_features 大於20,通常使用 MiniBatchKMeans 更好。
  • 如果需要減少數據實例的數量,或者如果需要大量的子聚類作爲預處理步驟或者其他, Birch 比 MiniBatchKMeans 更有用。

How to use partial_fit?

爲了避免對 global clustering 的計算,每次調用建議使用 partial_fit 。

  1. 初始化 n_clusters=None 。
  2. 通過多次調用 partial_fit 訓練所以的數據。
  3. 設置 n_clusters 爲所需值,通過使用 brc.set_params(n_clusters=n_clusters) 。
  4. 最後不需要參數調用 partial_fit , 例如 brc.partial_fit() 執行全局聚類。
../_images/sphx_glr_plot_birch_vs_minibatchkmeans_0011.png

參考:

2.3.9. 聚類性能度量

度量聚類算法的性能不是簡單的統計錯誤的數量或計算監督分類算法中的 precision (準確率)和 recall (召回率)。 特別地,任何 evaluation metric (度量指標)不應該考慮到 cluster labels (簇標籤)的絕對值,而是如果這個簇定義類似於某些 ground truth set of classes 或者滿足某些假設,使得屬於同一個類的成員更類似於根據某些 similarity metric (相似性度量)的不同類的成員。

2.3.9.1. 調整後的 Rand 指數

考慮到 the ground truth class 賦值 labels_true 和相同樣本 labels_pred 的聚類算法分配的知識,adjusted Rand index 是一個函數,用於測量兩個 assignments (任務)的 similarity(相似度) ,忽略 permutations (排列)和 with 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...

可以在預測的標籤中 permute (排列) 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(對稱的) : 交換參數不會改變 score (得分)。它可以作爲 consensus measure(共識度量):

>>>
>>> metrics.adjusted_rand_score(labels_pred, labels_true)  
0.24...

完美的標籤得分爲 1.0

>>>
>>> labels_pred = labels_true[:]
>>> metrics.adjusted_rand_score(labels_true, labels_pred)
1.0

壞 (e.g. independent labelings(獨立標籤)) 有負數 或 接近於 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...

2.3.9.1.1. 優點

  • Random (uniform) label assignments have a ARI score close to 0.0(隨機(統一)標籤分配的 ARI 評分接近於 0.0) 對於 n_clusters 和 n_samples 的任何值(這不是原始的 Rand index 或者 V-measure 的情況)。
  • Bounded range(範圍是有界的) [-1, 1]: negative values (負值)是壞的 (獨立性標籤), 類似的聚類有一個 positive ARI (正的 ARI), 1.0 是完美的匹配得分。
  • No assumption is made on the cluster structure(對簇的結構不需作出任何假設): 可以用於比較聚類算法,例如 k-means,其假定 isotropic blob shapes 與可以找到具有 “folded” shapes 的聚類的 spectral clustering algorithms(譜聚類算法)的結果。

2.3.9.1.2. 缺點

  • 與 inertia 相反,ARI requires knowledge of the ground truth classes(ARI 需要 ground truth classes 的相關知識) ,而在實踐中幾乎不可用,或者需要人工標註者手動分配(如在監督學習環境中)。

    然而,ARI 還可以在 purely unsupervised setting (純粹無監督的設置中)作爲可用於 聚類模型選擇(TODO)的共識索引的構建塊。

示例:

2.3.9.1.3. 數學表達

如果 C 是一個 ground truth class assignment(任務), K 是簇的個數,我們定義 a 和 b 如:

  • a, 在 C 中的相同集合的與 K 中的相同集合中的元素的對數
  • b, 在 C 中的不同集合與 K 中的不同集合中的元素的對數

原始(未經調整)的 Rand index 則由下式給出:

\text{RI} = \frac{a + b}{C_2^{n_{samples}}}

其中 C_2^{n_{samples}} 是數據集中可能的 pairs (數據對)的總數(不排序)。

然而,RI 評分不能保證 random label assignments (隨機標籤任務)將獲得接近零的值(特別是如果簇的數量與採樣數量相同的數量級)。

爲了抵消這種影響,我們可以通過定義 adjusted Rand index (調整後的 Rand index)來 discount(折現) 隨機標籤的預期 RI E[\text{RI}] ,如下所示:

\text{ARI} = \frac{\text{RI} - E[\text{RI}]}{\max(\text{RI}) - E[\text{RI}]}

參考

2.3.9.2. 基於 Mutual Information (互信息)的分數

考慮到 ground truth class assignments (標定過的真實數據類分配) labels_true 的知識和相同樣本 labels_pred 的聚類算法分配, Mutual Information 是測量兩者 agreement 分配的函數,忽略 permutations(排列)。 這種測量方案的兩個不同的標準化版本可用,Normalized Mutual Information(NMI) 和 Adjusted Mutual Information(AMI)。NMI 經常在文獻中使用,而 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...

可以在 predicted labels (預測的標籤)中 permute (排列) 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_scoreadjusted_mutual_info_score 和 normalized_mutual_info_score 是 symmetric(對稱的): 交換參數不會更改分數。因此,它們可以用作 consensus measure:

>>>
>>> metrics.adjusted_mutual_info_score(labels_pred, labels_true)  
0.22504...

完美標籤得分是 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...

壞的 (例如 independent labelings(獨立標籤)) 具有非正分數:

>>>
>>> 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...

2.3.9.2.1. 優點

  • Random (uniform) label assignments have a AMI score close to 0.0(隨機(統一)標籤分配的AMI評分接近0.0) 對於 n_clusters 和 n_samples 的任何值(這不是原始 Mutual Information 或者 V-measure 的情況)。
  • Bounded range(有界範圍) [0, 1]: 接近 0 的值表示兩個主要獨立的標籤分配,而接近 1 的值表示重要的一致性。此外,正好 0 的值表示 purely(純粹) 獨立標籤分配,正好爲 1 的 AMI 表示兩個標籤分配相等(有或者沒有 permutation)。
  • No assumption is made on the cluster structure(對簇的結構沒有作出任何假設): 可以用於比較聚類算法,例如 k-means,其假定 isotropic blob shapes 與可以找到具有 “folded” shapes 的聚類的 spectral clustering algorithms (頻譜聚類算法)的結果。

2.3.9.2.2. 缺點

  • 與 inertia 相反,MI-based measures require the knowledge of the ground truth classes(MI-based measures 需要了解 ground truth classes) ,而在實踐中幾乎不可用,或者需要人工標註或手動分配(如在監督學習環境中)。

    然而,基於 MI-based measures (基於 MI 的測量方式)也可用於純無人監控的設置,作爲可用於聚類模型選擇的 Consensus Index (共識索引)的構建塊。

  • NMI 和 MI 沒有調整機會。

示例:

2.3.9.2.3. 數學公式

假設兩個標籤分配(相同的 N 個對象),U 和 V。 它們的 entropy (熵)是一個 partition set (分區集合)的不確定性量,定義如下:

H(U) = - \sum_{i=1}^{|U|}P(i)\log(P(i))

其中 P(i) = |U_i| / N 是從 U 中隨機選取的對象到類 U_i 的概率。同樣對於 V:

H(V) = - \sum_{j=1}^{|V|}P'(j)\log(P'(j))

使用 P'(j) = |V_j| / NU 和 V 之間的 mutual information (MI) 由下式計算:

\text{MI}(U, V) = \sum_{i=1}^{|U|}\sum_{j=1}^{|V|}P(i, j)\log\left(\frac{P(i,j)}{P(i)P'(j)}\right)

其中 P(i, j) = |U_i \cap V_j| / N 是隨機選擇的對象落入兩個類的概率 U_i 和 V_j 。

也可以用設定的基數表達式表示:

\text{MI}(U, V) = \sum_{i=1}^{|U|} \sum_{j=1}^{|V|} \frac{|U_i \cap V_j|}{N}\log\left(\frac{N|U_i \cap V_j|}{|U_i||V_j|}\right)

normalized (歸一化) mutual information 被定義爲

\text{NMI}(U, V) = \frac{\text{MI}(U, V)}{\sqrt{H(U)H(V)}}

mutual information 的價值以及 normalized variant (標準化變量)的值不會因 chance (機會)而被調整,隨着不同標籤(clusters(簇))的數量的增加,不管標籤分配之間的 “mutual information” 的實際數量如何,都會趨向於增加。

mutual information 的期望值可以用 Vinh, Epps 和 Bailey,(2009) 的以下公式來計算。在這個方程式中, a_i = |U_i| (U_i 中元素的數量) 和 b_j = |V_j| (V_j 中元素的數量).

E[\text{MI}(U,V)]=\sum_{i=1}^|U| \sum_{j=1}^|V| \sum_{n_{ij}=(a_i+b_j-N)^+}^{\min(a_i, b_j)} \frac{n_{ij}}{N}\log \left( \frac{ N.n_{ij}}{a_i b_j}\right)\frac{a_i!b_j!(N-a_i)!(N-b_j)!}{N!n_{ij}!(a_i-n_{ij})!(b_j-n_{ij})!(N-a_i-b_j+n_{ij})!}

使用期望值, 然後可以使用與 adjusted Rand index 相似的形式來計算調整後的 mutual information:

\text{AMI} = \frac{\text{MI} - E[\text{MI}]}{\max(H(U), H(V)) - E[\text{MI}]}

參考

2.3.9.3. 同質性,完整性和 V-measure

鑑於樣本的 ground truth class assignments (標定過的真實數據類分配)的知識,可以使用 conditional entropy (條件熵)分析來定義一些 intuitive metric(直觀的度量)。

特別是 Rosenberg 和 Hirschberg (2007) 爲任何 cluster (簇)分配定義了以下兩個理想的目標:

  • homogeneity(同質性): 每個簇只包含一個類的成員
  • completeness(完整性): 給定類的所有成員都分配給同一個簇。

我們可以把這些概念作爲分數 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 的 harmonic mean 由以下函數計算 v_measure_score:

>>>
>>> metrics.v_measure_score(labels_true, labels_pred)    
0.51...

V-measure 實際上等於上面討論的 mutual information (NMI) 由 label entropies [B2011] (標準熵 [B2011]) 的總和 normalized (歸一化)。

Homogeneity(同質性), completeness(完整性) and V-measure 可以立即計算 homogeneity_completeness_v_measure 如下:

>>>
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...                                                      
(0.66..., 0.42..., 0.51...)

以下聚類分配稍微好一些,因爲它是同構但不完整的:

>>>
>>> labels_pred = [0, 0, 0, 1, 2, 2]
>>> metrics.homogeneity_completeness_v_measure(labels_true, labels_pred)
...                                                      
(1.0, 0.68..., 0.81...)

Note

 

v_measure_score 是 symmetric(對稱的): 它可以用於評估同一數據集上兩個 independent assignments (獨立賦值)的 agreement(協議)

這不是這樣的 completeness_score 和 homogeneity_score: 兩者的關係是被這樣約束着:

homogeneity_score(a, b) == completeness_score(b, a)

2.3.9.3.1. 優點

  • Bounded scores(分數是有界的): 0.0 是最壞的, 1.0 是一個完美的分數.
  • Intuitive interpretation(直觀解釋): 具有不良 V-measure 的聚類可以在 qualitatively analyzed in terms of homogeneity and completeness(在同質性和完整性方面進行定性分析) 以更好地感知到作業完成的錯誤類型。
  • No assumption is made on the cluster structure(對簇的結構沒有作出任何假設): 可以用於比較聚類算法,例如 k-means ,其假定 isotropic blob shapes 與可以找到具有 “folded” shapes 的聚類的 spectral clustering algorithms (頻譜聚類算法)的結果。

2.3.9.3.2. 缺點

  • 以前引入的 metrics (度量標準)**not normalized with regards to random labeling(並不是隨機標記的標準化的)**: 這意味着,根據 number of samples (樣本數量),clusters (簇)和 ground truth classes (標定過的真實數據類),完全隨機的標籤並不總是產生 homogeneity (同質性),completeness(完整性)和 hence v-measure 的相同值。特別是 random labeling won’t yield zero scores especially when the number of clusters is large(隨機標記不會產生零分,特別是當集羣數量大時)

    當樣本數量超過 1000,簇的數量小於 10 時,可以安全地忽略此問題。For smaller sample sizes or larger number of clusters it is safer to use an adjusted index such as the Adjusted Rand Index (ARI)(對於較小的樣本數量或者較大數量的簇,使用 adjusted index 例如 Adjusted Rand Index (ARI))

../_images/sphx_glr_plot_adjusted_for_chance_measures_0011.png
  • 這些 metrics (指標) require the knowledge of the ground truth classes(需要標定過的真實數據類的知識),而在實踐中幾乎不可用,或需要人工標註來人工分配(如在受監督的學習環境中)。

示例:

2.3.9.3.3. 數學表達

Homogeneity(同質性) 和 completeness(完整性) 的得分由下面公式給出:

h = 1 - \frac{H(C|K)}{H(C)}

c = 1 - \frac{H(K|C)}{H(K)}

其中 H(C|K) 是 給定簇分配的類的 conditional entropy (條件熵) ,由下式給出:

H(C|K) = - \sum_{c=1}^{|C|} \sum_{k=1}^{|K|} \frac{n_{c,k}}{n}\cdot \log\left(\frac{n_{c,k}}{n_k}\right)

並且 H(C) 是 entropy of the classes(類的熵),並且由下式給出:

H(C) = - \sum_{c=1}^{|C|} \frac{n_c}{n} \cdot \log\left(\frac{n_c}{n}\right)

n 個樣本總數, n_c 和 n_k 分別屬於 c 類和簇 k 的樣本數,最後 n_{c,k} 分配給簇 k 的類 c 的樣本數。

conditional entropy of clusters given class(給定類的條件熵) H(K|C) 和 entropy of clusters(類的熵) H(K) 以 symmetric manner (對稱方式)定義。

Rosenberg 和 Hirschberg 進一步定義 V-measure 作爲 harmonic mean of homogeneity and completeness(同質性和完整性的 harmonic mean):

v = 2 \cdot \frac{h \cdot c}{h + c}

參考

[B2011] (12) Identication and Characterization of Events in Social Media, Hila Becker, PhD Thesis.

2.3.9.4. Fowlkes-Mallows 分數

當樣本的已標定的真實數據的類別分配已知時,可以使用 Fowlkes-Mallows index (Fowlkes-Mallows 指數)(sklearn.metrics.fowlkes_mallows_score) 。Fowlkes-Mallows 分數 FMI 被定義爲 geometric mean of the pairwise precision (成對的準確率)和 recall (召回率)的幾何平均值:

\text{FMI} = \frac{\text{TP}}{\sqrt{(\text{TP} + \text{FP}) (\text{TP} + \text{FN})}}

其中的 TP 是 True Positive(真正例) 的數量(即,真實標籤和預測標籤中屬於相同簇的點對數),FP 是 False Positive(假正例) (即,在真實標籤中屬於同一簇的點對數,而不在預測標籤中),FN 是 False Negative(假負例) 的數量(即,預測標籤中屬於同一簇的點對數,而不在真實標籤中)。

score (分數)範圍爲 0 到 1。較高的值表示兩個簇之間的良好相似性。

>>>
>>> from sklearn import metrics
>>> labels_true = [0, 0, 0, 1, 1, 1]
>>> labels_pred = [0, 0, 1, 1, 2, 2]
>>>
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)  
0.47140...

可以在 predicted labels (預測的標籤)中 permute (排列) 0 和 1 ,重命名爲 2 到 3 並得到相同的得分:

>>>
>>> labels_pred = [1, 1, 0, 0, 3, 3]

>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)  
0.47140...

完美的標籤得分是 1.0:

>>>
>>> labels_pred = labels_true[:]
>>> metrics.fowlkes_mallows_score(labels_true, labels_pred)  
1.0

壞的(例如 independent labelings (獨立標籤))的標籤得分爲 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

2.3.9.4.1. 優點

  • Random (uniform) label assignments have a FMI score close to 0.0(隨機(統一)標籤分配 FMI 得分接近於 0.0) 對於 n_clusters 和 n_samples 的任何值(對於原始 Mutual Information 或例如 V-measure 而言)。
  • Bounded range(有界範圍) [0, 1]: 接近於 0 的值表示兩個標籤分配在很大程度上是獨立的,而接近於 1 的值表示 significant agreement 。此外,正好爲 0 的值表示 purely 獨立標籤分配,正好爲 1 的 AMI 表示兩個標籤分配相等(有或者沒有 permutation (排列))。
  • No assumption is made on the cluster structure(對簇的結構沒有作出任何假設): 可以用於比較諸如 k-means 的聚類算法,其將假設 isotropic blob shapes 與能夠找到具有 “folded” shapes 的簇的 spectral clustering algorithms (頻譜聚類算法)的結果相結合。

2.3.9.4.2. 缺點

  • 與 inertia(習慣)相反,FMI-based measures require the knowledge of the ground truth classes(基於 FMI 的測量方案需要了解已標註的真是數據的類) ,而幾乎不用於實踐和需要人工標註者的手動任務(如在監督學習的學習環境中)。

參考

2.3.9.5. Silhouette 係數

如果標註過的真實數據的標籤不知道,則必須使用模型本身進行度量。Silhouette Coefficient (sklearn.metrics.silhouette_score) 是一個這樣的評估的例子,其中較高的 Silhouette Coefficient 得分與具有更好定義的聚類的模型相關。Silhouette Coefficient 是爲每個樣本定義的,由兩個得分組成:

  • a: 樣本與同一類別中所有其他點之間的平均距離。
  • b: 樣本與 下一個距離最近的簇 中的所有其他點之間的平均距離。

然後將單個樣本的 Silhouette 係數 s 給出爲:

s = \frac{b - a}{max(a, b)}

給定一組樣本的 Silhouette 係數作爲每個樣本的 Silhouette 係數的平均值。

>>>
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> dataset = datasets.load_iris()
>>> X = dataset.data
>>> y = dataset.target

在正常使用情況下,將 Silhouette 係數應用於聚類分析的結果。

>>>
>>> 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.

2.3.9.5.1. 優點

  • 對於不正確的 clustering (聚類),分數爲 -1 , highly dense clustering (高密度聚類)爲 +1 。零點附近的分數表示 overlapping clusters (重疊的聚類)。
  • 當 clusters (簇)密集且分離較好時,分數更高,這與 cluster (簇)的標準概念有關。

2.3.9.5.2. 缺點

  • convex clusters(凸的簇)的 Silhouette Coefficient 通常比其他類型的 cluster (簇)更高,例如通過 DBSCAN 獲得的基於密度的 cluster(簇)。

示例:

2.3.9.6. Calinski-Harabaz 指數

如果不知道真實數據的類別標籤,則可以使用 Calinski-Harabaz 指數 (sklearn.metrics.calinski_harabaz_score) 來評估模型,其中較高的 Calinski-Harabaz 的得分與具有更好定義的聚類的模型相關。

對於 k 簇,Calinski-Harabaz 得分 s 是作爲 between-clusters dispersion mean (簇間色散平均值)與 within-cluster dispersion(羣內色散之間)的比值給出的:

s(k) = \frac{\mathrm{Tr}(B_k)}{\mathrm{Tr}(W_k)} \times \frac{N - k}{k - 1}

其中 B_K 是 between group dispersion matrix (組間色散矩陣), W_K 是由以下定義的 within-cluster dispersion matrix (羣內色散矩陣):

W_k = \sum_{q=1}^k \sum_{x \in C_q} (x - c_q) (x - c_q)^T

B_k = \sum_q n_q (c_q - c) (c_q - c)^T

N 爲數據中的點數,C_q 爲 cluster (簇) q 中的點集, c_q 爲 cluster(簇) q 的中心, c 爲 E 的中心, n_q 爲 cluster(簇) q 中的點數。

>>>
>>> from sklearn import metrics
>>> from sklearn.metrics import pairwise_distances
>>> from sklearn import datasets
>>> dataset = datasets.load_iris()
>>> X = dataset.data
>>> y = dataset.target

在正常使用情況下,將 Calinski-Harabaz index (Calinski-Harabaz 指數)應用於 cluster analysis (聚類分析)的結果。

>>>
>>> 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)  
560.39...

2.3.9.6.1. 優點

  • 當 cluster (簇)密集且分離較好時,分數更高,這與一個標準的 cluster(簇)有關。
  • 得分計算很快

2.3.9.6.2. 缺點

  • 凸的簇的 Calinski-Harabaz index(Calinski-Harabaz 指數)通常高於其他類型的 cluster(簇),例如通過 DBSCAN 獲得的基於密度的 cluster(簇)。

參考

  • Caliński, T., & Harabasz, J. (1974). “A dendrite method for cluster analysis”. Communications in Statistics-theory and Methods 3: 1-27. doi:10.1080/03610926.2011.560741.



中文文檔: http://sklearn.apachecn.org/cn/stable/modules/clustering.html

英文文檔: http://sklearn.apachecn.org/en/stable/modules/clustering.html

官方文檔: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者: https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

關於我們: http://www.apachecn.org/organization/209.html

有興趣的們也可以和我們一起來維護,持續更新中 。。。

機器學習交流羣: 629470233

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章