机器学习知识总结 —— 17.什么是聚类

news/2024/5/20 9:22:49 标签: 聚类, 算法

文章目录

什么是聚类

在前面的章节,介绍了机器学习中的第一个分类算法SVM,除此以外,如果你有关注过机器学习或者数据挖掘方面的知识,那么应该也听说过聚类

作为机器学习中的一种重要算法聚类也是一种无监督学习方法,它的目的是将数据分成若干组,使得每组数据之间相似度尽量大,不同组之间相似度尽量小。

聚类与SVM算法的区别是什么

由于同样是分类算法,所以我们不得不好奇聚类和SVM的具体区别是什么,以及面对怎样的问题时我们应该使用SVM,什么时候可以考虑使用聚类算法

一个比较粗浅的区别大致是这样的:

聚类是一种 无监督学习 算法,它可以将数据自动分组,而不需要事先知道数据的标签。它通常用于对数据进行探索性分析,发现数据中的隐藏模式。

SVM 是一种 监督学习算法,它需要事先知道数据的标签。它的目的是找到一个超平面,使得不同类别的数据尽可能地分开,并且同一类别的数据尽可能地靠近。

当数据中存在明显的类别划分时,我们应该优先考虑 SVM 算法。而当数据中存在隐藏的类别划分时,我们应该优先考虑聚类。总之,聚类是对数据进行探索性分析的工具,SVM是在已知类别的情况下建立分类模型的工具。

聚类算法的重要知识点

在这一章节里我们将回顾一下关于聚类的重要知识点。我们要知道常见的聚类算法有哪些,比如:

K-means、层次聚类、密度聚类、基于模型的聚类等。

对于数据的分类依据或者说标准有哪些,比如:

距离度量、轮廓系数、Calinski-Harabasz指数等。

以及,由于该算法是无监督学习,所以为了得到一个较为理想的结果,我们可能要事先以及事后做一些处理和评判,比如:

如何选择聚类的数量、如何评估聚类的质量、如何处理离群值等。

以及,最后的可视化,是采用二维图像,还是三维,数据如何显示给目标用户或人群。

现在,我们来依次说明常见的聚类算法

常见聚类算法

K-Means聚类

K-Means是最常用的聚类算法之一,它的基本思想是对于给定的数据集,选择K个初始质心,然后将所有数据分配到距离它最近的质心所属的簇。然后重新计算每个簇的质心,重复这个过程直到簇的划分不再发生变化。

K-Means的目标函数为:

J ( c 1 , c 2 , … , c k ) = ∑ i = 1 k ∑ x j ∈ c i ∣ ∣ x j − μ i ∣ ∣ 2 J(c_1,c_2,…,c_k) = \sum_{i=1}^k \sum_{x_j \in c_i} ||x_j-\mu_i||^2 J(c1,c2,,ck)=i=1kxjci∣∣xjμi2

其中 c i c_i ci 是第 i 个簇, μ i \mu_i μi 是第 i 个簇的质心, x j x_j xj 是第 j 个样本。

K-Means聚类算法的工作原理是将数据集划分为K个簇。

算法的基本步骤如下:

  1. 随机选取K个初始质心(也叫中心点)。

  2. 对于每个数据样本,计算它与每个质心的距离,并将其分配到距离最近的质心所属的簇。

  3. 重新计算每个簇的质心。重复步骤2和3直到簇的划分不再发生变化。其中,K是用户输入的聚类数量, 收敛条件可以是最大迭代次数, 或者簇的划分不再发生变化。

初始化质心可以使用随机选取K个点, 或者手动指定。距离度量可以使用欧几里得距离, 曼哈顿距离等。分配样本到簇的过程中, 可以使用 for 循环来遍历每个样本, 找出距离它最近的质心。

重新计算质心可以使用平均值来计算新的质心坐标。

层次聚类 (Hierarchical Clustering)

层次聚类算法通过不断合并或分裂簇来划分数据集,最后形成一棵树状的层次结构。常用的层次聚类算法有凝聚层次聚类和分裂层次聚类

凝聚层次聚类算法从单个样本开始,不断将距离最近的两个簇合并直到形成最终的簇。而分裂层次聚类算法则是从所有样本构成的一个大簇开始,不断将簇分裂直到形成最终的簇。

这种算法可以通过两种方式来实现:

  1. 分层聚类(agglomerative)方法:从每一个数据点开始,不断地将最相近的簇合并,直到所有点都被分到一个簇里。

  2. 递归分裂聚类(divisive)方法:从所有数据点开始,不断地将数据点分裂成越来越小的簇,直到每一个簇只包含一个数据点。

层次聚类的优点是可以很直观地展示数据聚类的过程和结果,并且能够处理大量数据。缺点是由于簇之间距离的定义可能不同,导致不同的算法结果不同,且计算量较大。

需要注意的是层次聚类会对数据点的顺序敏感,并且不能处理不连续的簇。

DBSCAN聚类

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的聚类算法。它可以将数据点分为若干个簇,并且不需要事先知道簇的个数。

主要思想是,如果一个数据点周围有很多其他数据点,那么它们应该属于同一个簇。而如果一个数据点周围没有很多其他数据点,那么它们应该属于不同的簇。

DBSCAN 算法主要有两个参数:半径 ϵ \epsilon ϵ 和最小样本数量 m i n P t s minPts minPts。半径 ϵ \epsilon ϵ 指定了一个数据点周围的范围,最小样本数量 m i n P t s minPts minPts 指定了在这个范围内最少需要有多少个数据点才能认为这个数据点是一个核心点。

DBSCAN 算法的流程如下:

  1. 从每个数据点开始,找到所有在半径 ϵ \epsilon ϵ 内的数据点,如果找到的数据点的数量大于 m i n P t s minPts minPts,则这个数据点是一个核心点。

  2. 对于每个核心点,找到它周围所有的核心点,并将它们划分到同一个簇中。

  3. 对于每个非核心点,如果它距离至少一个核心点不超过 ϵ \epsilon ϵ,那么它就划分到对应的簇中。

DBSCAN 的优点是能够发现任意形状的簇,不需要事先知道簇的个数,并且对于噪声数据也能很好的处理。缺点是参数 ϵ \epsilon ϵ m i n P t s minPts minPts 比较难调整,并且对于高维数据效果不佳。需要注意的是 DBSCAN 不能处理不连续的簇,对于这种情况需要使用其他聚类算法如基于密度的聚类算法 HDBSCAN.

基于密度的HDBSCAN

HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的层次聚类算法,是对DBSCAN算法的扩展。

在DBSCAN算法中,聚类的结果是以密度为基础的,但是它需要手动调整参数,而且对于不同密度的簇难以处理。而HDBSCAN算法则通过计算簇的密度来确定簇的边界,并且使用层次聚类方法来组合不同密度的簇。

基本算法流程如下:

  1. 从数据点中选取密度最大的点作为核心点。

  2. 对于核心点所在的密度相连簇进行聚类,得到若干个子簇。

  3. 对于每个子簇,判断是否符合簇的条件(即密度是否足够大),如果符合条件则继续聚类,否则当前簇结束。

HDBSCAN算法的优点是不需要手动调整参数,能够处理不同密度的簇,并且能够识别噪声点。

聚类的评价方式

就像其他所有机器学习算法中一样,聚类也有评价函数或者损失函数,用来衡量算法收敛效果,由于在这类评价函数在聚类中扮演及其重要的角色,所以我们不得不在这个部分再多花点时间来了解关于聚类算法中极为重要的一部分。

一般来说,聚类的评价是用来度量样本间的相似性。常用的距离度量有欧几里得距离、曼哈顿距离、余弦距离等。例如,

欧几里得距离

欧几里得距离(Euclidean distance)是一种距离度量,它用来度量两个样本之间的相似性。欧几里得距离是根据两个样本在所有特征上的差值的平方和来计算的。公式为:
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} d(x,y)=i=1n(xiyi)2

其中 x x x y y y 分别表示两个样本, x i x_i xi y i y_i yi 分别表示两个样本在第 i i i 个特征上的值。欧几里得距离是常用的距离度量之一,因为它简单易用,并且对于数值型数据有很好的效果。

曼哈顿距离

曼哈顿距离(Manhattan distance)是另一种常用的距离度量。与欧几里得距离不同,曼哈顿距离是根据两个样本在所有特征上的差值的绝对值之和来计算的。公式为:

d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^n |x_i - y_i| d(x,y)=i=1nxiyi

其中 x x x y y y 分别表示两个样本, x i x_i xi y i y_i yi 分别表示两个样本在第 i i i 个特征上的值。

曼哈顿距离通常用于数值型数据之间的距离计算,特别是当数据维度很高时,曼哈顿距离比欧几里得距离更具优势。

曼哈顿距离也常用于在空间中计算两个点之间的距离,在某些论文或者书籍中,它又称为L1距离,因为它的定义是两点之间所有维度上的绝对值差之和。

所以,在二维平面上,两点 (x1, y1) 和 (x2, y2) 之间的曼哈顿距离定义为:

d = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d = |x1 - x2| + |y1 - y2| d=x1x2∣+y1y2∣

在多维空间中,两个点 x = ( x 1 , x 2 , . . . , x n ) x = (x_1, x_2, ..., x_n) x=(x1,x2,...,xn) y = ( y 1 , y 2 , . . . , y n ) y = (y_1, y_2, ..., y_n) y=(y1,y2,...,yn) 之间的曼哈顿距离定义为:

d = ∑ i = 1 n ∣ x i − y i ∣ d = \sum_{i=1}^{n} |x_i - y_i| d=i=1nxiyi

曼哈顿距离是一种常用的距离度量方式,它能够应用在各种各样的场景中。在聚类分析中,曼哈顿距离可以用来计算类簇中各个样本之间的相似程度。

聚类中,曼哈顿距离可以用来计算类簇中各个样本之间的相似程度。同时它也是一种常用的距离度量方式,它能够应用在各种各样的场景中,如机器学习中的KNN算法

余弦距离

余弦距离是一种常用的距离度量,它表示两个向量之间的余弦相似度。它是通过计算两个向量的夹角余弦值来衡量他们之间相似程度的。

公式为:
c o s ( t h e t a ) = ( A ∗ B ) / ( ∣ ∣ A ∣ ∣ ∗ ∣ ∣ B ∣ ∣ ) cos(theta) = (A * B) / (||A|| * ||B||) cos(theta)=(AB)/(∣∣A∣∣∣∣B∣∣)

其中 A,B 是两个向量,||A||,||B||表示向量A,B的模长。

余弦距离实际上就是1减去余弦相似度,即

d ( A , B ) = 1 − c o s ( θ ) d(A,B) = 1 - cos(\theta) d(A,B)=1cos(θ)

余弦距离在聚类算法中常用于文本数据的聚类,因为它可以很好的衡量文本之间的相似性。除此以外,我们还可以采用其他方式评价聚类的好坏,例如

轮廓系数

轮廓系数(Silhouette coefficient)是用来评估聚类结果的一种度量方法。它衡量了每个样本在所在簇内与其他样本的相似度与所在簇与其他簇的差异度之间的比值。通俗来说,轮廓系数越大,说明样本聚在一起的程度越高,聚类效果越好。

计算公式为:

s ( i ) = b ( i ) − a ( i ) max ⁡ ( a ( i ) , b ( i ) ) s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} s(i)=max(a(i),b(i))b(i)a(i)

其中, a ( i ) a(i) a(i)表示样本 i i i 到其所在簇中其它样本的平均距离, b ( i ) b(i) b(i)表示样本 i i i 到其最近的其它簇中所有样本的平均距离。

轮廓系数的值在-1到1之间,其中-1表示样本被错误聚类,1表示样本被完美聚类。一般来说,轮廓系数越接近1,聚类效果越好。

Calinski-Harabasz系数

Calinski-Harabasz系数是一种常用的聚类评估指标,它用来评估聚类结果的优良程度。

它的计算公式是:

C H = B t ( k − 1 ) W t CH = \frac{B_t}{(k-1)W_t} CH=(k1)WtBt

其中 k 是类别数量,n 是样本数量, B t B_t Bt表示类内平方和, W t W_t Wt表示类间平方和。类内平方和表示每个类内样本与类中心的距离平方和,类间平方和表示所有类中心与总体中心的距离平方和。

Calinski-Harabasz系数越大,表明聚类结果越优秀。一般来说,值在40-50之间的聚类结果较好。

OK,那么关于聚类的基本知识点就到这里,下一篇文章中我们来看看一个简单的 K-Means 是如何实现的。


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

相关文章

【数据结构前言】

前言: 在之前我们已经有了C语言的基础,掌握了一些基本知识过后我们就可以进行其他方面的学习了,继我们学完C语言之后我们将会学习数据结构的相关知识,今天先让大家对其进行初步的认识! 目录1. 什么是数据结构&#xff…

Redis优惠券秒杀 | 黑马点评

目录 一、全局唯一ID 1、全局ID生成器 二、实现秒杀下单 1、基本的下单功能 2、超卖问题 3、乐观锁解决并发问题 三、实现一人一单 1、思路分析 2、代码初步实现 3、关于锁的范围 4、关于事务失效 5、集群下线程并发问题 一、全局唯一ID 订单如果用自增长会存在…

SQL--DQL

目录 1、基础查询 1. 查询多个字段 1. 举例 2. 举例 2. 字段设置别名 1. 举例 2. 举例 3. 去除重复记录 1. 举例 2、条件查询 1. 等于&#xff08;&#xff09; 2. 小于&#xff08;<&#xff09; 3. 小于等于&#xff08;<&#xff09; 4. 没有&#xff…

使用Docker打包镜像并发布

1、docker介绍 Docker 是一个开源的应用容器引擎&#xff0c;以镜像的形式进行发布。docker的图标是一个大鲸鱼驮着许多集装箱在海上航行。大鲸鱼就是docker&#xff0c;集装箱就是一个个容器。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff0c;每个容器都…

微信小程序和QQ小程序图片安全内容检测接口之ThinkPHP实现

由于相关管控&#xff0c;UGC小程序的开发者&#xff0c;必须要过滤违法违规内容&#xff08;如黄&#xff09;。 UGC小程序官方定义&#xff1a; 小程序中的功能或服务中&#xff0c;涉及用户将自己自定义编辑的文字、图片、音频、视频等内容通过小程序进行展示或提供给其他用…

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现&#xff08;1&#xff09;栈的结构&#xff08;2&#xff09;StackInit&#xff08;初始化&#xff09;&#xff08;3&#xff09;StackPush&#xff08;压栈&#xff09;&#xff08;4&#xff09;StackPop&#xff08;出栈&…

迭代器、可迭代对象、生成器的区别和联系

目录1 迭代器2 可迭代对象3 生成器1 迭代器 迭代器是一种可以更新迭代的工具&#xff0c;迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。但是他不能像列表一样使用下标来获取数据&#xff0c;也就是说迭代器是不能返回的。迭代器只能往前不会…

如何安装配置hbase

当完成hdfs、zookeeper的安装配置后&#xff0c;现在进入到hbase的安装和配置环节。这样的做的目的之一是要把海量的数据存入到hbase数据库中。JDK版本的要求hbase对JDK版本是有要求的&#xff0c;不是JDK版本越高越好&#xff0c;根据我走过的坑&#xff0c;目前最好的JDK版本…