实验. K-means聚类实现
实验目标
本实验旨在帮助学生理解K-means聚类的基本原理,学习如何使用Scikit-learn库实现K-means聚类,并通过实验观察其在不同数据集上的效果。学生将学会数据标准化、如何确定聚类数目以及评估聚类效果。
实验环境
o Python 3.x
o Scikit-learn库(sklearn)
o Jupyter Notebook或类似IDE(用于代码编写和结果展示)
实验数据集
本实验采用sklearn提供的make_blobs数据生成器,生成具有3个中心点的二维数据集,以便于观察和可视化K-means聚类结果。
实验步骤
1. 导入必要的库
o 导入sklearn中用于数据生成、标准化和模型评估的相关模块,K-means算法模块。
2. 生成数据集
o 使用make_blobs函数生成具有3个簇的数据集。
3. 数据预处理
o 由于聚类是基于点之间的距离实现,所以原始数据如果在量纲上存在差异,则必须进行标准化,使用StandardScaler对特征进行标准化处理。
4. 确定最佳聚类簇数
o 本实验通过手肘法(拐点法)确定最佳聚类簇数。
5. 构建、训练模型并测试,可视化聚类结果
6. 模型评估
o 本实验使用轮廓系数(Silhouette Score)评估聚类效果,可进一步分析模型在不同簇数下的表现。
实验总结
o 理解算法原理:K-means 是一种无监督学习算法,通过最小化数据点到各自簇中心的距离来分配簇。其优点在于简单高效,但需要事先指定簇数k,并且对初始值敏感。
o 相关细节分析:如何选择合适的距离度量?K-means函数的参数如何设置?如何选择合适的初始中心?有哪些选择合适k值的方法?聚类算法除了轮廓系数还有哪些模型评估指标?K-means的复杂度如何?K-means有些优缺点和适用场景?
o 探讨实验/编程问题:总结讨论编程中遇到的难点或者bug。比如出现“UserWarning: KMeans is known to have a memory leak on Windows with MKL…”这样的警告如何解决?
o 实验展望:进一步实现用K-means实现高维数据聚类;比较K-means与K-means++及MiniBatchKMeans。
实验代码参考
以下是一个利用Scikit-learn生成数据集(二维3类)并实现K-means聚类的代码示例:
——————————————
# step1:导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# step2:生成数据集(使用函数make_blobs,注意参数设置,如生成样本点1000个,二维,中心点[0,0],[1,1],[2,2],方差0.3,0.2,0.3,随机种子42)
# 可视化生成数据集(注意这里是标准化前的数据)
# step3:数据预处理——标准化
# step4:计算wcss,手肘法确定最佳簇数
wcss = []
# 依次尝试1~8个簇
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_scaled)
wcss.append(kmeans.inertia_)
# 绘制手肘图
# step5:根据手肘法结果,选择合适的k值 (如选择 k=3),拟合模型并预测
# 可视化聚类结果
# step6:评估聚类效果(如使用轮廓系数)
# ps:可尝试别的评估方法,比如Calinski-Harabasz Index
#注意不是metrics.calinski_harabaz_score,而是metrics.calinski_harabasz_score
——————————————

