KMeans实验是一个经典的聚类分析实验,它利用KMeans算法将数据集中的样本分成K个簇,使得同一簇内的样本尽可能相似,而不同簇的样本尽可能不同。以下是以常用数据集(如鸢尾花数据集)为例的KMeans实验详细过程和内容,包括公式。
一、实验目的
- 加深对非监督学习的理解和认识。
- 掌握KMeans聚类算法的设计方法和实现过程。
二、实验环境
- 具有相关编程软件的PC机,如Python环境,并安装必要的库如numpy、matplotlib、sklearn等。
三、实验内容
1. 数据准备
- 选择鸢尾花数据集作为实验数据。鸢尾花数据集包含150个样本,每个样本有4个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,以及对应的类别标签(setosa、versicolor、virginica)。
2. 数据预处理
3. KMeans算法实现
KMeans算法的目标是最小化簇内平方误差和(Sum of Squared Errors, SSE),即所有数据点到其对应簇中心的距离平方和。目标函数公式为:
J=∑k=1K∑xi∈Ck∣∣xi−μk∣∣2J = \sum_{k=1}^{K} \sum_{x_i \in C_k} ||x_i - \mu_k||^2J=k=1∑Kxi∈Ck∑∣∣xi−μk∣∣2
其中:
- xxx_ixi 表示每个数据点;
- μk\mu_kμk 表示第 kkk 个簇的簇中心;
- CkC_kCk 表示第 kkk 个簇中的所有数据点。
KMeans算法的具体步骤如下:
- 初始化:随机从数据集中选择 KKK 个点作为初始簇中心。
- 分配簇:对每个数据点,计算其到每个簇中心的距离,并将其分配到最近的簇。
- 更新簇中心:对于每个簇,重新计算簇内所有数据点的均值作为新的簇中心。
- 重复迭代:重复步骤2和3,直到簇中心不再发生变化或达到预设的迭代次数。
在Python中,可以使用sklearn库中的KMeans类来实现KMeans算法。以下是具体的代码实现:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans# 加载鸢尾花数据集
iris = load_iris()
X = iris.data# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 设置簇的数量为3(因为鸢尾花数据集有3个类别)
kmeans = KMeans(n_clusters=3, random_state=42)# 训练模型
kmeans.fit(X_scaled)# 获取聚类结果
y_kmeans = kmeans.predict(X_scaled)# 可视化聚类结果(选择两个特征进行可视化)
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title('KMeans Clustering on Iris Dataset')
plt.xlabel('Feature 1 (standardized)')
plt.ylabel('Feature 2 (standardized)')
plt.show()
4. 实验结果分析
- 观察聚类结果,可以发现KMeans算法能够将鸢尾花数据集分成3个簇,每个簇对应一个类别。
- 通过计算SSE、轮廓系数等指标来评估聚类效果。SSE越小,表示簇内数据点越紧密;轮廓系数越大,表示聚类效果越好。
- 可以尝试不同的初始值、不同的簇数量 KKK,观察对聚类结果的影响。一般来说,初始值的选择对KMeans算法的结果有一定影响,但使用KMeans++等改进方法可以减小这种影响。簇数量 KKK 的选择需要根据实际问题和数据集的特点来确定,可以通过肘部法、轮廓系数等方法来选择合理的 KKK 值。
四、结论
KMeans算法是一种简单高效的聚类算法,在数据挖掘、图像处理等领域有着广泛的应用。通过本次实验,我们加深了对非监督学习的理解和认识,掌握了KMeans聚类算法的设计方法和实现过程。同时,也学会了如何评估聚类效果、如何选择合理的簇数量等实际问题。