用scikit-learn學習BIRCH聚類

BIRCH聚類算法原理中,咱們對BIRCH聚類算法的原理作了總結,本文就對scikit-learn中BIRCH算法的使用作一個總結。html

1、scikit-learn之BIRCH類

    在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

2、BIRCH類參數

    在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.學習

3、BIRCH運用實例

    這裏咱們用一個例子來學習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)

相關文章
相關標籤/搜索