sklearn Hierarchical Clustering

本文介绍了如何使用sklearn库中的AgglomerativeClustering进行层次聚类,并探讨了complete、average和ward's method三种聚类准则。通过nudge_image函数增加样本量,结合SpectralEmbedding进行降维,然后应用层次聚类算法,展示了不同链接方式的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

层次聚类
基于一定的规则生成树形结构(各个类数),比较消耗性能。

AgglomerativeClustering: 使用自底向上的聚类方法。
主要有三种聚类准则:
complete(maximum) linkage: 两类间的距离用最远点距离表示。
avarage linkage:平均距离。
ward's method: 以组内平方和最小,组间平方和最大为目的。

numpy.apply_along_axis(func1d, axis)
该函数对指定的axis应用func1d并返回相应的数组,
当设定的函数是多维函数(对数组的每一个变量进行处理时,返回与输入数组
相同形式的数组,这是明显的)

scipy.ndimage.shift:
这里shift指平移变换,这里对数据进行样条插值变换,默认利用3阶多项式进行
插值(order = 3) 应当理解为对图像进行平移时遇到原图没有的点利用插值生成。
mode = 'constant',超过插值范围的数用常数进行过滤.
input为输入数组,shift为对应的平移参数,当为float时为所有轴相同
平移,还可以按每个轴方向输入平移数组。

下面的函数nudge_images 相当于利用平移插值增加了一倍的样本量。
这提供了一种增加样本量的方法。(对原数据,当不知道分布时)

sklearn.manifold.SpectralEmbedding
利用谱聚类中步骤实现降维。(使用图的拉普拉斯矩阵较小特征值对应的特征向量
给出数据的表征)
affinify指定使用的相似性矩阵。
这是一种降维方法,与PCA是可以做比较的,因为其目的是样本数据分类特征最优,
与数据内部方差最大类似。

下面是例子:(由于谱聚类降维及层次聚类对高维数据比较消耗时间,运行时间会比较长)
from time import time 
import numpy as np 
from scipy import ndimage 
from matplotlib import pyplot as plt 
from sklearn import manifold, datasets 

digits = datasets.load_digits(n_class = 10)
X = digits.data 
y = digits.target 
n_samples, n_features = X.shape 

np.random.seed(0)
def nudge_image(X, y):
 shift = lambda x: ndimage.shift(x.reshape((8, 8)), .3 * np.random.normal(size = 2),
     mode = 'constant').ravel() 
 X = np.concatenate([X, np.apply_along_axis(shift, 1, X)])
 Y = np.concatenate([y, y], axis = 0)
 return X, Y 

X, y = nudge_image(X, y)

def plot_clustering(X_red, X, labels, title = None):
 x_min, x_max = np.min(X_red, axis = 0), np.max(X_red, axis = 0)
 X_red = (X_red - x_min) / (x_max - x_min)

 plt.figure(figsize = (6, 4))
 for i in range(X_red.shape[0]):
  plt.text(X_red[i,0], X_red[i,1], str(y[i]), color = plt.cm.spectral(labels[i]/10.),
     fontdict = {'weight': 'bold', 'size': 9})

 plt.xticks([])
 plt.yticks([])
 if title is not None:
  plt.title(title, size = 17)
 plt.axis('off')
 plt.tight_layout()

print "Computing embedding"
X_red = manifold.SpectralEmbedding(n_components = 2).fit_transform(X)
print "Done."

from sklearn.cluster import AgglomerativeClustering 

for linkage in ('ward', 'average', 'complete'):
 clustering = AgglomerativeClustering(linkage = linkage, n_clusters = 10)
 t0 = time()
 clustering.fit(X_red)
 print "%s : %.2fs" % (linkage, time() - t0)
 plot_clustering(X_red, X, clustering.labels_, "%s linkage" % linkage)

plt.show()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值