数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn

凝聚层次聚类

  • 层次聚类方法
  • 凝聚层次聚类
    • 算法原理
  • 簇间距离计算方法
    • 单链法single
    • 全链法complete
    • 组平均法 average
    • ward法
  • python代码实现
  • 绘制层次聚类树状图
  • 一些参考

相关文章:

数据挖掘 | [关联规则] 利用apyori库的关联规则python代码实现
数据挖掘 | [有监督学习——分类] 决策树基本知识及python代码实现——利用sklearn
数据挖掘 | [有监督学习——分类] 朴素贝叶斯及python代码实现——利用sklearn
数据挖掘 | [无监督学习——聚类] K-means聚类及python代码实现——利用sklearn

层次聚类方法

对给定的数据集进行层次的分解,直到某种条件满足为止,具体又可分为:

  • 凝聚层次聚类:自底向上,先将每个对象作为簇,然后合并为越来越大的簇,直到某个终止条件被满足
  • 分裂层次聚类:自顶向下,香江所有对象置于一个簇中,然后逐渐细分为越来越小的簇,直到某个终止条件被满足

凝聚层次聚类

输入:给定要聚类的N个对象以及N*N的距离矩阵(或者是相似性矩阵)

输出:嵌套簇图

算法原理

  • 将每个对象归为一簇, 共得到N个簇,每簇仅包含一个对象;
  • 计算 簇与簇之间的距离,亦即它们所包含的对象之间的距离;
  • repeat
  •    将最接近的两个簇并合并成一类, 于是总的簇数少了一个; 
    
  •    重新计算簇与簇之间的距离; 
    
  • until 仅剩下一个簇。

簇间距离计算方法

凝聚层次聚类算法中的一个关键步骤就是计算簇与簇之间的距离。
簇与簇之间距离的基本计算方法有如下几种:

  • 单链法:single-linkage
  • 全链法:complete-linkage
  • 组平均法:average-linkage
  • Ward方法

单链法single

簇间距离等于两簇对象之间的最小距离,如果用相似度衡量,则是两簇对象间的最大相似度。
分别求一个簇中每一个对象与另一个簇中的每一个对象的距离,然后取距离的最小值作为簇间距离。
簇间距离可以定义为:
单链法簇间距离

全链法complete

簇间距离等于两组对象之间的最大距离。
簇间距离可以定义为:
全链法簇间距离

组平均法 average

簇间距离等于两组对象之间的平均距离。
簇间距离可以定义为:
数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn_第1张图片

ward法

簇间距离等于两个簇合并时导致的平方误差增量。
如果Ci要合并Cj,首先计算合并形成一个簇Ci+j后簇内的平方误差和Ei+j
然后计算∆Ei+j=| Ei+j — Ei |。并以此作为簇间距离。

python代码实现


import numpy as np
import pandas as pd
import sklearn.cluster as sc
from sklearn import metrics

data_pd=pd.read_csv('csv数据路径',sep=',')
data_arr=np.array(data_pd)   #将dataframe转换成array

#生成属性数据集和结果数据集
dataMat = np.mat(data_arr)
X = dataMat[:,0:40]
#X=X.A
y1 = dataMat[:,40]
y1=y1.A   #将numpy中的matrix(矩阵)数据类型转换为numpy中的array(数组)数据类型

# 此时y1是数组类型,而数组中每一个元素又是一个数组,有两层
# 调用sklearn中模型评估方法metrics时会报错,该方法要求数据为一层
y=[]
for i in y1:
    for j in i:
        y.append(j)
#print(y)

#模型训练
hierarchy = sc.AgglomerativeClustering(n_clusters=3,linkage='ward')
print(hierarchy)

# 预测聚类模型
pre_y =hierarchy.fit_predict(X)
print(pre_y)


#以下参考了:https://blog.csdn.net/tonydz0523/article/details/84659905
### 模型效果指标评估 ###
adjusted_rand_s = metrics.adjusted_rand_score(y, pre_y) # 调整后的兰德指数
mutual_info_s = metrics.mutual_info_score(y, pre_y) # 互信息
adjusted_mutual_info_s = metrics.adjusted_mutual_info_score(y, pre_y) # 调整后的互信息
homogeneity_s = metrics.homogeneity_score(y, pre_y) # 同质化得分
completeness_s = metrics.completeness_score(y, pre_y) # 完整性得分
v_measure_s = metrics.v_measure_score(y, pre_y) # V-measure得分
silhouette_s = metrics.silhouette_score(X, pre_y, metric='euclidean') # 平均轮廓系数
calinski_harabasz_s = metrics.calinski_harabasz_score(X, pre_y) # Calinski 和 Harabaz 得分
df_metrics = pd.DataFrame([[adjusted_rand_s,mutual_info_s, adjusted_mutual_info_s, homogeneity_s,
                            completeness_s,v_measure_s, silhouette_s ,calinski_harabasz_s]],
                            columns=['tARI','tMI','tAMI','thomo','tcomp','tv_m','tsilh','tc&h'])

#dataframe输出有时候会省略中间的变量,下面这行代码是为了让它能够全部显示
pd.set_option('display.max_columns',None)  
print(df_metrics)

输出结果:

AgglomerativeClustering(affinity='euclidean', compute_full_tree='auto',
                        connectivity=None, distance_threshold=None,
                        linkage='ward', memory=None, n_clusters=3,
                        pooling_func='deprecated')
[1 1 0 ... 1 0 0]
       tARI       tMI      tAMI     thomo     tcomp      tv_m     tsilh  \
0  0.302902  0.417515  0.379833  0.380059  0.398867  0.389236  0.145804   
          tc&h  
0  1130.646255  

绘制层次聚类树状图

#绘制树状图
#以下参考了:https://blog.csdn.net/weixin_45488228/article/details/102493562
from scipy.cluster.hierarchy import dendrogram, ward, single,complete,average
import matplotlib.pyplot as plt

linkage_matrix = ward(X)  #此处可替换成其它簇间距离计算方法
dendrogram(linkage_matrix)
plt.savefig('.jpg')
plt.show

输出的结果:
数据挖掘 | [无监督学习——聚类] 凝聚层次聚类及python代码实现——利用sklearn_第2张图片

一些参考

聚类效果的评估参考了大佬一的文章,指标详细解释可以看大佬的文章,也可以看sklearn的参考文档。

树状图的绘制则参考了大佬二的文章。

你可能感兴趣的:(数据挖掘·初学者,聚类,数据挖掘,python,机器学习,大数据)