机器学习(五) -- 无监督学习(1) --聚类1

news2024/11/22 0:49:27

系列文章目录及链接

上篇:机器学习(五) -- 监督学习(7) --SVM2
下篇:机器学习(五) -- 无监督学习(1) --聚类2


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


一、通俗理解及定义

1、什么叫聚类(What)

聚类(clustering):数据没有标签,将相似的样本自动分为一类(子集,簇,cluster)。

有监督VS无监督

 

 

2、聚类的目的(Why)

通过迭代的方式,将数据划分为K个不同的簇,并使得每个数据点与其所属簇的质心(聚类中心、中心点、均值点)之间的距离之和最小。

聚类方法:

基于划分(距离):K-means

基于层次:BIRCH  (Balanced Iterative Reducing and Clustering using Hierarchies)

基于密度:DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

基于网格:Statistical Information Grid(STING)算法

基于模型:统计和神经网络方法

3、怎么做(How)

K-means:

首先要知道将数据划分成多少类别 

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
     

 聚类的结果是簇,评价方式是簇(类)内距离和簇(类)间距离,簇内距离越小越好,簇间距离越大越好

二、原理理解及公式

1、基本概念

聚类任务:根据某种相似性,把一组数据划分成若干个簇的过程。

问题:

  1. 相似性怎么定义!-------二、1.3、相似性度量
  2. 可能存在的划分!-------二、1.4、第二类Stirling数
  3. 若干个簇=有多少个簇?------(其中之一:二、2.3.1、“肘”方法 (Elbow method) — K值确定)

1.1、簇

簇:分组后每个组称为一个簇,每个簇的样本对应一个潜在的类别。样本没有类别标签,因此是聚类一种典型的无监督学习方法。

簇的条件:相同簇的样本之间距离较近;不同簇的样本之间距离较远。

明显分离的簇:每个点到同簇中任意点的距离比到不同簇中所有点的距离更近。

基于中心的簇:每个点到其簇中心的距离比到任何其他簇中心的距离更近。

基于邻近的簇:每个点到该簇中至少一个点的距离比到不同簇中任意点的距离更近。

基于密度的簇:簇是被低密度区域分开的高密度区域。

概念簇:簇中的点具有由整个点集导出的某种一般共同性质。(在两个环相交处的点属于两个环)

1.2、质心

机器学习中“质心”:所有数据的均值u通常被称为这个簇的“质心”(x求均值,y求均值,得到的这个点)

1.3、相似性度量

1.3.1、距离

距离度量具体可看:机器学习(五) -- 监督学习(1) -- k近邻

欧式距离,公式:

曼哈顿距离,,公式: 

1.3.2、余弦相似性

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

1.3.3、Jaccord相似性

Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具 体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。

eg:

1.4、第二类Stirling数

聚类问题:可能的划分

假设我们要把 n = 4个不同的数据点放入不相同 的 k = 2 个无差别的盒子里,有几种方案?

集合的一个划分,表示将n 个不同的元素拆 个集合的方案数, 记为S(n,k)

随着集合元素𝒏和子集个数𝒌的增加,方案数𝑆(𝑛,𝑘)呈爆炸式增长!!!

2、K-meas

2.1、理解

K-means 是我们最常用的基于距离的聚类算法,其认为两个目标的距离越近,相似度越大。

目标:最小化类内间距

K-means算法针对聚类所得簇划分最小化平方误差,平方误差刻画了簇内样本围绕均值向量的紧密程度,平方误差值越小则簇内样本相似度越高。

2.2、步骤

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

 2.3、公式

对于给定数据x,以及簇的个数k:

c_i:第 i 个簇

m_i:第 i 个簇的中心

 SSE随着聚类迭代,其值会越来越小,直到最后趋于稳定

(如果质心的初始值选择不好,SSE只会达到一个不怎么好的局部最优解。)

2.3.1、“肘”方法 (Elbow method) — K值确定

  1.  对于n个点的数据集,迭代计算 k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和;
  2. 平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。
  3. 在这个平方和变化过程中,会出现一个拐点也即“肘”点,下降率突然变缓时即认为是最佳的k值。

在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。

2.3.2、轮廓系数法(Silhouette Coefficient)

 K-means性能指标评估--轮廓系数【机器学习(四) -- 模型评估(4)】

公式:S的范围在[-1,1],越大越好

a:样本 i 到同一簇内其他点不相似程度的平均值

b:样本 i 到其他簇的平均不相似程度的最小值

对于每一个样本
1、计算蓝1到自身类别的点距离的平均值a
2、计算蓝1分别到红色类别,绿色类别所有的点的距离,求出平均值b1, b2,取其中最小的值当做b
b>>a: 1完美
a>>b:-1最差

如果s小于0,说明a 的平均距离大于最近的其他簇。聚类效果不好
如果s越大,说明a的平均距离小于最近的其他簇。聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优

超过0.1,说明聚类效果很好

轮廓系数API

sklearn.metrics.silhouette_score

导入:
from sklearn.metrics import silhouette_score
 
语法:
silhouette_score(X, labels)

    X:特征值
    labels:被聚类标记的目标值

2.4、eg:

step1:随机设置3个初始聚类中心

step2:每一个点根据到每个聚类中心的距离分类

step3:重新计算每个新的聚类中心

 step4:重复2、3步(如下3个点被重新分配),直到,聚类中心不在变化

2.5、K-means++

2.5.1、理解

K-means算法得到的聚类结果严重依赖与初始簇中心的选择,如果初始簇中心选择不好,就会陷入局部最优解,因此提出了K-means++算法,它改进了K-means算法初始中心点的选取。

核心思想是:再选择一个新的聚类中心时,距离已有聚类中心越远的点,被选取作为聚类中心的概率越大。

2.5.2、步骤
  1. 从数据集中随机选择第一个质心。
  2. 对于每个数据点x,计算其到已选择的所有质心的最短距离D(x)。
  3. 选择一个新的数据点作为下一个质心,选择的概率与D(x)成正比,即概率P(x) = D(x) / ΣD(x)。
  4. 重复步骤2和3,直到选择了K个质心。

这种选择策略确保了质心之间的分散性,从而提高了聚类效果。

2.5.3、eg:

 

3、K-Medoids(k-中心)

3.1、理解

        k-中心和k-均值很像,不同的是形心的更新选择,k-均值是通过求得均值进行更新形心的,而k-中心是随机选择k个对象作为初始的k个簇的代表点,反复用非代表点来代替代表点,直到找到误差平方和最小的那个点来作为数据中心点。这样划分方法是基于最小化所有对象与其参照点之间的相异度之和的原则来执行的,这是 k-medoids 方法的基础。

3.2、步骤

  1. 随机选择 k 个数据点作为初始聚类中心
  2. 将每个剩余的数据点分配在临近的聚类中心的类中当中去
  3. 每个类中计算每个数据点为聚类中心时的代价函数的值,选取最小值成为新的聚类中心
  4. 重复2、3过程,直到所有的聚类中心不再发生变化,或达到设定的最大迭代次数

4、层次聚类

4.1、理解

把每一个单个的观测都视为一个类,而后计算各类之间的距离,选取最相近的两个类,将它们合并为一个类。新的这些类再继续计算距离,合并到最近的两个类。如此往复,最后就只有一个类。然后用树状图记录这个过程,这个树状图就包含了我们所需要的信息。

4.2、方法:

  1. 凝聚的层次聚类:AGNES算法 (AGglomerative NESting)
     
  2. 分裂的层次聚类:DIANA算法 (DIvisive ANALysis)
     
  3. 层次聚类优化算法:CF-Tree(Cluster Feature Tree)、BIRCH算法 (平衡迭代削减聚类法)、CURE算法(使用代表点的聚类法)
 4.2.1、AGNES

采用自底向上的策略。

凝聚型层次聚类有多种变体,这些变体主要基于不同的距离度量方法和链结标准来定义。以下是一些常见的变体:(AGNES算法中簇间距离:)

最近邻链结(SL聚类)
        两个聚簇中最近的两个样本之间的距离(single-linkage聚类法);
        最终得到模型容易形成链式结构。

最远邻链结(CL聚类)
        两个聚簇中最远的两个样本的距离(complete-linkage聚类法);
        如果存在异常值,那么构建可能不太稳定。

平均链结(AL聚类)
        两个聚簇中样本间两两距离的平均值(average-linkage聚类法);
        两个聚簇中样本间两两距离的中值(median-linkage聚类法);

Ward链结(WL聚类)

        两个聚簇中样本合并后产生的方差增加值被用作这两个聚类之间的距离。

4.3、eg:

一组数据D={a,b,c,d,e},它们之间的距离矩阵为:

step1:每个样本都是一个类

step2:将最近的两个类合并为一个新的类,并重新计算类之间的距离然后更新距离矩阵:

step3:重复:选择距离最近的两个类合并为新的类:

step4:不断重复上述两个步骤,最终只剩下一个类的时候,停止:

5、密度聚类

5.1、理解

密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。

通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

核心思想是:在数据空间中找到分散开的密集区域,简单来说就是画圈,其中要定义两个参数,一个是圈的最大半径,一个是一个圈里面最少应该容纳多少个点。

5.2、方法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)

5.3、eg:

step1:设定参数密度阈值N=3,也就是每个圈里必须满足3个点,才能称为一个簇,首先我们随机选取一些候选的核心点:

灰色点核心点的候选:

step2:以这些候选的核心点为圆心按照设定的半径画圆圈:

step3:如果圈内满足三个点,那就是一个簇,簇内点候选的核心点就是核心点:这些红色的点就是核心点,而灰色的点因为其圈内点数不满足阈值,所以不是核心点:

step4:合并重合的簇:

6、网格聚类

6.1、理解

将数据空间划分为网格单元,将数据对象映射到网格单元中,并计算每个单元的密度。根据预设阈值来判断每个网格单元是不是高密度单元,由邻近的稠密单元组成“类”。

6.2、方法

  1. CLIQUE (Clustering in QUEst)
     
  2. STING (Statistical Information Grid 统计信息网格)
     
  3. MAFIA (Merging of adaptive interval approach to spatial datamining 空间数据挖掘的自适应区间方法的合并)
     
  4. Wave Cluster (小波聚类)
     
  5. O-CLUSTER (orthogonal partitioning CLUSTERing 正交分区聚类)
     
  6. Axis Shifted Grid ClusteringAlgorithm(轴移动网格聚类算法)
     
  7. Adaptive Mesh Refinement (自适应网格细化)

6.3、步骤

  1. 将数据空间划分为有限数量的单元格;
  2. 随机选择一个单元格“𝑐”,𝑐不应该事先遍历;
  3. 计算“𝑐”的密度;
  4. 如果“𝑐”的密度大于阈值的密度:
    1. 将单元格“c”标记为新的聚类(cluster);
    2. 计算“c”所有邻居的密度;
    3. 如果相邻单元的密度大于阈值密度,将其添加到集群中,并且重复步骤4.2和4.3直到没有相邻单元的密度大于阈值密度
  5. 重复步骤2,3,4,直到遍历所有单元格

6.4、eg:

step1:选择一定宽度的格子来分割数据空间

step2:设置阈值为2,将相邻稠密的格子合并形成一个“类”

7、优缺点

7.1、K-means优缺点

7.1.1、优点:
  1. 属于无监督学习,无须准备训练集
  2. 原理简单,实现起来较为容易
  3. 结果可解释性较好
7.1.2、缺点:
  1. 需手动设置k值。 在算法开始预测之前,我们需要手动设置k值,即估计数据大概的类别个数,不合理的k值会使结果缺乏解释性
  2. 可能收敛到局部最小值, 在大规模数据集上收敛较慢
  3. 对于异常点、离群点敏感
  4. 非凸形状无法聚类

7.2、K-means++优点

  1. 减少局部最优解的风险:更大概率选择相距较远的初始质心,提高聚类质量。
  2. 理论保证:K-means++能够给出接近最优解的界。
  3. 效率:虽然初始化复杂度有所增加,但整体算法依然保持高效,尤其是对于大规模数据集。

7.3、K-Medoids优缺点

7.3.1、优势:
  1. 噪声鲁棒性比较好。(当存在噪音和孤立点时,比K-means效果好)

7.3.2、缺点:
  1. 运行速度较慢,计算质心的步骤时间复杂度是O(n^2)
  2. K-medoids 对于小数据集工作得很好, 但不能很好地用于大数据集

7.4、层次聚类优缺点

7.4.1、优点:
  1. 距离和规则的相似度容易定义,限制少
  2. 不需要预先制定聚类数
  3. 可以发现类的层次关系
7.4.2、缺点:
  1. 计算复杂度太高;
  2. 异常值也能产生很大影响;
  3. 算法很可能聚类成链状

7.5、密度聚类优缺点

7.5.1、优点:
  1. 不需要指定簇的个数;
  2. 可以对任意形状的稠密数据集进行聚类。相对的,K-Means之类的聚类算法一般只适用于凸数据集;
  3. 擅长找到离群点(检测任务);
  4. 只有两个参数𝜀和MinPts
  5. 聚类结果没有偏倚。K-Means之类的聚类算法初始值对聚类结果有很大影响。
7.5.2、缺点:
  1. 高维数据有些困难;
  2. Sklearn中效率很慢(数据削减策略);
  3. 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,用DBSCAN聚类一般不适合;
  4. 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值𝜀,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

7.6、网格聚类优缺点

7.6.1、优点:
  1. 网格聚类算法相对简单,易于实现和理解;
  2. 网格聚类算法可以有效地处理大规模数据,因为它可以通过网格结构将数据划分为多个小区域,从而减少计算量;
  3. 网格聚类算法可以自适应地调整簇的数量和大小,从而更好地适应不同的数据分布;
7.6.2、缺点:
  1. 网格聚类算法对于数据的形状和密度比较敏感,如果数据分布比较复杂或者存在噪声,可能会导致聚类效果不佳;
  2. 网格聚类算法需要手动设置一些参数,如网格大小、邻域半径等,这些参数的选择可能会影响聚类效果;
  3. 网格聚类算法可能会产生重叠的簇,这些簇的边界可能比较模糊,难以解释;

旧梦可以重温,且看:机器学习(五) -- 监督学习(7) --SVM2
欲知后事如何,且看:机器学习(五) -- 无监督学习(1) --聚类2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1951728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 基础 GitHub【学习笔记】

一、Git 优势 大部分操作在本地完成,不需要联网完整性保证尽可能添加数据而不是删除或修改数据分支操作非常快捷流畅与 Linux 命令全面兼容 二、Git 程序安装 https://git-scm.com 三、Git 结构 #mermaid-svg-9Go6R1leWXWrDCqn {font-family:"trebuchet ms&quo…

【更新2022】地级市城镇 农村居民可支配收入 2001-2022

地级市城镇和农村居民的可支配收入可以用于各种科研领域。他们可以用这些资金支持基础科学研究,推动新技术和创新的发展。他们可以投资于医学研究,促进健康和医疗领域的进步。他们还可以支持环境科学研究,以解决环境问题和可持续发展挑战。此…

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作,可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能,用户可以创建各种类型的图形,包括线图、散点图、柱状图、曲线图等,以及三维图形、动画等复杂的可视…

C语言 | Leetcode C语言题解之第295题数据流的中位数

题目: 题解: typedef struct Heap {int* array; //存放堆的数组int capacity;//数组的容量int len; //已存数组的大小 }Heap;/*大小根堆切换开关*/ int HeapLen(Heap* hp); //heap获取当前的堆大小 void Heap…

安装VMware Workstation Pro

一、下载 通过百度网盘分享的文件:VMware-workstation-full-16.2.4-2008... 链接:https://pan.baidu.com/s/1mDnFhLQErBlpeX_KjsgtzA 提取码:0bw7 二、安装 (1)双击exe文件 (2)安装软件 &…

本地部署Graphhopper路径规划服务(graphhopper.sh启动版)

文章目录 文章参考源码获取一、配置Java环境变量二、配置Maven环境变量三、构建graphhopper步骤1. 下载数据2. 配置graphhopper配置文件config-example.yml3. 在项目中启动命令行执行./graphhopper.sh build3.1|、遇到的问题3.1.1、pom.xml中front-maven-plugin-无法下载npm6.1…

结构型设计模式-组合模式

一、组合模式 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将…

Python安装库太慢?配置好这个速度飞起

经常听到初学python的小伙伴在抱怨,python安装第三方库太慢,很容易失败报错,如果安装pandas、tensorflow这种体积大的库,简直龟速。 为什么pip会很慢? 先来了解下pip,pip是一个非常流行的python包管理工具…

【苍穹】完美解决由于nginx更换端口号导致无法使用Websocket

一、报错信息 进行到websocket开发的过程中,遇到了前端报错,无法连接的提示: 经过F12排查很明显是服务端和客户端并没有连接成功。这里就涉及到之前的坑,现在需要填上了。 二、报错原因和推导 应该还记得刚开苍穹的第一天配置前…

技术实践—微前端技术应用

微前端是一种新兴的前端架构模式,是一种类似于微服务的架构,将微服务的理念应用于浏览器端。其核心理念是将一个大而单一的前端应用拆分为多个小型独立的微应用。这些微应用各自独立,可以由不同团队开发维护,部署,组合…

docker发布镜像到自己远程私有仓库

1、登录docker hub创建自己的仓库地址:https://hub.docker.com/repository/create 输入仓库名称 2.构建镜像 略过。。。。请自己查找别的资料,此篇文章只讲述镜像推送到远程 3.推送 假设你已经构建了一个镜像 web/online-editor:latest,现…

【React学习打卡第二天】

受控表单绑定、React获取Dom\组件通信、useEffect、自定义hook函数和ReactHooks使用规则 一、受控表单绑定1.准备React状态值2.通过value属性绑定状态,通过onChange属性绑定状态同步的函数 二、React中获取DOM1. 使用useRef创建 ref 对象,并与 JSX 绑定2…

使用图数据库Nebula Graph快速上手史上最大规模的中文知识图谱ownthink_v2教程(没写完,明天再写)

一、前言 本教程主要参考官方教程:使用图数据库 Nebula Graph 数据导入快速体验知识图谱 OwnThink (nebula-graph.com.cn) 来带着大家一步一步复现实验内容。 本教程主要使用到的数据集: ownthink/KnowledgeGraphData: 史上最大规模1.4亿中文知识图谱…

MySQL 存储

关系型数据库是基于关系模型的数据库, 而关系模型是通过二维表来保存的,所以关系型数据库中的数据的村方式就是行列组成的表,每一列代表一个字段,每一行代表一条记录。表可以看作某个实体的集合,实体之间存在的联系需要…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十三章 设备树下的platform驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

基于开源大模型的问答系统本地部署实战教程

1. 现有大模型产品使用感受 在开始教你搭建属于自己的本地大模型之前,先说下自己日常使用大模型的感受。常用的比较好的国外大模型工具,经常会遇到网络卡或者token数量、使用次数限制的问题。而国内的大模型工具虽然不存在网络的问题,但…

简单几步,教你使用scikit-learn做分类和回归预测

经常听到初学python的小伙伴在抱怨,python安装第三方库太慢,很容易失败报错,如果安装pandas、tensorflow这种体积大的库,简直龟速。 为什么pip会很慢? 先来了解下pip,pip是一个非常流行的python包管理工具…

基于微信小程序+SpringBoot+Vue的资料分享系统(带1w+文档)

基于微信小程序SpringBootVue的资料分享系统(带1w文档) 基于微信小程序SpringBootVue的资料分享系统(带1w文档) 校园资料分享微信小程序可以实现论坛管理,教师管理,公告信息管理,文件信息管理,文件收藏管理等功能。该系统采用了Sp…

初识C++ · AVL树(2)

目录 前言: 1 左右旋 2 右左旋 3 部分细节补充 3.1 单旋和插入 3.2 部分小函数 前言: AVL树作为一种结构,理解树的本身是不大难的,难的在于,树旋转之后的连接问题,写AVL树的代码大部分都是在旋转部分…

在jeesite开源平台上写了一个SQL命令中心的功能

实现目的: 这个SQL命令中心,是因为老项目就有这个页面,主要的功能是根据写出的SQL语句查询数据,并且在查出的数据基础上直接修改更新,还有新增和删除的功能,这么一说跟plsql就一样一样的了;这页面本来是给运维的同事来用,而且他们还会用plsql和Navicat等SQL语言操作工…