在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)