机器学习 第9章 聚类

news2024/12/26 22:05:05

目录

  • 聚类任务
  • 性能度量
  • 距离计算
  • 原型聚类
    • k均值(K-Means)算法
    • 学习向量量化 (LVQ)
    • 高斯混合聚类
  • 密度聚类
  • 层次聚类

聚类任务

聚类是机器学习中一种重要的无监督学习方法,其目的是将数据集中的数据分成不同的聚类或组,使得同一簇内的样本尽可能相似,而不同簇的样本尽可能不同。聚类算法不需要预先定义类别数量,也不需要标签数据。
比如在西瓜问题中,可根据西瓜颜色进行分类,浅色瓜与深色瓜相对应,有籽瓜与无籽瓜相对应等。这些概念对聚类算法而言事先是未知的,聚类过程仅能自动形成簇结构,簇需要我们自己取名用来划分。下面讨论聚类算法涉及到的两个基本问题:性能度量距离计算

性能度量

聚类性能度量亦称聚类"有效性指标"。对聚类结果,我们需通过某种指标来评估其好坏,其中包括内部指标和外部指标。
内部指标仅依赖于聚类本身的特性,如轮廓系数、Calinski-Harabasz指数等。
外部指标则将聚类结果与某个参考模型进行比较,如调整兰德指数、互信息等。

距离计算

在聚类中,样本之间的相似度通常是通过计算它们之间的距离来度量的。常用的距离度量方法包括欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离等

原型聚类

k均值(K-Means)算法

K-Means是最常见的原型聚类算法之一,其目标是最小化所有簇内成员到该簇中心的距离平方和。
K-Means算法包括以下几个步骤:
(1)选择K个初始质心;
(2)分配每个点到最近的质心所在的簇;
(3)更新质心的位置为簇内所有点的平均位置;
(4)重复步骤2和3直到收敛。
示例代码如下:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 创建模拟数据
X, _ = make_blobs(n_samples=300, centers=3, random_state=4)

# 应用K-Means
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)

# 绘制结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x')
plt.show()

运行结果如下:
在这里插入图片描述
从结果中可以看到,通过使用K-Means算法,可以将不同颜色的点聚在一起形成一个簇。但仍有缺陷,比如绿色与黄色点之间仍有部分重叠,没有完全隔离开。

学习向量量化 (LVQ)

LVQ是一种监督学习技术,但也可以用于聚类问题,通过竞争学习的方式更新原型向量。LVQ算法的具体实现较为复杂,通常需要定义学习率和邻域半径等参数。它的实现流程如下所示:在这里插入图片描述
算法第1行先对原型向量进行初始化,例如对第q个簇可从类别标记为 t q t_{q} tq的样本中随机选取一个作为原型向量。算法第 2–12 行对原型向量进行迭代优化。在每一轮选代中,算法随机选取一个有标记的训练样本,找出与其距离最近的原型向量,井根据两者的类别标记是否一致来对原型向量进行相应的更新。在第12行中,若算法的停止条件已满足,则将当前原型向量作为最终结果返回。

高斯混合聚类

下面介绍一下它的实现过程
1.初始化: 为每个簇设定初始参数,包括均值、协方差矩阵和权重。
2.期望最大化 (EM): EM 算法交替执行两个步骤——E 步(期望步)和 M 步(最大化步),直到收敛。
E 步: 计算每个数据点属于各个簇的后验概率(即软分配)。
M 步: 根据当前的后验概率重新估计每个簇的参数(均值、协方差和权重)。
3.迭代优化: 重复执行 EM 步骤直到模型参数收敛或者达到预设的最大迭代次数。

实验代码如下:

import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 创建模拟数据
X, _ = make_blobs(n_samples=300, centers=3, random_state=4)

# 初始化 GMM 模型
gmm = GaussianMixture(n_components=3, random_state=0)
# 拟合模型
gmm.fit(X)

# 获取每个样本的簇标签
labels = gmm.predict(X)

# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', edgecolor='k')
plt.title('Gaussian Mixture Clustering')
plt.show()

运行结果如下:
在这里插入图片描述
对比K-Means算法可以看出,高斯混合聚类对聚类对象轮廓划分的更加清楚。

密度聚类

密度聚类亦称"基于密度的聚类",这类算法假设聚类结构能通过样本分布的紧密程度确定。
DBSCAN是一种基于密度的聚类算法,它可以识别出任意形状的簇,并且不需要提前指定簇的数量。DBSCAN的核心思想是通过定义一个点的邻域,并根据邻域内的点密度来确定簇的边界。具体描述如下所示:在这里插入图片描述
下图给出其演示步骤:
在这里插入图片描述
实验代码如下:

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons

# 创建模拟数据
X, _ = make_moons(n_samples=200, noise=.05)

# 应用DBSCAN
db = DBSCAN(eps=0.3, min_samples=5).fit(X)

# 绘制结果
plt.scatter(X[:, 0], X[:, 1], c=db.labels_, cmap='viridis')
plt.show()

运行结果如下:在这里插入图片描述

层次聚类

层次聚类可以构建一个簇的层次结构,可以是自底向上(凝聚层次聚类)或自顶向下(分裂层次聚类)。层次聚类的优点是可以直观地看到簇是如何逐步合并或分裂的。
AGNES 是一种采用自底向上聚合策略的层次聚类算法,下面给出其具体操作变化过程示意图:
在这里插入图片描述

实验代码如下:

from scipy.cluster.hierarchy import linkage, dendrogram
from matplotlib import pyplot as plt

# 使用凝聚层次聚类
linked = linkage(X, 'single')

# 绘制层次聚类的树状图
dendrogram(linked)
plt.show()

实验结果如图:
在这里插入图片描述
在上面树状图中,每层链接一组聚类簇。

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

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

相关文章

GenBook RK3588一款模块化开源ARM笔记本电脑,具有高达32GB内存和模块化扩展功能

GenBook RK3588 是一款以瑞芯微(Rockchip)RK3588为核心的开源笔记本电脑。这款功能强大的CPU集成了4个Cortex-A76、4个Cortex-A55内核和4个Mali G610 图形内核。具有6 TOPS算力的集成 NPU 单元可以有意义地提升本地机器学习任务。这款流行的新芯片允许用户使用许多流行的开源操…

c#进度条实现方法

在使用c#做WinFrom开发时,经常会用到进度条(ProgressBar)。那么如何才能实现winfrom进度条及进度信息提示呢? 方法一:多线程 使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采…

【Burpsuite】使用宏更新header(如token)

我们有这样一个网站,登录完成之后,后续的每个请求都会带上jwt(json web token)去访问接口信息 此时,我们希望实现这样一个功能:当我没有带token或者token过期时,能够自动刷新token。那么就要用到…

C++的STL标准模板库容器--string类

目录 浅浅介绍一下什么是STL&#xff1a; string类需要知道的小知识 auto和范围for&#xff1a; string类的常用接口&#xff1a; 实现一个string类&#xff1a; 1. 成员变量和构造函数&#xff0c;拷贝构造&#xff0c;析构函数 2. string类对象的容量操作 <1>si…

书生浦语三期实战营 [进阶] 茴香豆:企业级知识问答工具实践闯关任务

茴香豆&#xff1a;企业级知识问答工具实践闯关任务 1 Web 版茴香豆 1.1 创建 Web 版茴香豆账户和密码 登录 https://openxlab.org.cn/apps/detail/tpoisonooo/huixiangdou-web&#xff0c;可以看到 Web 版茴香豆的知识库注册页面&#xff0c;在对应处输入想要创建的知识库名…

Spring Cloud 搭建 Gateway 网关与统一登录模块:路径重写、登录拦截、跨域配置

文章目录 一、项目结构项目依赖 二、搭建 Gateway 服务1. 配置 Gateway2. 配置跨域 三、统一登录模块1. 配置 Spring Security2. 创建 Security 配置3. 实现认证过滤器 四、总结 博主介绍&#xff1a;全网粉丝10w、CSDN合伙人、华为云特邀云享专家&#xff0c;阿里云专家博主、…

SpringBoot教程(二十八) | SpringBoot集成Elasticsearch(Java High Level Rest Client方式)

SpringBoot教程&#xff08;二十八&#xff09; | SpringBoot集成Elasticsearch&#xff08;Java High Level Rest Client方式&#xff09; 前言添加maven依赖yml配置ElasticsearchConfig 连接配置类EsUtil 工具类开始测试 前言 由ES官方提供&#xff0c;代码语法和DSL语法相似…

UEFI——获取UEFI MemoryMap

一、MemoryMap简介 首先讲一下什么是MemoryMap&#xff1f; 内存映射&#xff08;Memory Mapping&#xff09;是一种将文件内容映射到进程的虚拟地址空间的技术。在这种机制下&#xff0c;文件可以视为内存的一部分&#xff0c;从而允许程序直接对这部分内存进行读写操作&…

电动车乱停放识别摄像头

电动车乱停放是城市交通管理中常见的问题&#xff0c;给道路通行和停车场管理带来了诸多困扰。为了有效解决这一问题&#xff0c;人们研发了电动车乱停放识别摄像头&#xff0c;这种设备结合了人工智能技术和监控摄像技术&#xff0c;能够实时监测并识别电动车乱停放情况&#…

python日常刷题(二)

前言&#xff1a;本文记录2024年4月9日至2024年4月13日做题时遇到的几个问题&#xff08;错题本&#xff09;&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;本专栏&#xff1a;python日常刷题 &#x1f380;CSDN主页&#xff1a;愚润求学 文章目录 …

uniapp苹果端与安卓端兼容性问题的处理

目录 第一个问题&#xff0c;苹果端页面有下拉回弹的效果&#xff0c;安卓端没有。解决苹果端的问题&#xff0c;在pages.json中对需要的页面&#xff0c; 第二个问题&#xff0c;安卓端页面滚动到底部触发onReachBottom页面生命周期函数&#xff0c;而苹果端无法触发&#xf…

2024年PDF转换器大集合:哪4款是互联网人的首选?

嘿&#xff0c;朋友们&#xff0c;你们知道吗&#xff1f;那些在办公室里看起来特别能干的大佬们&#xff0c;他们好像总能很快地把各种文件变来变去&#xff0c;好像有什么特异功能似的。告诉你们吧&#xff0c;他们其实就是用了几款特别牛的PDF转换工具&#xff01;今天&…

前端打包装包——设置镜像

1、打包失败&#xff0c;因为没装包&#xff0c;装包失败&#xff0c;因为装包的源错误 npm config get registry npm config set registry https://registry.npmmirror.com/npm install npm run build还是失败&#xff0c;因为缺少了包&#xff0c;在package.json文件中没有包…

Centos7.9 安装Elasticsearch 8.15.1(图文教程)

本章教程,主要记录在Centos7.9 安装Elasticsearch 8.15.1的整个安装过程。 一、下载安装包 下载地址: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-15-1 你可以通过手动下载然后上传到服务器,也可以直接使用在线下载的方式。 wget https://artifacts…

Docker 部署 Seata (图文并茂超详细)

部署 Seata ( Docker ) [Step 1] : 创建对应的**seata**数据库, 也就是下面的的**seata.sql**文件 seata.sql [Step 2] : 拉取 Seata 镜像 docker pull seataio/seata-server:1.5.2[Step 3] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建…

热点文章轻松生成?一篇测评告诉你ChatGPT的神奇能力

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【视频教程】遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用

前期我们分别以Javascript和Python为编程语言&#xff0c;成功举办了数期关于GEE遥感大数据分析处理的基础培训课程&#xff0c;得到了来多个行业的学员的广泛参与和支持。应广大科研工作者的要求&#xff0c;本次课程将聚焦目前遥感应用最热门领域之一的灾害、水体及湿地领域&…

多线程篇(阻塞队列- LinkedTransferQueue)(持续更新迭代)

目录 一、简介 二、基本原理 三、jdk8 内部属性 4个常量值 transfer tryAppend take() awaitMatch boolean remove(Object o) 四、jdk17 主要参数 put/offer take() remove() 五、与synchronousqueue 区别 六、知识小结 一、简介 LinkedTransferQueue是一个由…

手撕Python之文件操作

1.编码 编码---encode() 解码---decode() #编码(encode):将我们能够识别的文字&#xff0c;转换为计算机能够识别的内容 print(你好.encode())#默认utf-8 #b\xe4\xbd\xa0\xe5\xa5\xbd #将你好翻成进制数#解码&#xff08;decode&#xff09;:将计算机能识别的内容&#xff0c…

兼顾身份保护和文本对齐!中山大学等提出CoRe:任意提示的文本到图像个性化生成!

文章链接&#xff1a;https://arxiv.org/pdf/2408.15914 亮点直击 CoRe只用于输出embedding和注意力图&#xff0c;不需要生成图像&#xff0c;可以用于任意提示。 在身份保护和文本对齐方面表现出优越的性能&#xff0c;特别是对于需要高度视觉可变性的提示。 除了个性化一般…