QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2336|回复: 0
打印 上一主题 下一主题

python实现k均值聚类

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-21 10:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
K均值聚类(K-means Clustering)是一种常见的聚类算法,它将数据点划分为预先指定数量的聚类。该算法使用迭代的方法,通过最小化样本点与所属聚类中心之间的距离来优化聚类结果。
( U' H" }7 K# y. z4 S9 SK均值聚类算法的步骤如下:" j/ W: }) }! A0 T; D3 U1 m) {
4 d, u. s' o8 t! g' M, Q& [
1.随机选择K个初始聚类中心点(质心)。K代表要形成的聚类数量。/ F# k0 ?! Q4 u. s! a3 A) w
2.将数据点分配给最近的聚类中心,形成K个聚类。# T- J/ S. T- l5 j  M
3.计算每个聚类的新聚类中心,即将当前所属聚类中的样本点的均值作为新的聚类中心。1 I' Z% T% i0 ]. J9 J$ o
4.重复步骤2和步骤3,直到满足某个停止条件,例如聚类中心不再发生变化或达到最大迭代次数。
5 {, K5 W% R$ z6 K2 }. Z/ h3 H' f6 t' `( s
K均值聚类算法的优点包括简单、易于实现,以及在大规模数据集上的高效性。然而,该算法对于初始聚类中心的选择敏感,并且对于非凸形状的聚类较为困难。
& U5 C: I/ O- ~在Python中,你可以使用scikit-learn库中的KMeans类来实现K均值聚类算法。该类提供了灵活的参数设置,例如聚类数量、初始聚类中心的选择方法等。* h& r+ s# f: ]$ M9 d( S9 B$ r
逐行解释代码的含义:
8 O* Y( V* ^4 @# E1 j6 Iimport numpy as np$ {% ]' s" ~4 n3 E* c* m/ P) V: s
import pandas as pd7 s& x' U5 I7 l( ^0 V9 v' ~4 L
import matplotlib.pyplot as plt
. W& f% V: z# s3 Q+ J1 A( ifrom sklearn.datasets import load_iris
) n2 R3 q& J2 \; W4 P- lfrom sklearn.cluster import KMeans
" p4 G8 n6 y1 m  G4 @/ B4 f8 wfrom sklearn.metrics import silhouette_score& U# g& C$ m' o4 X

. }9 L" v8 g7 i# C: X这些是导入所需的库。numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,sklearn.datasets中的load_iris用于加载鸢尾花数据集,sklearn.cluster中的KMeans用于K均值聚类,sklearn.metrics中的silhouette_score用于计算轮廓系数。- B/ B% `, F: \: b6 ]
df = pd.DataFrame(load_iris()['data'], columns=load_iris()['feature_names'])
' _, [" T- f& K) K
* V. M2 p( R" M这行代码使用load_iris函数加载鸢尾花数据集,并将数据存储到一个DataFrame对象df中。数据集中的每个样本具有4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。0 B! C) z- V; [2 u8 P
score_list = []
( k- N' d% ]0 Wfor i in range(2, 10):9 d% N9 W$ N! d0 w  ?9 M" j
    model = KMeans(i)% S4 p6 Y4 Q% S+ S, w3 a
    model.fit(df.iloc[:,:2])
" J9 I- Y' h7 E  q8 P4 k    score_list.append(silhouette_score(df, model.labels_))
4 b5 Y7 p, B8 h+ p8 `, y$ B5 b; [, r) L) F. s* c) o  T
plt.plot([i for i in range(2, 10)], score_list)
  u1 W& v% s- C  J0 {' H) V9 k2 M; F& ]7 ]2 T# g5 g
这段代码计算K取不同值时的轮廓系数,并绘制了K值与轮廓系数之间的曲线图。首先,循环从2到9遍历不同的K值。在每次迭代中,创建一个KMeans对象并指定K值,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,计算当前聚类结果的轮廓系数,并将其添加到score_list列表中。最后,使用matplotlib.pyplot绘制K值与轮廓系数之间的曲线图。% U& t6 T( I& f/ @( E
model = KMeans(3)' N$ Q9 |; |* U( s* Q: N
model.fit(df.iloc[:,:2])
4 K* c: G. z8 ^; Z, I, Hdf2 = df.iloc[:,:2].copy()7 a" E; C+ ^% [0 \. P& a% U4 ^
df2['label'] = model.labels_7 W5 Z# I6 e0 z% C' O! t
2 E2 K; B0 ]1 ?+ f$ T) N7 R% }
from plotnine import *
9 ~/ v+ T6 |% r$ Z. ]9 J# x- B, y8 o: b8 X* K7 w0 K" [6 C
(
! a7 d1 s1 s# e0 i& A  L: {    ggplot(df2,aes('sepal length (cm)', 'sepal width (cm)', color='label'))% Q4 H( R: q! j
    + geom_point()
# k1 l) F% a. F7 O    + theme_matplotlib()
0 B1 b5 I: a( _3 \8 v. H1 Y  I)5 N0 s4 U9 y6 r
( i0 G3 x2 R1 s
这段代码进行了最终的K均值聚类和绘图。首先,创建一个KMeans对象并指定K值为3,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,创建一个新的DataFrame对象df2,其中包含原始数据集的前两列特征以及聚类结果的标签。然后,导入plotnine库,并使用其提供的函数绘制散点图。通过指定x轴为花萼长度,y轴为花萼宽度,颜色根据聚类标签进行分类。最后,使用theme_matplotlib函数设置绘图的主题样式为与matplotlib兼容的样式。
9 k9 x$ C+ g7 Y: g  A3 [# w7 r希望这个逐行解释对你有所帮助!如果你还有其他问题,请随时提问。; [) \" a- c; Q) U' ^

& I) W* Z9 h/ B9 Q3 u( b# p% C: M! p# W2 U5 N

) y' N1 ~( q2 }. _

29.kmeans_clustering.py

902 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-14 15:15 , Processed in 0.449608 second(s), 55 queries .

回顶部