机器学习 第9章 聚类

聚类任务

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

性能度量

聚类性能度量亦称聚类"有效性指标"。对聚类结果,我们需通过某种指标来评估其好坏,其中包括内部指标和外部指标。
内部指标仅依赖于聚类本身的特性,如轮廓系数、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()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值