首页 > 编程语言 >机器学习python实践——关于ward聚类分层算法的一些个人心得

机器学习python实践——关于ward聚类分层算法的一些个人心得

时间:2024-06-13 10:02:24浏览次数:24  
标签:python 样本 平方和 聚类 编号 ward 离差

最近在利用python跟着参考书进行机器学习相关实践,相关案例用到了ward算法,但是我理论部分用的是周志华老师的《西瓜书》,书上没有写关于ward的相关介绍,所以自己网上查了一堆资料,都很难说清楚ward算法,幸好最后在何晓群老师的《多元统计分析》这本书找到了比较清晰的说法,所以总结出了一些心得,在这篇文章中记录一下,同时,分享给广大网友,大家一起探讨一下,如果有误,也请谅解。

一、方差、离差平方和

方差:

离差平方和:

对比方差和离差平方和公式,我们可以清楚的看到,离差平方和就是方差公式中的分子部分

另外,我解释一下,可能很多人在网上看到的离差平方和公式跟我给出的有点区别,但是两者是一样的,只是网上大部分是拆开并且化简过得,而我这个是和起来的,同样因为我ward算法看的是何晓群老师的书,所以跟书上的表达方式保持一致

同时,对于方差,大家网上看到最多的形式应该是上述的形式,但是在聚类分析中,数据点常常是多维数据,所以很多人可能不太清楚对于多维数据方差该如何计算,下面举个二维数据的例子,大家看一下。每个样本通常由两个特征(例如坐标)组成,如(x1,x2),所以方差如下:

其中表示第i个样本点的第一个特征,表示样本均值点的第一个特征   

从上述的公式,我们也就可以知道,离差平方和其实就等于每个样本点到样本均值点的距离的平方和

二、ward算法原理

ward算法认为同类样本之间的离差平方和应该尽量小,不同类之间的离差平方和应该尽量大。

假设,现在有n个样本,我们要将他分成k类,那么第t类样本的离差平方和以及整个类内的离差平方和如下所示:

其中, 表示第t类样本的个数,表示第t类样本中的第i个样本,表示第t类样本的均值点

ward算法的目标就是使得聚类完成之后整个类内的离差平方和达到极小,至于为什么,下面解释一下:

从上面的公式中,我们可以看出来,整个类内的离差平方和就是对各类样本的离差平方和的求和,因为ward要求同类样本之间的离差平方和最小,即要求最小,所以整个类内的离差平方和 也会达到最小

注意:整个类内的离差平方和不等于不同类之间的离差平方和

引用何晓群老师《多元统计分析》一书中的原话:如果直接将所有分类可能性的离差平方和算出来,然后找出使达到极小的分类,那么这个计算量是巨大的,对计算机要求是非常高的,因此,ward算法是一种寻找局部最优解的方法,其思想就是先让n个样品各自成一类,然后每次缩小一类,每缩小一类,离差平方和就要增大,选择使增加最小的两类合并,直到所有的样品归为一类为止

我们应该都知道层次聚类算法,本质上都是通过距离来对样本进行聚类操作,距离相近的簇(类)会被划分到同一簇中,所以,ward算法也为我们提供了一种簇间距的算法,帮助我们直接通过对簇间距的计算来近似获得局部最优解,公式如下:

np表示Gp类中样本个数,nk表示Gk类中的样本个数,nr表示Gr类中的样本个数

可能有些小伙伴对于这个上面的距离递推公式看的很迷,所以下面我会借用SciPy帮助文档例子进行举例说明

三、ward算法距离推导公式举例说明

SciPy帮助文档例子的代码如下:

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
X = [[i] for i in [2, 8, 0, 4, 1, 9, 9, 0]]
Z = linkage(X, 'ward')
fig = plt.figure(figsize=(25, 10))
dn = dendrogram(Z)
print(Z)
plt.show()

通过代码我们知道输入的是数组X,输出的是链接数组Z,其中X是一个8行1列的二维数组,每一行数据都代表着一个位置标记,同时,根据网上大佬的说法Z是一个n行4列的数组,前两列表示要聚类的簇的编号,第三列表示两个即将聚类的簇之间的距离,第四列表示聚类所得的新簇中含有的样本个数

Z的输出如下:

对应于第一行数据可能有些小伙伴会觉得疑惑,5、6是哪里来的?因为上文中已经说过了ward算法会先n个样本各成一类,所以5、6代表数组X的8个样本中编号为5和6的样本,数组X的样本编号对照表如下:

X28041990
簇编号01234567

根据表可以知道,簇编号为5、6代表的样本就是两个位置为9的样本

同时,编号5、6的簇又会聚类成会编号为8的新簇,同理,依次递推,编号2、7的样本又会聚类成会聚类成编号为9的新簇……结果如下所示:

进行聚类操作的簇编号5、62、70、41、89、103、1211、13
新聚类的簇编号891011121314

Z的前两列我已经通过表格说明了,但是相信很多人卡就卡在不知道第三列数据是怎么求的

所以下面对Z的第三列数据进行说明:

重点来了!!!!

第一行数据:由第一个表可知编号为5、6的簇,且都仅包含一个样本,所以样本的位置就代表簇的位置,因此两簇的位置都是9,两簇的距离

第二行数据:由第一个表可知编号为2、7的簇,且都仅包含一个样本,所以样本的位置就代表簇的位置,因此两簇的位置都是0,两簇距离

第三行数据:由第一个表可知编号为0、4的簇,且都仅包含一个样本,所以样本的位置就代表簇的位置,因此两簇的位置分别是2和1,两簇的距离

第四行数据:由第一个表可知编号为1簇仅有一个样本,由表二可知编号为8的簇是由簇5和簇6聚类而来,其中含有两个样本,所以,为了计算簇1和簇8之间的距离,这时就需要用到上述所说到的ward算法的距离递推公式,计算流程如下:

 注意:Dw后面括号中的数字代表簇编号

第五行数据:由第二个表可知编号为9的簇是由簇2和簇7聚类而来,其中含有两个样本,编号为10的簇是由簇0和簇4聚类而来,其中含有两个样本,所以,为了计算簇9和簇10之间的距离,这时就需要用到上述所说到的ward算法的距离递推公式,计算流程如下:

 所以:

 因为比较懒,所以第六行与第七行中的第三列数据我就不再详细列计算过程了,大家看了第四行和第五行的计算过程应该也能明白如何使用ward的距离推导公式了

参考文章:

何晓群.多元统计分析(第五版)[M].中国人民大学出版社,2019.

Python层次聚类sci.cluster.hierarchy.linkage函数详解_scipy.cluster.hierarchy-CSDN博客

标签:python,样本,平方和,聚类,编号,ward,离差
From: https://blog.csdn.net/SZX0311/article/details/139626901

相关文章

  • python 中的多态
    多态的基本思想是相同的操作可以作用于不同的对象。这个概念可以通过方法重写和鸭子类型来实现。方法重写(MethodOverriding)在继承体系中,子类可以重写(覆盖)父类的方法,从而提供子类特有的实现。这样,即使不同的对象实现了不同的方法,它们仍然可以通过相同的接口进行调用。示例:方......
  • python中如何实现两个Excel之间Sheet的复制(保留原格式)
    方法一(通用)在前面如果你的python是x32的,并且安装的是WPS,可以考虑使用三方库win32com来实现。示例代码importwin32com.clientasclient#xl=client.Dispatch("Excel.Application")xl=client.gencache.EnsureDispatch("Ket.Application")#wpsusexl.Visible=......
  • 用Python处理Excel的资源
    用Python处理Excel的资源python-excel读写Excel文件openpyxlopenpyx文档l读写Excel2010文件(即xlsx)openpyxl示例:fromopenpyxlimportWorkbookwb=Workbook()#获取activeworksheetws=wb.active#给单元格赋值ws['A1']=42#添加行ws.append([1,2,3......
  • python-11-def函数 好比是sop 调用函数可以让程序听令
    学习内容:《python编程:从入门到实践》第二版知识点:定义函数、调用函数、形参、实参练习内容:练习8-1:消息编写一个名为display_message()的函数,它打印一个句子,指出你在本章学的是什么。调用这个函数,确认显示的消息正确无误。练习8-2:喜欢的图书编写一个名为favorite_book()......
  • 【Python】使用OpenCV特征匹配检测图像中的【特定水印】
    如果没有方向往哪里走都是前方做自己的光不需要多亮曾受过的伤会长出翅膀大雨冲刷过的天空会更加明亮流过泪的眼睛也一样做自己的光悄悄的发亮逆风的方向更容易飞翔世界怎样在于你凝视它的目光那未曾谋面过的远方或许就在身旁              ......
  • python pyenv
    pyenv安装安装依赖包yum-yinstallgitgccmakepatchzlib-develgdbm-developenssl-develsqlite-develbzip2-develreadline-devel安装pyenvcurl-Lhttps://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer|bash设置环境变量......
  • Python3 笔记:字符串的 replace() 和 expandtabs()
    1、replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。语法:str.replace(old,new[,max])参数:old:将被替换的子字符串。new:新字符串,用于替换old子字符串。max:可选参数,如果填写则表示替换不超过max次。str1='old......
  • Python列表和元组的底层实现
    引言在Python编程中,列表(List)和元组(Tuple)是两种非常常用的数据结构。它们都用于存储序列数据,但列表是可变的,而元组是不可变的。本文将深入探讨Python列表和元组的底层实现原理,帮助你更好地理解它们的行为和性能特点。1.列表的底层实现列表在Python中是通过数组实现的。数......
  • Python字典基本用法
    引言在Python的世界里,字典(Dictionary)是一种非常强大的数据结构,它以键值对的形式存储数据,提供了快速的数据检索能力。本文将带你深入了解Python字典的基本概念、基本操作以及一些高级技巧,帮助你在编程中更加得心应手。1.字典的基本概念Python的字典是一种可变容器模型,且......
  • CEC2013(python):六种算法(ABC、PSO、CSO、OOA、DBO、RFO)求解CEC2013
    一、六种算法简介1、人工蜂群算法(ArtificialBeeColonyAlgorithm,ABC)2、粒子群优化算法PSO3、鸡群优化算法CSO4、鱼鹰优化算法OOA5、蜣螂优化算法DBO6、红狐优化算法RFO二、6种算法求解CEC2013(1)CEC2013简介参考文献:[1]LiangJJ, QuBY, SuganthanPN......