目录
- 聚类任务
- 性能度量
- 距离计算
- 原型聚类
- 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()
实验结果如图:
在上面树状图中,每层链接一组聚类簇。