一、聚类任务的定义
1.聚类是一种无监督学习方法,用于将数据集中的样本划分为若干组,使得同一组内的样本相似度较高,而不同组之间的样本相似度较低。聚类在数据挖掘、图像处理、市场分析等领域有广泛应用。
2.聚类任务分为以下方面:
(1)数据准备:
数据收集:首先,需要收集待分析的数据集。
数据预处理:包括数据清洗(去除噪声、异常值等)、数据转换(如标准化、归一化)和特征选择/提取等步骤,以确保数据适合进行聚类分析。
(2)选择聚类算法:根据数据的特点和聚类分析的目标,选择合适的聚类算法。常见的聚类算法包括K-means、层次聚类(Hierarchical Clustering)、DBSCAN、谱聚类(Spectral Clustering)等。
(3)确定算法参数:大多数聚类算法都需要一些参数来控制聚类的过程,这些参数的选择对聚类结果有很大影响,通常需要通过实验或交叉验证等方法来确定最优参数。
(4) 执行聚类算法:应用选定的聚类算法和参数对数据集进行聚类,得到若干个簇。 在这个过程中,算法会根据数据对象之间的相似性或距离度量来划分簇。
(5)结果评估:由于聚类分析是无监督的,因此评估聚类结果的好坏通常比有监督学习更为复杂。 常用的评估方法包括轮廓系数(Silhouette Coefficient)、Calinski-Harabasz指数(也称方差比准则)、Davies-Bouldin指数等。 也可以通过可视化方法(如散点图、热力图等)来直观评估聚类效果。
(6)结果解释和应用:对聚类结果进行解释,分析每个簇的特点和含义。 将聚类结果应用于实际问题中,如市场细分、文本分类、图像分割等。
二、常见的聚类方法及其应用
1.K均值聚类(K-Means Clustering)
原理:通过迭代的方法,将数据集划分为K个簇,每个簇由一个质心(中心点)表示。
步骤:
①随机选择K个初始质心。
②将每个样本分配到最近的质心所属的簇。
③重新计算每个簇的质心。
④重复步骤②和③,直到质心不再变化或达到最大迭代次数。
优点:简单高效,适用于大规模数据集。
缺点:需要预先指定K值,对初始质心敏感,适用于球形簇。
2.层次聚类(Hierarchical Clustering)
原理:通过不断合并或拆分簇,形成一个树状的聚类层次结构。
步骤:
①凝聚层次聚类(Agglomerative Hierarchical Clustering):每个样本开始时作为一个单独的簇,逐步合并最近的簇,直到所有样本合并成一个簇。
②分裂层次聚类(Divisive Hierarchical Clustering):开始时所有样本作为一个簇,逐步将最不相似的样本分离出去,直到每个样本单独成簇。
优点:不需要预先指定簇数,能生成聚类树。
缺点:计算复杂度较高,适用于小规模数据集。
3.DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
原理:基于密度的聚类方法,通过寻找高密度区域形成簇。
步骤:
①对于每个点,找到其在给定半径(ε)内的邻居点数。
②如果邻居点数大于或等于最小样本数(MinPts),则该点为核心点,构成一个簇。
③递归地将核心点的邻居点加入簇中,直到没有新的点可以加入。
优点:能识别任意形状的簇,能处理噪声数据。
缺点:参数ε和MinPts的选择较为敏感。
4.高斯混合模型(Gaussian Mixture Model, GMM)
原理:假设数据集由多个高斯分布的混合组成,通过期望最大化算法(EM算法)来估计每个高斯分布的参数。
步骤:
①初始化每个高斯分布的参数。
②计算每个样本属于每个高斯分布的概率。
③更新每个高斯分布的参数。
④重复步骤2和3,直到参数收敛。
优点:能处理具有不同形状和大小的簇。
缺点:计算复杂度较高,容易陷入局部最优解。
三、原型聚类的方法
1.k均值算法
①定义:K均值算法(K-means algorithm)是一种广泛使用的聚类算法,其主要目的是将数据点分成K个簇,每个簇由一个中心点(即原型)表示,该中心点是簇内所有数据点的均值。
②原理:K均值算法基于最小化簇内数据点与中心点之间的距离来实现数据的分组。
③步骤:
1初始化:随机选择K个数据点作为初始簇中心。
2分配:计算每个数据点到各个簇中心的距离,并将每个数据点分配到最近的簇中心。
3更新:重新计算每个簇的中心点,即计算分配给该簇的所有数据点的均值,作为新的簇中心。
4迭代:重复步骤2和步骤3,直到簇中心不再发生变化或达到预设的最大迭代次数。
2.学习向量量化
①定义:学习向量量化(Learning Vector Quantization,简称LVQ)是一种基于原型聚类的监督学习统计学分类算法,它结合了聚类算法和监督学习的特点。
②原理:LVQ算法试图找到一组原型向量来刻画数据集的聚类结构,每个原型向量代表一个簇。与一般的聚类算法不同,LVQ假设数据样本带有类别标记,因此可以利用这些类别标记来辅助聚类。
③步骤:
1初始化:随机从各类别中选取样本作为初始原型向量。
2迭代更新:从样本集中随机选取一个样本,计算该样本与所有原型向量的距离,找到最近的原型向量。根据样本的类别标记与最近原型向量的类别标记是否一致,来更新该原型向量的位置。如果一致,则将该原型向量向样本靠近;如果不一致,则将其远离样本。
3重复迭代:不断重复步骤2,直到满足停止条件(如达到最大迭代次数或原型向量的变化小于某个阈值)。
3.高斯混合聚类
①定义:高斯混合聚类(Gaussian Mixture Model, GMM)是一种基于概率模型的聚类方法,它通过多个高斯分布的线性组合来表示数据的聚类结构。
②原理:高斯混合聚类假设数据集中的每个样本点都是由多个高斯分布产生的,每个高斯分布对应一个聚类簇。算法通过迭代过程来估计这些高斯分布的参数(均值向量、协方差矩阵和混合系数),并将样本点划分到最有可能产生它的高斯分布(即聚类簇)中。
③模型参数
均值向量(μ):表示每个聚类簇的中心位置。
协方差矩阵(Σ):描述每个聚类簇的形状和方向。
混合系数(π):表示每个高斯分布在混合模型中的权重,即样本点属于该高斯分布(聚类簇)的概率。
④迭代过程(EM算法)
高斯混合聚类通常采用期望最大化(Expectation Maximization, EM)算法进行迭代优化。
EM算法包括两个主要步骤:E步骤(Expectation)和M步骤(Maximization)。
E步骤:对于每个样本点,计算其属于每个高斯分布(聚类簇)的后验概率,即该样本点由每个高斯分布生成的概率。
M步骤:根据E步骤计算得到的后验概率,更新每个高斯分布的均值向量、协方差矩阵和混合系数,使得模型对数据的拟合更好。
四、高斯混合聚类的原理
高斯混合模型(Gaussian Mixture Model, GMM)是一种概率模型,假设数据集由多个高斯分布组成。GMM 是一种软聚类方法,即每个样本属于每个簇的概率不同,而不是硬聚类中样本只属于一个簇。
五、密度聚类
密度聚类(Density-Based Clustering)是一种基于密度的聚类方法,主要用于识别数据集中密度较高的区域作为簇,并能处理噪声和发现任意形状的簇。最常见的密度聚类算法是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。
六、层次聚类的算法和实现
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
file_path = r'C:\Users\深\Desktop\文件\数学建模学习\1999年全国31个省份城镇居民家庭平均每人全年消费性支出数据.csv'
# 读取文件
data = pd.read_csv(file_path,encoding='gbk')
print(data.head())
#数据预处理,检查是否有空值
print(data.isnull().any())
X = data.iloc[:, 1:]
# 数据的标准化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(np.round(X_scaled, 2))
# 设置K值的范围
k_range = range(1, 11) # 假设我们测试从1到10的K值
sse = [] # 用于存储每个K值对应的SSE
for k in k_range:
# 对每个K值,应用KMeans算法
kmeans = KMeans(n_clusters=k, random_state=42).fit(X_scaled)
# 计算SSE
sse.append(kmeans.inertia_)
# 绘制手肘图
plt.figure(figsize=(10, 6))
plt.plot(k_range, sse, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.title('Elbow Method')
plt.show()
# 进行聚类分析
# 设置聚类数量为2
best_k = 2
# 创建KMeans实例,并指定聚类数量为k
kmeans = KMeans(n_clusters=best_k, random_state=42)
# 对数据进行聚类
kmeans.fit(X_scaled)
# 获取聚类标签(每个数据点所属的聚类)
labels = kmeans.labels_
# 将簇标签添加到原始数据中
data['亚类别'] = kmeans.labels_
print(data)
#绘制聚类图
from sklearn.decomposition import PCA
# 应用PCA将特征降到2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 绘制聚类图
plt.figure(figsize=(10, 6))
colors = ['r', 'g', 'b', 'y', 'c', 'm', 'k', 'orange', 'purple', 'pink']
for k in range(best_k):
# 为每个聚类绘制不同的颜色
cluster_data = X_pca[labels == k]
plt.scatter(cluster_data[:, 0], cluster_data[:, 1], s=50, c=colors[k], label=f'Cluster {k + 1}')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of Clusters')
plt.legend()
plt.show()
运行结果: