機器學習:BIRCH聚類、譜聚類

1、BIRCH聚類

BIRCH的全稱是利用層次方法的平衡迭代規約和聚類(Balanced Iterative Reducing and Clustering Using Hierarchies)。BIRCH算法利用了一個樹結構來快速的聚類,這個數結構類似於平衡B+樹,一般將它稱之爲聚類特徵樹(Clustering Feature Tree,簡稱CF Tree)。這顆樹的每一個節點是由若干個聚類特徵(Clustering Feature,簡稱CF)組成。
一般來說,BIRCH算法適用於樣本量較大和類別數比較大的情況,需要進行調參。

BIRCH算法的主要優點有:

  1. 節約內存,所有的樣本都在磁盤上,CF Tree僅僅存了CF節點和對應的指針。
  2. 聚類速度快,只需要一遍掃描訓練集就可以建立CF Tree,CF Tree的增刪改都很快。
  3. 可以識別噪音點,還可以對數據集進行初步分類的預處理。

BIRCH算法的主要缺點有:

  1. 由於CF Tree對每個節點的CF個數有限制,導致聚類的結果可能和真實的類別分佈不同。
  2. 對高維特徵的數據聚類效果不好。
  3. 如果數據集的分佈簇不是類似於超球體,或者說不是凸的,則聚類效果不好。
# BIRCH聚類,使用默認參數
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import Birch
from sklearn.metrics import calinski_harabaz_score
import matplotlib.pyplot as plt

# 隨機生成數據
x, y = make_blobs(n_samples=1000, centers=[[-2, -2], [-1, -1], [0, 0], [1, 1]], cluster_std=[0.3, 0.4, 0.5, 0.3], random_state=2)

# BIRCH聚類
birch = Birch(n_clusters=None, threshold=0.5, branching_factor=50).fit(x)

# 預測
y_pred = birch.predict(x)

# 可視化
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()

# 使用calinski_harabaz_score作爲模型評估標準
print(calinski_harabaz_score(x, y_pred))

在這裏插入圖片描述

# BIRCH聚類,調參
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import Birch
from sklearn.metrics import calinski_harabaz_score
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt

# 隨機生成數據
x, y = make_blobs(n_samples=1000, centers=[[-2, -2], [-1, -1], [0, 0], [1, 1]], cluster_std=[0.3, 0.4, 0.5, 0.3], random_state=2)

# 類別數
n_clusters = [2, 3, 4, 5]

# 葉子節點每個CF的最大樣本半徑閾值
thresholds = [0.3, 0.4, 0.5, 0.6]

# CF樹內部節點的最大CF
branching_factors = [30, 40, 50, 60]

# 調參,得到最優的參數組合
def get_best_params():
    max_chs = 0
    for n in n_clusters:
        for t in thresholds:
            for b in branching_factors:
                birch = Birch(n_clusters=n, threshold=t, branching_factor=b).fit(x)
                y_pred = birch.predict(x)
                chs = calinski_harabaz_score(x, y_pred)  # 用Calinski-Harabasez分數作爲評估標準
                if chs > max_chs:
                    max_chs = chs
                    best_n = n
                    best_t = t
                    best_b = b
    return best_n, best_t, best_b, max_chs

best_n, best_t, best_b, max_chs = get_best_params()

print('best n_cluster: ', best_n)
print('best threshold: ', best_t)
print('best branching_factor: ', best_b)
print('max Calinski-Harabasez_score: ', max_chs)

birch = Birch(n_clusters=best_n, threshold=best_t, branching_factor=best_b).fit(x)
y_pred = birch.predict(x)

plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()

best n_cluster: 4
best threshold: 0.6
best branching_factor: 30
max Calinski-Harabasez_score: 3111.9410181233275
在這裏插入圖片描述

2、譜聚類Spectral Clustering

# 譜聚類
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import SpectralClustering
from sklearn.metrics import calinski_harabaz_score
import matplotlib.pyplot as plt

# 隨機生成數據
x, y = make_blobs(n_samples=500, n_features=6, centers=5, cluster_std=[0.8, 0.5, 0.8, 0.5, 0.6], random_state=2)

# 參數
n_clusters = [3, 4, 5, 6]
gamma = [0.01, 0.1, 1, 10]

# 調參
def get_best_params():
    max_chs = 0
    for n in n_clusters:
        for g in gamma:
            y_pred = SpectralClustering(n_clusters=n, gamma=g).fit_predict(x)
            chs = calinski_harabaz_score(x, y_pred)
            if chs > max_chs:
                max_chs = chs
                best_n = n
                best_gamma = g
    return best_n, best_gamma, max_chs

best_n, best_gamma, max_ = get_best_params()
print('best clusters: ', best_n)
print('best gamma: ', best_gamma)
print('max chs: ', max_chs)

best clusters: 5
best gamma: 0.01
max chs: 3111.9410181233275

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