实验、K-means聚类实现

实验目标

本实验旨在帮助理解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的优缺点和适用场景:

优点:易于理解,执行效率高,适用于大规模数据集。

缺点:需要预先确定簇数,容易受到噪声和异常值的影响,无法处理非凸形状的簇,且对于初始中心的选择较为敏感。

适用场景:适合数据分布较为均匀且簇的形状为凸形的情况,如市场细分、图像压缩等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值