当前位置: 首页 > news >正文

机器学习 第9章 聚类

目录

  • 聚类任务
  • 性能度量
  • 距离计算
  • 原型聚类
    • 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.mrgr.cn/news/23373.html

相关文章:

  • 安装OpenResty(Linux-Docker)
  • 什么是话费充值api接口?话费充值API接口如何对接?
  • Linux下快速比较两个目录的不同,包括文件内容
  • 2024年身份验证技术应用的10大发展趋势
  • HTML转义字符对照表
  • Spring Cloud全解析:熔断之Hystrix线程隔离导致的问题
  • 如何在NXP源码基础上适配ELF 1开发板的PWM功能
  • React(v18)事件原理
  • 具体的散列表实现示例
  • SpringBoot2:请求处理原理分析-接口参数解析原理(argumentResolvers)
  • MIT License:全面解析与商用指南
  • 医疗设备运营管理,帮助医院实现智能管理评级
  • 兼顾身份保护和文本对齐!中山大学等提出CoRe:任意提示的文本到图像个性化生成!
  • openpose1.7.0编译 cuda12.2 cudnn 8.9.7.29 python3.7
  • 鼠标点击来动态确定 HSV 范围
  • window关闭端口程序
  • AbyssFish单连通周期边界多孔结构2D软件 V2.0版本更新
  • [晕事]今天做了件晕事43 python-byte串长度与转义字符
  • 戏曲文化苑管理系统小程序的设计
  • 问:Java中HashMap和Hashtable区别,知多少?