在BIRCH聚類算法原理中,咱們對BIRCH聚類算法的原理作了總結,本文就對scikit-learn中BIRCH算法的使用作一個總結。html
在scikit-learn中,BIRCH類實現了原理篇裏講到的基於特徵樹CF Tree的聚類。所以要使用BIRCH來聚類,關鍵是對CF Tree結構參數的處理。python
在CF Tree中,幾個關鍵的參數爲內部節點的最大CF數B, 葉子節點的最大CF數L, 葉節點每一個CF的最大樣本半徑閾值T。這三個參數定了,CF Tree的結構也基本肯定了,最後的聚類效果也基本肯定。能夠說BIRCH的調參就是調試B,L和T。git
至於類別數K,此時反而是可選的,不輸入K,則BIRCH會對CF Tree裏各葉子節點CF中樣本的狀況本身決定類別數K值,若是輸入K值,則BIRCH會CF Tree裏各葉子節點CF進行合併,直到類別數爲K。github
在scikit-learn中,BIRCH類的重要參數很少,下面一併講解。算法
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類。dom
4)compute_labels:布爾值,表示是否標示類別輸出,默認是True。通常使用默認值挺好,這樣能夠看到聚類效果。post
在評估各個參數組合的聚類效果時,仍是推薦使用Calinski-Harabasz Index,Calinski-Harabasz Index在scikit-learn中對應的方法是metrics.calinski_harabaz_score.學習
這裏咱們用一個例子來學習BIRCH算法。完整代碼參見個人github:https://github.com/nickchen121/machinelearning/blob/master/classic-machine-learning/birch_cluster.ipynb
首先,咱們載入一些隨機數據,並看看數據的分佈圖:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline from sklearn.datasets.samples_generator import make_blobs # X爲樣本特徵,Y爲樣本簇類別, 共1000個樣本,每一個樣本2個特徵,共4個簇,簇中心在[-1,-1], [0,0],[1,1], [2,2] X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.3, 0.4, 0.3], random_state =9) plt.scatter(X[:, 0], X[:, 1], marker='o') plt.show()
輸出圖以下:
如今咱們用BIRCH算法來聚類,首先咱們選擇不輸入可選的類別數K,看看聚類效果和Calinski-Harabasz 分數。
from sklearn.cluster import Birch y_pred = Birch(n_clusters = None).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() from sklearn import metrics print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
輸出圖以下:
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 2220.95253905
因爲咱們知道數據是4個簇隨機產生的,所以咱們能夠經過輸入可選的類別數4來看看BIRCH聚類的輸出。代碼以下:
y_pred = Birch(n_clusters = 4).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
輸出圖以下:
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 2816.40765268
可見若是咱們不輸入類別數的話,在某些時候BIRCH算法的聚類效果並不必定好,所以這個可選的類別數K通常仍是須要調參的。
對於threshold和branching_factor咱們前面尚未去調參,使用了默認的threshold值0.5和默認的branching_factor值50.
如今咱們將threshold從0.5下降爲0.3,讓BIRCH算法第一階段的CF Tree規模變大,並觀察Calinski-Harabasz 分數。
y_pred = Birch(n_clusters = 4, threshold = 0.3).fit_predict(X) print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 3295.63492273
可見此時的聚類效果有了進一步的提高,那麼是否是threshold越小越好呢?咱們看看threshold從0.3下降爲0.1時的狀況。
y_pred = Birch(n_clusters = 4, threshold = 0.1).fit_predict(X) print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 2155.10021808
也就是說threshold不是越小聚類效果越好。
咱們基於threshold爲0.3的狀況,調試下branching_factor,將branching_factor從50下降爲20.讓BIRCH算法第一階段的CF Tree規模變大。
y_pred = Birch(n_clusters = 4, threshold = 0.3, branching_factor = 20).fit_predict(X) print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 3301.80231064
可見調試branching_factor也可讓聚類分數提升。那麼和threshold相似,是否是branching_factor越小越好呢?咱們將branching_factor從20下降爲10,觀察聚類分數:
y_pred = Birch(n_clusters = 4, threshold = 0.3, branching_factor = 10).fit_predict(X) print "Calinski-Harabasz Score", metrics.calinski_harabaz_score(X, y_pred)
對應的Calinski-Harabasz 分數輸出爲:
Calinski-Harabasz Score 2800.87840962
也就是說和threshold相似,branching_factor不是越小聚類效果越好,須要調參。
以上就是BIRCH算法的一些經驗,但願能夠幫到朋友們。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)