入门机器学习(西瓜书+南瓜书)聚类总结(python代码实现)

news/2024/5/20 7:28:37 标签: 聚类, python

python_0">入门机器学习(西瓜书+南瓜书)聚类总结(python代码实现)

一、聚类

1.1 通俗理解

聚类,顾名思义就是把数据特征相似的数据聚为一类。属于无监督学习的范畴。没有标签值的监督,因此不同的聚类算法,聚类的结果也不同。
俗话说物以类聚。聚类就是按照某一个特定的标准(比如距离),把一个数据集分割成不同的类或簇(cluster),使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇内的数据对象的差异性也尽可能的大。聚类可以作为一个单独过程,用于寻找数据内在分布结构,也可以作为其他学习任务前驱过程。聚类和分类的区别在于聚类是无监督学习任务,不知道真实的样本标记,只是把相似度搞得样本聚合在一起;分类是有监督学习任务,利用已知的样本标记训练出一个模型,利用改模性预测未知样本的类别。
在这里插入图片描述

1.2 理论分析

聚类:按照某一个特定的标准(比如距离),把一个数据集分割成不同的类或簇 ( c l u s t e r ) (cluster) (cluster),也就是说将相似高的数据聚集在一起。
评价标准:类内相似度大,类间的差异性大(相似度小)。
距离公式:刻画相似度,距离越大,相似度越小,反之,相似度越大。
常用的聚类算法有 K − M e a n s K-Means KMeans D B S C A N DBSCAN DBSCAN(密度聚类),层次聚类.

1.3 K-Means聚类算法

首先来看第一个算法:K均值聚类。给定m个样本集 D = x 1 , x 2 , . . . , x m D={x_{1},x_{2},...,x_{m}} D=x1,x2,...,xm.给定划分的k个簇为 C 1 , C 2 , . . . , C k {C_{1},C_{2},...,C_{k}} C1,C2,...,Ck最小化平方误差为:
E = ∑ i = 1 k ∑ x = C i ( x − μ i ) 2 E=\sum_{i=1}^{k}\sum_{x={C_{i}}}(x-\mu_{i})^2 E=i=1kx=Ci(xμi)2
其中 μ i \mu_{i} μi是簇 C i C_{i} Ci的均值向量。
K-Means算法得到的聚类结果会最小化平方误差,即每个样本到其类别中心的距离值和最小。类别中心用该类别中所有样本的均值来表示,这在一定程度上刻画了类内样本围绕均值向量的紧密程度,值越小类内样本的相似度越高。
K均值算法采用贪心策略,通过不断迭代找到最优的类别中心,进而完成聚类任务。
下面具体来看一下算法的流程:
(1)输入为m个样本集D,聚类的个数K,首先从D中随机选择k个样本作为初始的均值向量,即类别中心。
(2)利用第一个for循环完成m个样本的划分,分别计算每一个样本xj到各个类别中心ui的距离,选择距离最近的类别作为样本xj的类别标记,当完成岩本的划分后,重新计算每个类别的均值向量,即类别中心.
(3)比较前后两次均值向量是否发生改变,如果发生改变,根据新的类别中心再次对样本进行划分,直到类别中心不发生改变为止,最终得到聚类结果。
K均值聚类算法最终的聚类结果会受到聚类个数K以及初始的类别中心的影响。

1.4 密度聚类

密度聚类也称为基于密度的聚类,此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
DBSCAN是一种著名的密度聚类算法,它基于一组“邻域”参数来刻画样本分布的紧密程度,给定数据集 D = x 1 , x 2 , … x m D={x_1,x_2,…x_m} D=x1,x2,xm,定义以下几个概念。
在这里插入图片描述

如图所示,上图中的虚线即为 -邻域,设 x 1 x_{1} x1是核心对象,则 x 2 x_{2} x2 x 1 x_{1} x1密度直达, x 3 x_{3} x3 x 1 x_{1} x1密度可达, x 3 x_{3} x3 x 4 x_{4} x4密度相连。因此 x 2 , x 3 , x 4 {x_{2},x_{3},x_{4}} x2,x3,x4与核心对象 x 1 x_{1} x1为一类。即采用该原则可以使得聚类算法表达出传递性。

密度聚类对簇的定义:由密度可达关系导出的最大密度相连样本集合,将这些点作为同一个簇。DBSCAN算法任意选取一个核心对象作为“种子”,然后从“种子”出发寻找所有密度可达的其他核心对象,并且包含每个核心对象的邻域的非核心对象,将这些核心对象和非核心对象作为一个簇。当寻找完一个簇后,选择还没有簇标记的其他核心对象,得到一个新的簇,反复执行这个过程,直到所有的核心对象都属于某一个簇为止。
K-Means算法和DBSCAN算法结果对比:
在这里插入图片描述

1.5 层次聚类

层次聚类试图在不同层次对数据进行划分,从而形成树形的聚类结构。数据集的划分可采用自底向上的聚合策略,也可采用自顶向下的分拆策略。
AGNES是一种采用自底向上的聚合策略的层次聚类方法,它先将每一个样本看成初始聚类簇,然后在算法的每一步找出距离最近的聚类簇进行合并,该过程不断反复,直到达到预设的聚类簇。聚类簇之间的距离可以用以下公式进行计算:
单链接 d m i n ( C i , C j ) = m i n x ∈ C i , Z ∈ C j d i s t ( x , z ) [ 最小距离 ] d_{min}(C_{i},C_{j})=min_{x\in C_{i},Z\in C_{j}}dist(x,z)[最小距离] dmin(Ci,Cj)=minxCi,ZCjdist(x,z)[最小距离]
全链接 d m a x ( C i , C j ) = m i n x ∈ C i , Z ∈ C j d i s t ( x , z ) [ 最大距离 ] d_{max}(C_{i},C_{j})=min_{x\in C_{i},Z\in C_{j}}dist(x,z)[最大距离] dmax(Ci,Cj)=minxCi,ZCjdist(x,z)[最大距离]
均链接 d a v g ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ x ∈ C i ∑ z ∈ C j d i s t ( x , z ) [ 平均距离 ] d_{avg}(C_{i},C_{j})=\frac{1}{|C_{i}||C_{j}|}\sum_{x\in C_{i}}\sum_{z \in C_{j}}dist(x,z)[平均距离] davg(Ci,Cj)=Ci∣∣Cj1xCizCjdist(x,z)[平均距离]
下面来看一下该算法的流程:
(1)输入为 m m m个样本集合 D D D,距离度量函数 d d d,可以是最小距离,最大距离或平均距离,这里以最小距离为例,聚类的类别数 k k k
(2)初始情况下,将每个样本单独看成一个类别,共有 m m m个类别,同时构造一个 m × m m\times m m×m的距离矩阵 M M M,元素值 M i j M_{ij} Mij等于类别 c i c_i ci c j c_j cj之间的距离,很显然矩阵 M M M为对称矩阵,接着找出距离最近的两个类别 C i C_i Ci C j C_j Cj,进行合,这里将 C j C_j Cj中的样本和合并到 C i C_i Ci中,记作 C i ∗ C_i* Ci,类别数减 1 1 1.这时需要修改距离矩阵 M M M,一是删除矩阵 M M M的第 j j j行和第 j j j列,二是重新计算新类别 C i ∗ C_i* Ci与其他类别 C k C_k Ck之间的距离,以最近距离为例,它的值等于 c k c_k ck与合并前的类别 C i C_i Ci C j C_j Cj距离中的最小值。
(3)重复执行,直到达到预定的聚类的类别数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体理论和理论计算,请见西瓜书第197页,南瓜书第56页,及南瓜书聚类对应配套视频

二、代码实现

python">from sklearn.cluster import KMeans
KMeans(n_clusters=2)
n_clusters: 类别数

from sklearn.cluster import DBSCAN
DBSCAN(eps=0.1,min_samples = 5)
eps: 邻域半径
min_samples:阈值,邻域内最少的样本数

from sklearn.cluster import AgglomerativeClustering
AgglomerativeClustering(n_clusters, affinity, linkage)
n_clusters:类别数
affinity:距离公式
linkage:‘ward’(single),‘complete’,‘average’


三、代码文件

小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf


http://www.niftyadmin.cn/n/1699038.html

相关文章

redis 持久化 RDB、AOF

Redis持久化 持久化RDB、AOF,重点 Redis是内存数据库,断电即失去,只要是内存数据库就一定会有持久化操作 RDB(Redis DataBase) 在指定的时间 间隔内将内存中的数据集快照写入到磁盘中,Snapshot快照&…

PHP最小框架

为什么80%的码农都做不了架构师&#xff1f;>>> 因为做简单的api&#xff0c;用框架又太夸张&#xff0c;但是为了mvc去研究了一下最小框架&#xff0c;发现了很实用的&#xff1a;最小PHP框架 index.php <?php$g$_GET;$c$g[c]?:home;if(!include "c/$c.…

redis主从复制、多哨兵模式、replication、sentinel

Redis主从复制 一个Master有多个slave&#xff0c;将一台redis服务器数据&#xff0c;复制到其他的redis服务器&#xff0c;前者称为主节点&#xff08;masterleader&#xff09;&#xff0c;后者称为从节点&#xff08;slave、follower&#xff09;&#xff0c;数据是单向的&…

redis缓存穿透、击穿、雪崩简单理解

Redis缓存穿透、击穿、雪崩 都是服务的三高问题 高并发高可用高性能 面试高频&#xff0c;工作常用 redis缓存的使用极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面&#xff0c;但同时&#xff0c;它也带来了一些问题&#xff0c;数据一致性问题&#xf…

自定义SeekBar样式

系统默认的seekbar很多时候不符合开发需求&#xff0c;那么就需要自定义seekbar的样式&#xff0c;方法并不复杂&#xff0c;下面记录一下&#xff1a;布局文件中&#xff1a;android:thumb"drawable/sanjiaoup"通过这样一行代码就可以更换滑动图标&#xff0c;图片自…

java.sql.SQLException: Got error 28 from storage

2019独角兽企业重金招聘Python工程师标准>>> 1.问题&#xff0c;当java执行sql语句&#xff0c;报如下错误的时候(mysql数据库)&#xff1a; Caused by: java.sql.SQLException: Got error 28 from storage engineat com.mysql.jdbc.SQLError.createSQLException(SQ…

《JavaScript高级程序设计》Chapter 12 DOM2和DOM3

小记 在DOM1的基础上进行扩展&#xff0c;引入更多的交互&#xff0c;并处理更高级的XML。分为许多应用的模块&#xff0c;对DOM2和DOM3的功能等进行描述&#xff0c;内容包括&#xff1a;DOM2级核心、DOM2级视图&#xff08;view&#xff09;、DOM2级事件&#xff08;13章讨论…

MySQL库表状态查询

一. 查看库的各链接状态 对于一个mysql连接或者一个线程&#xff0c;任何时刻都有一个状态&#xff0c;表示其当前正在做什么。一般使用show full processlist查看。 -------------------------------------------------------------------------------------------- | Id …