python层次聚类_python进行层次聚类和k-means聚类

最近使用MDTraj对分子动力学轨迹进行聚类分析,接触到了python中的聚类实现,故将CSDN上一篇关于聚类的博客搬运至此,以作备忘:

scipy cluster库简介

scipy.cluster是scipy下的一个做聚类的package, 共包含了两类聚类方法:

矢量量化(scipy.cluster.vq:支持vector quantization 和 k-means 聚类方法

层次聚类(scipy.cluster.hierarchy:支持hierarchical clustering 和 agglomerative clustering(凝聚聚类)

聚类方法实现:k-means和hierarchical clustering.1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38###cluster.py

#导入相应的包

import scipy

import scipy.cluster.hierarchy as sch

from scipy.cluster.vq import vq,kmeans,whiten

import numpy as np

import matplotlib.pylab as plt

#生成待聚类的数据点,这里生成了20个点,每个点4维:

points=scipy.randn(20,4)

#1. 层次聚类

#生成点与点之间的距离矩阵,这里用的欧氏距离:

disMat = sch.distance.pdist(points,'euclidean')

#进行层次聚类:

Z=sch.linkage(disMat,method='average')

#将层级聚类结果以树状图表示出来并保存为plot_dendrogram.png

P=sch.dendrogram(Z)

plt.savefig('plot_dendrogram.png')

#根据linkage matrix Z得到聚类结果:

cluster= sch.fcluster(Z, t=1, 'inconsistent')

print "Original cluster by hierarchy clustering:\n",cluster

#2. k-means聚类

#将原始数据做归一化处理

data=whiten(points)

#使用kmeans函数进行聚类,输入第一维为数据,第二维为聚类个数k.

#有些时候我们可能不知道最终究竟聚成多少类,一个办法是用层次聚类的结果进行初始化.当然也可以直接输入某个数值.

#k-means最后输出的结果其实是两维的,第一维是聚类中心,第二维是损失distortion,我们在这里只取第一维,所以最后有个[0]

centroid=kmeans(data,max(cluster))[0]

#使用vq函数根据聚类中心对所有数据进行分类,vq的输出也是两维的,[0]表示的是所有数据的label

label=vq(data,centroid)[0]

print "Final clustering by k-means:\n",label

可以看出层次聚类的结果和k-means还是有区别的.

补充:一些函数的用法

linkage(y, method='single', metric='euclidean')

共包含3个参数:

y是距离矩阵,由pdist得到;method是指计算类间距离的方法,比较常用的有3种:

(1)single:最近邻,把类与类间距离最近的作为类间距

(2)complete:最远邻,把类与类间距离最远的作为类间距

(3)average:平均距离,类与类间所有pairs距离的平均

其他的method还有如weighted,centroid等等,具体可以参考linkage

fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None)

第一个参数Z是linkage得到的矩阵,记录了层次聚类的层次信息; t是一个聚类的阈值-“The threshold to apply when forming flat clusters”,在实际中,感觉这个阈值的选取还是蛮重要的.另外,scipy提供了多种实施阈值的方法(criterion):

inconsistent : If a cluster node and all its descendants have an inconsistent value less than or equal to t then all its leaf descendants belong to the same flat cluster. When no non-singleton cluster meets this criterion, every node is assigned to its own cluster. (Default)

distance : Forms flat clusters so that the original observations in each flat cluster have no greater a cophenetic distance than t.

……

其他的参数我用的是默认的,具体可以参考fcluster

kmeans(obs, k_or_guess, iter=20, thresh=1e-05, check_finite=True)

输入obs是数据矩阵,行代表数据数目,列代表特征维度; k_or_guess表示聚类数目;iter表示循环次数,最终返回损失最小的那一次的聚类中心;

输出有两个,第一个是聚类中心(codebook),第二个是损失distortion,即聚类后各数据点到其聚类中心的距离的加和.

参考页面kmeans

vq(obs, code_book, check_finite=True)

根据聚类中心将所有数据进行分类.obs为数据,code_book则是kmeans产生的聚类中心.

输出同样有两个:第一个是各个数据属于哪一类的label,第二个和kmeans的第二个输出是一样的,都是distortion

参考页面vq

Source:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-means是常用的聚类算法之一,它的主要思想是将数据点分为K个簇,使得同一簇内的点相似度较高,不同簇之间的点相似度较低。在scikit-learn中,KMeans聚类算法已经实现,可以方便地进行聚类操作。 本文将介绍使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍MiniBatchKMeans的使用。 ## 1. 数据准备 我们先生成一个随机数据集,用于演示KMeans聚类: ```python import numpy as np # 生成随机数据 np.random.seed(0) X = np.random.randn(1000, 2) # 生成1000个二维数据点 ``` ## 2. 模型训练 接下来,我们使用KMeans模型对数据进行聚类: ```python from sklearn.cluster import KMeans # 构建模型 kmeans = KMeans(n_clusters=3, random_state=0) # 训练模型 kmeans.fit(X) ``` 这里选择将数据分为3个簇,可以根据实际情况进行调整。训练完成后,我们可以查看簇中心点的位置: ```python print(kmeans.cluster_centers_) ``` 输出: ``` [[ 0.05161133 -0.96525049] [ 1.06359705 -0.02646225] [-0.9680658 0.04252211]] ``` ## 3. 预测和评估 训练完成后,我们可以使用训练好的模型对新数据进行预测: ```python # 预测新数据 y_pred = kmeans.predict(X) ``` 对于聚类算法,我们可以使用轮廓系数(Silhouette Coefficient)评估聚类效果。轮廓系数是一种衡量聚类质量的指标,取值范围在[-1, 1]之间,越接近1表示聚类效果越好。在scikit-learn中,可以使用metrics.silhouette_score来计算轮廓系数: ```python from sklearn import metrics # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 输出: ``` 0.6011942331016043 ``` ## 4. MiniBatchKMeans KMeans聚类算法的一个问题是它对于大规模数据的聚类会比较慢。因此,scikit-learn中还提供了MiniBatchKMeans算法,它可以加快聚类速度。 MiniBatchKMeans的使用方法与KMeans类似: ```python from sklearn.cluster import MiniBatchKMeans # 构建模型 mbkmeans = MiniBatchKMeans(n_clusters=3, random_state=0) # 训练模型 mbkmeans.fit(X) # 预测新数据 y_pred = mbkmeans.predict(X) # 计算轮廓系数 score = metrics.silhouette_score(X, y_pred) print(score) ``` 需要注意的是,MiniBatchKMeans算法在聚类效果上可能会稍微劣于KMeans算法,但是速度更加快捷。在处理大规模数据时,可以优先考虑使用MiniBatchKMeans算法。 本文介绍了使用scikit-learn中的KMeans聚类算法进行聚类的步骤和实现方法,并介绍了MiniBatchKMeans的使用。在实际应用中,可以根据实际情况选择不同的聚类算法和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值