QQ登录

只需要一步,快速开始

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

python实现k均值聚类

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

1171

主题

4

听众

2781

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-21 10:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
K均值聚类(K-means Clustering)是一种常见的聚类算法,它将数据点划分为预先指定数量的聚类。该算法使用迭代的方法,通过最小化样本点与所属聚类中心之间的距离来优化聚类结果。
, F- z% L2 O, KK均值聚类算法的步骤如下:8 c  i; g# S' Q9 U; S1 E" L0 F
6 d  Z  }3 |: B
1.随机选择K个初始聚类中心点(质心)。K代表要形成的聚类数量。
# h0 j4 J% m" s( q2.将数据点分配给最近的聚类中心,形成K个聚类。5 {( `4 |* C+ [. M6 O- i! x
3.计算每个聚类的新聚类中心,即将当前所属聚类中的样本点的均值作为新的聚类中心。
- V+ w0 [1 {. `" D6 b4.重复步骤2和步骤3,直到满足某个停止条件,例如聚类中心不再发生变化或达到最大迭代次数。
+ j* I" \9 S1 T0 E
& I4 S+ k% K/ M& {( c) wK均值聚类算法的优点包括简单、易于实现,以及在大规模数据集上的高效性。然而,该算法对于初始聚类中心的选择敏感,并且对于非凸形状的聚类较为困难。
4 _* ?5 I5 p/ Z6 A3 X" ?在Python中,你可以使用scikit-learn库中的KMeans类来实现K均值聚类算法。该类提供了灵活的参数设置,例如聚类数量、初始聚类中心的选择方法等。
& L0 X- M* X3 u0 f0 l0 B逐行解释代码的含义:
8 R6 O6 W% n$ _2 Wimport numpy as np
6 T6 C7 h( n# ]- [7 l& Y/ Eimport pandas as pd% |. z7 C& E7 D1 d( K
import matplotlib.pyplot as plt* H; r- r$ t& K( B3 C) ?% P
from sklearn.datasets import load_iris
* ?+ _- Z9 a2 L; m. i- e6 h0 jfrom sklearn.cluster import KMeans
6 Y% Z: H; M  L7 L3 Wfrom sklearn.metrics import silhouette_score
9 E/ i9 [/ J, [" N2 r; ^1 z  W) u
这些是导入所需的库。numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,sklearn.datasets中的load_iris用于加载鸢尾花数据集,sklearn.cluster中的KMeans用于K均值聚类,sklearn.metrics中的silhouette_score用于计算轮廓系数。" t  {& C2 g  g1 I* b8 G  s
df = pd.DataFrame(load_iris()['data'], columns=load_iris()['feature_names'])
& ^) O! N$ h/ g6 C3 y
! I3 g5 u9 [2 r这行代码使用load_iris函数加载鸢尾花数据集,并将数据存储到一个DataFrame对象df中。数据集中的每个样本具有4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。
; @# V, q5 v* G3 y9 oscore_list = []
! |! K% ~% W$ Pfor i in range(2, 10):5 ?' p/ }1 F! u- ^- o, r2 m5 w
    model = KMeans(i)
. w8 k0 C; L! P    model.fit(df.iloc[:,:2])1 F5 H" X& d& a# {, y9 w" {& y/ z% o
    score_list.append(silhouette_score(df, model.labels_))5 Z0 `' F2 c8 P8 k7 d1 _

6 \  p9 |5 d) W4 U5 u: r' B' {: Aplt.plot([i for i in range(2, 10)], score_list)* A, V( x. n7 g: O: J
* e* c1 P/ L+ B" U; i8 @
这段代码计算K取不同值时的轮廓系数,并绘制了K值与轮廓系数之间的曲线图。首先,循环从2到9遍历不同的K值。在每次迭代中,创建一个KMeans对象并指定K值,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,计算当前聚类结果的轮廓系数,并将其添加到score_list列表中。最后,使用matplotlib.pyplot绘制K值与轮廓系数之间的曲线图。
0 b: E2 l' n2 V" C" q6 j% d. Ymodel = KMeans(3)3 ?3 M+ |* `2 L* t
model.fit(df.iloc[:,:2])
: x6 E5 f* n( _% x7 Adf2 = df.iloc[:,:2].copy()2 W, c/ N: o! G! f" y% ]9 z
df2['label'] = model.labels_
* @7 Y' `% a+ k; }, e
7 [( W+ D5 i+ B. h& P1 |# {! Lfrom plotnine import *
% Q: R# Y! j3 F( B6 w! X
! w* U# M3 o4 b1 m(" Q5 W6 y8 S! I0 ]4 ?0 {
    ggplot(df2,aes('sepal length (cm)', 'sepal width (cm)', color='label'))/ ^3 F5 W) ~* M$ ~9 N9 w
    + geom_point()
' e# A( o% a2 o4 |0 V    + theme_matplotlib()+ V! j4 J% N$ M- o0 l
)- f% D# \9 S- s9 l* D

: W% ]! N0 Z. [: L这段代码进行了最终的K均值聚类和绘图。首先,创建一个KMeans对象并指定K值为3,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,创建一个新的DataFrame对象df2,其中包含原始数据集的前两列特征以及聚类结果的标签。然后,导入plotnine库,并使用其提供的函数绘制散点图。通过指定x轴为花萼长度,y轴为花萼宽度,颜色根据聚类标签进行分类。最后,使用theme_matplotlib函数设置绘图的主题样式为与matplotlib兼容的样式。
/ O: m+ D1 ^8 ]/ y3 A3 S希望这个逐行解释对你有所帮助!如果你还有其他问题,请随时提问。. }7 V7 G4 \" d7 m
4 ~2 U" j, A$ K8 Q

" i8 o6 m! }$ E( V6 K; W- ?1 P. g$ ]* W7 r0 s( S

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, 2025-6-26 14:08 , Processed in 0.304187 second(s), 54 queries .

回顶部