基于scikit-learn层次聚类方法

之前写过基于scipy库的层次聚类的博客,前段时间一直在用scikit-learn(sklearn)库的聚类包做层次聚类。下面就sklearn下的层次聚类问题展开描述。
sklearn库下的层次聚类是在sklearn.cluster的 AgglomerativeClustering中,AgglomerativeClustering类的构造函数的参数有簇的个数n_clusters,连接方法linkage,连接度量选项affinity三个重要参数。下面就这三个参数进行描述。
簇的个数n_clusters是需要用户指定的,按照常理来说,凝聚层次聚类是不需要指定簇的个数的,但是sklearn的这个类需要指定簇的个数。算法会根据簇的个数判断最终的合并依据,这个参数会影响聚类质量。
连接方法linkage指的是衡量簇与簇之间的远近程度的方法。具体说来包括最小距离,最大距离和平均距离三种方式。对应于簇融合的方法,即簇间观测点之间的最小距离作为簇的距离,簇间观测点之间的最大距离作为簇的距离,以及簇间观测点之间的平均距离作为簇的距离。一般说来,平均距离是一种折中的方法。
连接度量选项affinity是一个簇间距离的计算方法,包括各种欧式空间的距离计算方法以及非欧式空间的距离计算方法。此外,该参数还可以设置为‘precomputed’,即用户输入计算好的距离矩阵。距离矩阵的生成方法:假设用户有n个观测点,那么先依次构造这n个点两两间的距离列表,即长度为n*(n-1)/2的距离列表,然后通过scipy.spatial.distance的dist库的squareform函数就可以构造距离矩阵了。这种方式的好处是用户可以使用自己定义的方法计算任意两个观测点的距离,然后再进行聚类。
聚类结束以后,需要对聚类质量进行评估。使用轮廓系数评估聚类质量。
对于n个对象的数据集D,假设D被划分为k个簇。对于D中的每个对象o,计算它和它所属的簇的其他对象的平均距离a(o)。类似的,计算它和它不属于的簇的最小平均距离b(o)。对数据集中的每个对象计算轮廓系数然后取平均值作为聚类的质量度量。轮廓系数的取值范围是[-1,1],越靠近1代表聚类质量越好,越靠近-1代表聚类质量越差。通过sklearn的metric库的silhouette_score函数即可,silhouette_score的参数有:X, labels, metric,X为距离矩阵,labels为聚类结果,metric为度量方法。由于我们输入的是距离矩阵,因此选择"precomputed"。
调用方法:
层次聚类:
from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters=n_clusters, affinity="precomputed", linkage='average')
labels = model.fit_predict(dist_matrix)
距离矩阵构造:
import scipy.spatial.distance as dist
dist_matrix = dist.squareform(dist_list)# dist_list 为n*(n-1)/2大小的list
轮廓系数计算:
from sklearn import metrics
metrics.silhouette_score(dist_matrix, labels, metric="precomputed")






  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值