目录
- 1. 作者介绍
- 2. 聚类简介
- 2.1 K-Means聚类简介
- 2.2 高斯混合聚类简介
- 3. 实验过程
- 3.1 数据集介绍
- 3.2 代码思路
- 3.3 算法评价
- 3.4 代码实现
- 3.5 实验结果
- 4. 参考链接
1. 作者介绍
赵子仪,女,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:2095684305@qq.com
徐达,男,西安工程大学电子信息学院,2023级研究生
研究方向:机器视觉与人工智能
电子邮件:1374455905@qq.com
2. 聚类简介
2.1 K-Means聚类简介
K-means聚类是一种基于距离的聚类算法,这意味着它将试图将最近的点分组以形成一个簇。
首先,我们先确定目标分组数量,这是K的数值,根据需要划分的族或分组的数量,随机初始化k个质心。
然后将数据点指定给最近的质心,形成一个簇,接着更新质心,重新分配数据点。这个过程不断重复,直到质心的位置不再改变。
缺点:K值难确定、复杂度与样本呈线性关系、很难发现任意形状的簇。所有创建的簇都是圆形的,这是因为分类的质心都是使用平均值迭代更新的。
因此,我们需要一种不同的方法来将类分配给数据点。不再使用基于距离的模型,而是使用基于分布的模型,这就是高斯混合模型出现的意义。
2.2 高斯混合聚类简介
高斯混合聚类(Gaussian Mixture Model,GMM)是一种基于概率模型的聚类算法。它假设每个簇都由多个高斯分布组成,即每个簇的数据点都是从不同的高斯分布中采样得到的。在高斯混合模型中,每个簇由以下三个参数定义:均值向量(mean vector)、协方差矩阵(covariance matrix)和权重(weight)。
GMM的核心在于它能够捕捉数据中的复杂结构,允许数据点以不同的概率属于多个聚类。
高斯混合聚类算法的目标是最大化对数似然函数,即将所有数据点分配到簇中的概率的对数和。对数似然函数的表达式为:
其中,P(xi |zi=k)和P(zi=k)分别表示属于簇的概率和簇的权重。对数似然函数的最大化可以通过EM算法来实现。
高斯混合聚类算法基于EM算法,可以分为两个步骤:E步和M步。
E步骤——对于每个数据点xi,计算它属于每个簇的后验概率P(zi=k|xi),即计算数据点x_i来自每个簇的概率,公式如下图所示:
其中,P(xi |zi=k)表示当xi属于簇k时,它服从高斯分布的概率密度函数;P(zi=k)表示簇的权重。
M步骤——重新估计每个簇的均值向量、协方差矩阵和权重。具体而言,对于簇k,计算它的均值向量μk、协方差矩阵∑k和权重ωk,公式如右图所示:
其中,N 表示数据点的总数。
重复执行E步和M步,直到收敛为止。算法的收敛条件可以是对数似然函数的增量小于某个阈值,或者每个簇的均值向量、协方差矩阵和权重的变化小于某个阈值。
3. 实验过程
3.1 数据集介绍
Digits dataset手写数字数据集包含1797个0-9的手写数字数据,每个数据由8 * 8 大小的矩阵构成,矩阵中值的范围是0-16,代表颜色的深度。
该手写数据为Sklearn内置数据集,导入数据集:
from sklearn.datasets import load_digits
3.2 代码思路
数据准备:使用load_digits()函数加载手写数字数据集,其中X包含了图像数据,y包含了对应的真实标签。
降维:使用PCA将手写数字数据集的像素特征降维到2维。这可以帮助我们在二维空间中可视化数据,以便更好地理解数据的结构和聚类结果。
PCA的工作原理如下:
1、计算协方差矩阵:首先计算数据集的协方差矩阵,该矩阵反映了不同特征之间的线性相关性。协方差矩阵的对角线元素表示各特征的方差,非对角线元素表示不同特征之间的协方差。
2、特征值分解:对协方差矩阵进行特征值分解,得到特征值和特征向量。特征向量表示数据在不同方向上的主要方差分布,而特征值表示对应特征向量的重要程度。
3、选择主成分:根据特征值的大小,选择最重要的特征向量作为主成分,即数据在哪些方向上的信息最为集中。
4、降维变换:将数据投影到选定的主成分上,从而将数据从原始高维空间映射到低维空间,实现降维。
GMM聚类:使用GaussianMixture模型拟合降维后的数据,设定聚类数为10(数字0-9)。然后根据拟合结果对数据进行聚类,得到每个数据点所属的类别。
可视化聚类结果:使用Matplotlib绘制了GMM聚类结果的散点图。每个聚类使用不同的颜色表示,以便观察聚类效果。
KMeans聚类:使用KMeans模型对降维后的数据进行聚类,同样设定聚类数为10。然后根据 KMeans 聚类结果绘制散点图。
可视化聚类结果:使用Matplotlib绘制了K-Means聚类结果的散点图。每个聚类使用不同的颜色表示,以便观察聚类效果。
随后与K-Means算法进行对比,使用轮廓系数(Silhouette Score,是一种用于评估聚类质量的指标。它能够衡量每个样本与其所属簇的紧密程度以及与其他簇的分离程度。轮廓系数的取值范围在[-1,1]之间,越接近1表示聚类效果越好,越接近-1表示聚类效果越差)来评估GMM和KMeans聚类的效果。这一步可以帮助我们比较两种算法的聚类效果,并选择最优的算法。
3.3 算法评价
优点:
软聚类: GMM属于软聚类方法,它为每个数据点分配属于每个类的概率,而不是硬分配到某一类。这使得GMM能够表达不确定性,适用于模糊边界的情况。
聚类形状的灵活性: 由于使用了协方差矩阵,GMM可以形成各种形状的聚类,包括椭圆形、圆形和拉伸形状,而不仅仅是球形聚类。
参数估计: GMM不仅可以进行聚类,还可以估计数据的生成模型参数(均值、协方差和混合系数),这在某些应用中是有价值的。
缺点:
计算复杂性: GMM的训练过程涉及到期望最大化(EM)算法,这通常需要更多的计算资源和时间,特别是当数据集很大时。
初始化敏感性: GMM的结果可能受到初始化的影响,不同的初始化可能导致不同的聚类结果。
选择组件数量: 在应用GMM之前,需要预先确定混合组件的数量(高斯分布的数量),这通常需要领域知识或通过交叉验证等方法来确定。
可能的奇异性问题: GMM可能遇到协方差矩阵接近奇异矩阵的问题,这会导致算法的不稳定。
对异常值敏感: 由于GMM基于概率密度,它对异常值或噪声点可能较为敏感。
3.4 代码实现
import os
os.environ["OMP_NUM_THREADS"] = '8'
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from matplotlib.colors import LinearSegmentedColormap
from sklearn.metrics import silhouette_score
# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target
# 可视化手写数字数据集中的前10个数字的图像并了解它们对应的真实标签
plt.figure(figsize=(12, 6))
for i in range(10):
plt.subplot(2, 5, i + 1) # 创建子图形,2行5列,第i+1个子图形
plt.imshow(X[i].reshape(8, 8), cmap='gray') # 显示第i个图像
plt.title(f"Digit: {y[i]}") # 添加标题,显示对应的数字类别
plt.axis('off') # 关闭坐标轴
plt.suptitle('Example Digits from Digits Dataset', fontsize=16)
plt.savefig('Digits_example_digits.png') # 保存图像
plt.show()
# 使用PCA将手写数字数据集的像素特征降维到2维,以便在二维空间中对数据进行可视化,有助于我们更直观地了解数据的结构和聚类结果
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 使用GMM模型拟合数据
gmm = GaussianMixture(n_components=10, random_state=0)
clusters_gmm = gmm.fit_predict(X_pca)
# 可视化GMM聚类结果
plt.figure(figsize=(8, 6))
for i in range(10):
plt.scatter(X_pca[clusters_gmm == i, 0], X_pca[clusters_gmm == i, 1], label=f'Cluster {i}', alpha=0.5)
plt.title('GMM Clustering of Digits Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.savefig('gmm_clusters.png')
plt.show()
# 使用K-Means模型拟合数据
kmeans = KMeans(n_clusters=10, random_state=0,n_init='auto')
clusters = kmeans.fit_predict(X_pca)
# 绘制KMeans聚类结果的散点图
plt.figure(figsize=(8, 6))
for i in range(10):
plt.scatter(X_pca[clusters == i, 0], X_pca[clusters == i, 1], label=f'Cluster {i}', alpha=0.5)
plt.title('KMeans Clustering of Digits Data')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend()
plt.savefig('kmeans_clusters.png')
plt.show()
#聚类评估指标验证
gmm_silhouette = silhouette_score(X, clusters_gmm)
print(f"Silhouette Score for GMM: {gmm_silhouette}")
kmeans_silhouette = silhouette_score(X, clusters)
print(f"Silhouette Score for KMeans: {kmeans_silhouette}")
3.5 实验结果
手写数字数据集部分数据展示如下:
GMM聚类结果如下:
K-Means聚类结果如下:
轮廓系数计算结果如下:
4. 参考链接
1.独家 | 使用高斯混合模型,让聚类更好更精确(附数据&代码&学习资源: link
2.聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)_高斯混合聚类: link
3.机器学习(西瓜书)聚类_西瓜书 常用聚类指标: link
4.Python实现高斯混合聚类(GMM): link