首页 > 其他分享 >实验、K-means聚类实现

实验、K-means聚类实现

时间:2024-12-06 10:29:25浏览次数:5  
标签:plt means kmeans scaled score 实验 聚类

实验目标

本实验旨在帮助理解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

相关文章

  • 12.6百度机器翻译SDK实验
    实验一名称:百度机器翻译SDK实验(2024.11.15日完成)实验要求  任务一:下载配置百度翻译Java相关库及环境(占10%)。    任务二:了解百度翻译相关功能并进行总结,包括文本翻译-通用版和文本翻译-词典版(占20%)。    任务三:完成百度翻译相关功能代码并测试调用,要求可以实现中文......
  • 12.7百度图像增强与特效SDK实验
    实验二名称:百度图像增强与特效SDK实验(2024.11.22日完成)一、实验要求  任务一:下载配置百度图像增强与特效的Java相关库及环境(占10%)。    任务二:了解百度图像增强与特效相关功能并进行总结(占20%)。    任务三:完成图像增强GUI相关功能代码并测试调用,要求上传自己的模糊......
  • 12.8实验三:JFinal极速开发框架实验(2024.11.29日完成)
    实验三:JFinal极速开发框架实验(2024.11.29日完成)一、实验要求  任务一:了解Maven及其使用方法,总结其功能作用(占20%)     任务二:学习JFinal框架,基于Maven建立JFinal工程,并对JFinal框架功能进行总结介绍(占30%)     任务三:基于JFinal完成一个简单的学生信息管理系统(......
  • 实验5 继承和多态
    实验任务3pets.hpp源码#pragmaonce#include<iostream>#include<string>usingnamespacestd;classMachinePets{ private: stringnickname; public: MachinePets(conststring&s):nickname(s){} conststring&get_nickname()const{ ret......
  • 实验5
    任务1代码1.1#include<stdio.h>2#defineN53voidinput(intx[],intn);4voidoutput(intx[],intn);5voidfin_min_max(intx[],intn,int*pmin,int*pmax);67intmain(){8inta[N];9intmin,max;1011printf("......
  • 实验5
    task1.11#include<stdio.h>2#defineN534voidinput(intx[],intn);5voidoutput(intx[],intn);6voidfind_min_max(intx[],intn,int*pmin,int*pmax);78intmain(){9inta[N];10intmin,max;1112printf(......
  • 实验5
    1#include<stdio.h>2#defineN53voidinput(intx[],intn);4voidoutput(intx[],intn);5voidfind_min_max(intx[],intn,int*pmin,int*pmax);6intmain(){7inta[N];8intmin,max;9printf("录入%d个数据;\n"......
  • 软件设计:实验 25:访问者模式
    实验25:访问者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解访问者模式的动机,掌握该模式的结构;2、能够利用访问者模式法解决实际问题。 [实验任务一]:打包员在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。实验要......
  • 实验5
    实验任务1.1:源代码:1#include<stdio.h>2#defineN534voidinput(intx[],intn);5voidoutput(intx[],intn);6voidfind_min_max(intx[],intn,int*pmin,int*pmax);78intmain(){9inta[N];10intmin,max;1112p......
  • 实验五
    task1: publisher.hpp#pragmaonce#include<iostream>#include<string>usingstd::cout;usingstd::endl;usingstd::string;//发行/出版物类:Publisher(抽象类)classPublisher{public:Publisher(conststring&s="");//构......