作者:小明
为啥做这个?我猜是模式识别的课程让我写的。
无私奉献啊哈哈哈哈
本文主要针对层次聚类算法做一个详解,并使用代码进行复述,可供大家理解一下什么是层次聚类分析算法哈!
层次聚类算法的定义为:通过某种可计算方法的相似度测度计算节点(分析对象)之间的相似性,并按相似度由高到低排序,逐步重新连接个节点,得到一个单聚类结果。
简单描述就相当于:三角形的重点、中点、及内心这种点也属于不断地聚类结果。
思考:当一个无限大的多散点聚类之后,结果是什么?
结果是一个点,所有的无限大多散点其实就是一个圆(球),那么得到的最终结果就是按照地球地心形式,聚集于一点。
相似度计算方法:在另外一篇博客,自己去看看咯:
步骤一:导入相关的库:
必要的数据科学库为:pandas numpy
使用聚类所需要的的库:scipy.cluster.hierachy
绘图使用的库:matplotlib(我们只用到这个库里面的pyplot模块)
#导入相关的库进行使用
import pandas as pd
import numpy as np
import scipy.cluster.hierarchy as sch
import matplotlib.pyplot as plt
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 设置可以支持中文显示
步骤二:读取相关数据,这里我是使用的处理好的数据文件(简单拿二维数据)
df = pd.read_excel(r'C:\Users\小明\Desktop\层次聚类样本点.xlsx')
df.head(10)
步骤三:给每个点做好标注(使用序号)
'''
新建图层
匹配横纵坐标
绘制散点图及图例
做序列解包,标注相对应的点(text文本标注)
绘制均值垂直线
增加网格(true)
'''
plt.figure(figsize=(10, 8))
x, y = df['横坐标'], df['纵坐标']
label = df['序号']
plt.scatter(x, y)
plt.xlabel('横坐标'); plt.ylabel('纵坐标')
for a,b,l in zip(x,y,label):
plt.text(a, b+0.1, '%s' % l, ha='center', va='bottom', fontsize=14)
plt.vlines(x=df['横坐标'].mean(), ymin=-1.5, ymax=3, colors='red', linewidth=2)
plt.hlines(y=df['纵坐标'].mean(), xmin=-4, xmax=6,colors='red', linewidth=2)
plt.grid(True)
步骤四:进行层次聚类分析
做相似度分析:使用欧式距离进行聚类,对横纵坐标进行
disMat = sch.distance.pdist(X=df[['横坐标', '纵坐标']], metric='euclidean')
# 进行层次聚类: 计算距离的方法使用 ward 法
Z = sch.linkage(disMat,method='ward')
#树状获得结果,显示的好看这不是?
P = sch.dendrogram(Z,labels=df.序号.tolist())
plt.savefig('聚类结果.png')
当然啦,最长的,这不就是改一下方法就好咯:
# 进行层次聚类: 计算距离的方法使用 complete 法
Z2 = sch.linkage(disMat,method='complete')
P2 = sch.dendrogram(Z2,labels=df.序号.tolist())
plt.savefig('聚类结果2.png')
完结撒花~~~
觉得有帮助点个赞呗!
或者有疑问建议评论哦!