实验目标
本实验旨在帮助理解K-means聚类的基本原理,学习如何使用Scikit-learn库实现K-means聚类,并通过实验观察其在不同数据集上的效果。学会数据标准化、如何确定聚类数目以及评估聚类效果。
实验环境
o Python 3.x
o Scikit-learn库
o Jupyter Notebook
o Matplotlib
实验数据集
本实验采用sklearn提供的make_blobs数据生成器,生成具有3个中心点的二维数据集,以便于观察和可视化K-means聚类结果。
实验步骤
一、导入必要的库
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
import matplotlib # 设置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # SimHei 是常用的中文黑体字体
matplotlib.rcParams['axes.unicode_minus'] = False # 显示负号
二、生成数据集
X, y = make_blobs(n_samples=1000, centers=[[0, 0], [1, 1], [2, 2]], cluster_std=[0.3, 0.2, 0.3], random_state=42)
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c='blue', s=50, alpha=0.5)
plt.title("Generated Data (Before Standardization)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
三、数据预处理-标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
plt.figure(figsize=(8, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c='green', s=50, alpha=0.5)
plt.title("Generated Data (After Standardization)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
四、计算wcss,手肘法确定最佳簇数
wcss = []
for k in range(1, 9):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_scaled)
wcss.append(kmeans.inertia_)
plt.figure(figsize=(8, 6))
plt.plot(range(1, 9), wcss, marker='o', color='blue')
plt.title('Elbow Method for Optimal k')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.show()
五、根据手肘法结果,选择合适的k值 (如选择 k=3),拟合模型并预测
kmeans = KMeans(n_clusters=3, random_state=42)
y_kmeans = kmeans.fit_predict(X_scaled)
plt.figure(figsize=(8, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_kmeans, cmap='viridis', s=50, alpha=0.6)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X')
plt.title("K-Means Clustering Results (k=3)")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
六、评估聚类效果(如使用轮廓系数)
sil_score = silhouette_score(X_scaled, y_kmeans)
print(f"Silhouette Score: {sil_score:.4f}")
from sklearn.metrics import calinski_harabasz_score
calinski_score = calinski_harabasz_score(X_scaled, y_kmeans)
print(f"Calinski-Harabasz Score: {calinski_score:.4f}")
实验总结
1、K-means算法是一种经典的无监督学习方法,主要用于数据的聚类。其基本思想是将数据集划分为k个簇,并通过不断调整簇中心,使得每个数据点与其所在簇的中心的距离最小化。K-means算法的步骤如下:
(1)初始化:随机选择k个初始簇中心。
(2)分配簇:将每个数据点分配给距离其最近的簇中心。
(3)更新簇中心:计算每个簇内所有点的均值,并将均值作为新的簇中心。
(4)重复:重复“分配簇”和“更新簇中心”步骤,直到簇中心不再变化或达到最大迭代次数。
优点:
(1)简单且易于实现。
(2)计算速度较快,适用于大规模数据集。
缺点:
(1)需要预先指定簇的数量k。
(2)对初始簇中心的选择敏感,可能会陷入局部最优解。
(3)不适用于非凸形状的簇,或者簇的大小、密度差异较大的数据。
2、K-means算法通常使用欧氏距离来计算数据点到簇中心的距离。对于高维数据,欧氏距离仍然是常见选择,但在某些情况下,曼哈顿距离等其他距离度量也可以使用。
3、K-means函数的参数设置:
(1)n_clusters:簇的数量k,这是需要提前确定的参数。
(2)max_iter:最大迭代次数。通常,K-means会在簇中心不再发生变化时停止,但为了防止无穷循环,可以设置最大迭代次数。
(3)n_init:初始化次数,即算法会尝试n_init次不同的初始簇中心,最终返回最优的结果。一般来说,设置n_init=10较为常见,可以有效避免局部最优解。
(4)random_state:设置随机数种子,使得实验结果可复现。
4、随机初始化:最常见的方式,随机选择k个数据点作为初始中心。
5、选择合适k值的方法:手肘法、轮廓系数。
6、聚类算法的其他评估指标:Calinski-Harabasz指数、Davies-Bouldin指数。
7、K-means的时间复杂度:O(n*k*t).
8、K-means的优缺点和适用场景:
优点:易于理解,执行效率高,适用于大规模数据集。
缺点:需要预先确定簇数,容易受到噪声和异常值的影响,无法处理非凸形状的簇,且对于初始中心的选择较为敏感。
适用场景:适合数据分布较为均匀且簇的形状为凸形的情况,如市场细分、图像压缩等。
标签:plt,means,kmeans,scaled,score,实验,聚类 From: https://blog.csdn.net/2201_75467743/article/details/144283651