文章目录
层次聚类
层次聚类(HierarchicalCustering)是聚类算法的一种,通过计算不同类别`数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。
作为一家公司的人力资源部经理,你可以把所有的雇员组织成较大的簇,如主管、经理和职员;
然后你可以进一步划分为较小的簇,例如,职员簇可以进一步划分为子簇:高级职员,一般职员和实习人员。
所有的这些形成了层次结构,可以很容易地对各层次上的数据进行汇总或者特征化。
如何划分才是合适的呢?
直观来看,上图中展示的数据划分为2个簇或4个簇都是合理的,甚至,如果上面每一个圈的内部包含的是大量数据形成的数据集,那么也许分成16个簇才是所需要的。
论数据集应该聚类成多少个簇,通常是在讨论我们在什么尺度上关注这个数据集。层次聚类算法相比划分聚类算法的优点之一是可以在不同的尺度上(层次)展示数据集的聚类情况。
基于层次的聚类算法(HierarchicalCustering)可以是凝聚的(Agglomerative)或者分裂的(Diisve),取决于层次的划分是"自底向上"还是"自项向下”。
自底向上的合并算法
层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合
,并反复迭代
这一过程。
简单的说层次聚类的合并算法是通过计算每一个类别的数据点
与所有数据点
之间的距离
来确定
它们之间的相似性
,距离越小,相似度越高。并将距离最近
的两个数据点或类别进行组合
,生成聚类树
。
相似度的计算
涉及到距离的时候,需要进行归一化处理,将所有的数值都压缩到0-1之间
层次聚类使用欧式距离
来计算不同类别数据点间的距离(相似度)。
D
=
(
x
1
−
y
1
)
2
+
(
x
2
−
y
2
)
2
D = \sqrt{(x_1-y_1)^2+(x_2-y_2)^2}
D=(x1−y1)2+(x2−y2)2
实例:数据点如下
分别计算欧式距离值(矩阵)
将数据点B与数据点C进行组合后,重新计算各类别数据点间的距离矩阵。数据点间的距离计算方式与之前的方法一样。
这里需要说明的是组合数据点(B.C)与其他数据点间的计算方法
。当我们计算(B,C)到A的距离时,需要分别计算B到A和C到A的距离均值
。
D = ( B − A ) 2 + ( C − A ) 2 2 = 21.6 + 22.6 2 D = \frac{\mathrm{\sqrt{(B-A)^2}}+\sqrt{(C-A)^2}}{\mathrm{2}} = \frac{\mathrm{21.6+22.6}}{\mathrm{2}} D=2(B−A)2 +(C−A)2 =221.6+22.6
经过计算数据点D到数据点E的距离在所有的距离值中最小,为1.20。
这表示在当前的所有数据点中(包含组合数据点),D和E的相似度最高。因此我们将数据点D和数据点E进行组合。并再次计算其他数据点间的距离。
后面的工作就是不断的重复计算数据点与数据点,数据点与组合数据点间的距离。这个步骤应该由程序来完成。
这里由于数据量较小,我们手工计算并列出每步的距离计算和数据点组合的结果。
两个组合数据点间的距离
计算两个组合数据点间距离的方法有三种,分别为Single Linkage,Compete Linkage和Average Linkage。
在开始计算之前,我们先来介绍下这三种计算方法以及各自的优缺点。
- Single Linkage:方法是将两个组合数据点中距离
最近
的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。 - Complete Linkage:Complete Linkage的计算方法与SingleLinkage相反,将两个组合数据点中距离
最远
的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。 - Average Linkage:Average Linkage的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的
均值
作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
我们使用Average Linkage计算组合数据点间的距离。下面是计算组合数据点(A,F)到(B,C)的距离,这里分别计算了(A,F)和(B,C)两两间距离的均值
。
D = ( A − B ) 2 + ( A − C ) 2 + ( F − B ) 2 + ( F − C ) 2 4 D = \frac{\mathrm{\sqrt{(A-B)^2}}+\sqrt{(A-C)^2}+\sqrt{(F-B)^2}+\sqrt{(F-C)^2}} {\mathrm{4}} D=4(A−B)2 +(A−C)2 +(F−B)2 +(F−C)2
树状图
实例
导入数据
import pandas as pd
seeds_df = pd.read_csv('D:/研/数学基础/统计分析/统计分析/聚类分析/datasets/seeds-less-rows.csv')
seeds_df.head()
查看
seeds_df.grain_variety.value_counts()
grain_variety
Kama wheat 14
Rosa wheat 14
Canadian wheat 14
Name: count, dtype: int64
数据当中已有类别分类,这时需要去掉这一列
varieties = list(seeds_df.pop('grain_variety'))
# 拿到数据的数值特征
samples = seeds_df.values
samples
导包
#距离计算的 还有树状图
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
进行层次聚类
#进行层次聚类
mergings = linkage(samples, method='complete')
树状图结果
#树状图结果
fig = plt.figure(figsize=(10,6))
dendrogram(mergings,
labels=varieties,
leaf_rotation=90,
leaf_font_size=15,
)
plt.show()
得到标签结果
#得到标签结果
#maximum height自己指定
from scipy.cluster.hierarchy import fcluster
labels = fcluster(mergings, 6, criterion='distance') # 这里高度为6,看上图,高度为6有三个簇
df = pd.DataFrame({'labels': labels, 'varieties': varieties})
ct = pd.crosstab(df['labels'], df['varieties'])
ct
不同距离的选择会产生不同的结果
import pandas as pd
scores_df = pd.read_csv('D:/研/数学基础/统计分析/统计分析/聚类分析/datasets/eurovision-2016-televoting.csv', index_col=0)
country_names = list(scores_df.index)
scores_df.head()
缺失值填充,没有的就先按满分
#缺失值填充,没有的就先按满分算吧
scores_df = scores_df.fillna(12)
涉及到距离的时候,需要进行归一化处理,将所有的数值都压缩到0-1之间
归一化
from sklearn.preprocessing import normalize
samples = normalize(scores_df.values)
samples
如果没有找到sklearn,这执行以下命令
conda install scikit-learn
树状图结果(参数single)
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
mergings = linkage(samples, method='single')
fig = plt.figure(figsize=(10,6))
dendrogram(mergings,
labels=country_names,
leaf_rotation=90,
leaf_font_size=10,
)
plt.show()
树状图结果(参数complete)
mergings = linkage(samples, method='complete')
fig = plt.figure(figsize=(10,6))
dendrogram(mergings,
labels=country_names,
leaf_rotation=90,
leaf_font_size=10,
)
plt.show()
标签:层次,组合,df,什么,距离,聚类,数据,点间
From: https://blog.csdn.net/weixin_50569789/article/details/139545674