层次聚类分析

作者:小明
为啥做这个?我猜是模式识别的课程让我写的。
无私奉献啊哈哈哈哈

本文主要针对层次聚类算法做一个详解,并使用代码进行复述,可供大家理解一下什么是层次聚类分析算法哈!

算法定义:

层次聚类算法的定义为:通过某种可计算方法的相似度测度计算节点(分析对象)之间的相似性,并按相似度由高到低排序,逐步重新连接个节点,得到一个单聚类结果。

简单描述就相当于:三角形的重点、中点、及内心这种点也属于不断地聚类结果。

思考:当一个无限大的多散点聚类之后,结果是什么?

结果是一个点,所有的无限大多散点其实就是一个圆(球),那么得到的最终结果就是按照地球地心形式,聚集于一点。

算法步骤:

  1. 移除网络中的所有边,得到有n个孤立节点的初始状态;(做离散化)
  2. 计算网络中每对节点的相似度;(相似度计算);
  3. 根据相似度从强到弱连接相应节点对,形成树状图;(绘制图像)
  4. 根据实际需求横切树状图,获得社区结构。(切割图像)

 

相似度计算方法:在另外一篇博客,自己去看看咯:

 

 

实例带你走一遍:

步骤一:导入相关的库:
必要的数据科学库为: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')

完结撒花~~~
觉得有帮助点个赞呗!

或者有疑问建议评论哦!

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐