相关文章:
数据挖掘 | [关联规则] 利用apyori库的关联规则python代码实现
数据挖掘 | [有监督学习——分类] 决策树基本知识及python代码实现——利用sklearn
数据挖掘 | [有监督学习——分类] 朴素贝叶斯及python代码实现——利用sklearn
数据挖掘 | [无监督学习——聚类] K-means聚类及python代码实现——利用sklearn
对给定的数据集进行层次的分解,直到某种条件满足为止,具体又可分为:
输入:给定要聚类的N个对象以及N*N的距离矩阵(或者是相似性矩阵)
输出:嵌套簇图
将最接近的两个簇并合并成一类, 于是总的簇数少了一个;
重新计算簇与簇之间的距离;
凝聚层次聚类算法中的一个关键步骤就是计算簇与簇之间的距离。
簇与簇之间距离的基本计算方法有如下几种:
簇间距离等于两簇对象之间的最小距离,如果用相似度衡量,则是两簇对象间的最大相似度。
分别求一个簇中每一个对象与另一个簇中的每一个对象的距离,然后取距离的最小值作为簇间距离。
簇间距离可以定义为:
簇间距离等于两个簇合并时导致的平方误差增量。
如果Ci要合并Cj,首先计算合并形成一个簇Ci+j后簇内的平方误差和Ei+j。
然后计算∆Ei+j=| Ei+j — Ei |。并以此作为簇间距离。
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
聚类效果的评估参考了大佬一的文章,指标详细解释可以看大佬的文章,也可以看sklearn的参考文档。
树状图的绘制则参考了大佬二的文章。