数学建模社区-数学中国

标题: python实现k均值聚类 [打印本页]

作者: 2744557306    时间: 2024-3-21 10:57
标题: python实现k均值聚类
K均值聚类(K-means Clustering)是一种常见的聚类算法,它将数据点划分为预先指定数量的聚类。该算法使用迭代的方法,通过最小化样本点与所属聚类中心之间的距离来优化聚类结果。/ b5 x: T6 ^  v* _+ w
K均值聚类算法的步骤如下:) G0 B$ {# w# B; U6 B2 M. W/ M# ^( i

+ o* K+ g" D- r; m5 F1.随机选择K个初始聚类中心点(质心)。K代表要形成的聚类数量。
/ f( K9 O# O9 H" E6 _% k+ `/ O2.将数据点分配给最近的聚类中心,形成K个聚类。$ b6 p6 Y) W* J9 L, s
3.计算每个聚类的新聚类中心,即将当前所属聚类中的样本点的均值作为新的聚类中心。
, K) A+ |2 k$ m  R! t7 b4 y' B2 C4.重复步骤2和步骤3,直到满足某个停止条件,例如聚类中心不再发生变化或达到最大迭代次数。- u5 H, o4 }3 Y

  x) W  L1 v& e) vK均值聚类算法的优点包括简单、易于实现,以及在大规模数据集上的高效性。然而,该算法对于初始聚类中心的选择敏感,并且对于非凸形状的聚类较为困难。
, T+ @! k# u+ u1 ^/ D1 c在Python中,你可以使用scikit-learn库中的KMeans类来实现K均值聚类算法。该类提供了灵活的参数设置,例如聚类数量、初始聚类中心的选择方法等。( \/ H. x2 p. n
逐行解释代码的含义:
  [% _$ H) p, w& W6 Timport numpy as np- c8 d6 B3 ^+ k. Q1 L5 s
import pandas as pd
: C$ D9 S1 U. K# n  `. mimport matplotlib.pyplot as plt" l# m! I' P( ?2 z! G1 Y% `
from sklearn.datasets import load_iris
3 s6 I. f7 o( ]0 T1 [6 Q, Ffrom sklearn.cluster import KMeans/ t& p2 Q+ ~9 ^8 b
from sklearn.metrics import silhouette_score
3 B) g8 g" o- R( |2 r) u( ?: u% }1 G/ _7 _; K# b5 f) f1 g6 x
这些是导入所需的库。numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,sklearn.datasets中的load_iris用于加载鸢尾花数据集,sklearn.cluster中的KMeans用于K均值聚类,sklearn.metrics中的silhouette_score用于计算轮廓系数。& j5 h4 t0 s. n2 D3 W
df = pd.DataFrame(load_iris()['data'], columns=load_iris()['feature_names'])
: D+ u& @+ @9 b* N* o6 o6 _5 z& X* |- O+ S$ G7 E
这行代码使用load_iris函数加载鸢尾花数据集,并将数据存储到一个DataFrame对象df中。数据集中的每个样本具有4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。9 P. {- G; a9 |- [4 f+ o" m" O
score_list = []7 l9 ^+ I; k% i( m
for i in range(2, 10):
: T6 Y- M/ R5 c/ U+ R' P0 q( g* ~    model = KMeans(i)7 U/ Q" ?* C* Y  d! w0 s) e
    model.fit(df.iloc[:,:2])
7 c8 Z% E1 G+ T. C    score_list.append(silhouette_score(df, model.labels_))
0 V# [3 T6 f( Y; p# o' n0 y% \) q9 ?
8 M4 z# a! P# Q! Y2 E$ kplt.plot([i for i in range(2, 10)], score_list)8 m  r) [, E, u8 g5 }2 B; r

; A' t+ ^  u9 `. ^4 x7 h这段代码计算K取不同值时的轮廓系数,并绘制了K值与轮廓系数之间的曲线图。首先,循环从2到9遍历不同的K值。在每次迭代中,创建一个KMeans对象并指定K值,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,计算当前聚类结果的轮廓系数,并将其添加到score_list列表中。最后,使用matplotlib.pyplot绘制K值与轮廓系数之间的曲线图。! m, w  a! x0 Q. l: \, t, s
model = KMeans(3)! _8 V1 ^2 E, v! K
model.fit(df.iloc[:,:2])
# e7 r' O- z; Z1 p: vdf2 = df.iloc[:,:2].copy()
% ?2 Z! k$ C' Q/ }- kdf2['label'] = model.labels_
" _$ u4 J! l' B+ W/ H" [. p/ u
2 `, U" x  D1 ?/ I5 kfrom plotnine import *
6 d- n4 V4 g( p9 v/ k+ `
5 T% h; S* k5 e(  e& k  }8 L% H5 ?4 e* s& y
    ggplot(df2,aes('sepal length (cm)', 'sepal width (cm)', color='label'))
$ a( X* I( B9 z0 k  U* M    + geom_point()& G" T1 A/ y6 L2 s% E
    + theme_matplotlib()% W* m6 w5 A0 H8 h5 ]* ^* T# s
)
& h5 k8 [& {$ v
1 E  N5 S2 B) T2 ~/ C; O这段代码进行了最终的K均值聚类和绘图。首先,创建一个KMeans对象并指定K值为3,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,创建一个新的DataFrame对象df2,其中包含原始数据集的前两列特征以及聚类结果的标签。然后,导入plotnine库,并使用其提供的函数绘制散点图。通过指定x轴为花萼长度,y轴为花萼宽度,颜色根据聚类标签进行分类。最后,使用theme_matplotlib函数设置绘图的主题样式为与matplotlib兼容的样式。; {1 c. @; \3 S3 }3 t8 p
希望这个逐行解释对你有所帮助!如果你还有其他问题,请随时提问。& ~2 F3 a) X1 {: ~+ T  o
* F7 R. ]( P* Q/ ~3 |" e
% v/ Z; I& W5 y( e
( K% z' o* w8 T! s. ^0 |+ R  h2 X

29.kmeans_clustering.py

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

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






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5