数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-21 10:57
标题: python实现k均值聚类
K均值聚类(K-means Clustering)是一种常见的聚类算法,它将数据点划分为预先指定数量的聚类。该算法使用迭代的方法,通过最小化样本点与所属聚类中心之间的距离来优化聚类结果。* F: z6 Y4 y& K6 l) @9 e
K均值聚类算法的步骤如下:
( Q7 ]8 i9 A. @6 k/ l  Q) t
% A- g: S( J9 o  A% s; {: J" Q% M1.随机选择K个初始聚类中心点(质心)。K代表要形成的聚类数量。1 b: h: x( t( B  r0 K
2.将数据点分配给最近的聚类中心,形成K个聚类。
6 E5 R2 Q( |% z( W+ q8 c3.计算每个聚类的新聚类中心,即将当前所属聚类中的样本点的均值作为新的聚类中心。
6 K5 E9 a5 C% t% p5 U4.重复步骤2和步骤3,直到满足某个停止条件,例如聚类中心不再发生变化或达到最大迭代次数。
% x8 v7 J  B! P+ T
  P& X# _% S' O- @- KK均值聚类算法的优点包括简单、易于实现,以及在大规模数据集上的高效性。然而,该算法对于初始聚类中心的选择敏感,并且对于非凸形状的聚类较为困难。& |( |5 A7 Z3 [) O+ {$ M0 H
在Python中,你可以使用scikit-learn库中的KMeans类来实现K均值聚类算法。该类提供了灵活的参数设置,例如聚类数量、初始聚类中心的选择方法等。
, R. B  u, n% w  f2 I* r逐行解释代码的含义:
, b( g- X; r' V- f* m9 W/ Q% Limport numpy as np
6 V. _1 G" p: e. r* m2 C& pimport pandas as pd/ O4 S/ n! z% h" |
import matplotlib.pyplot as plt+ x' t/ o. _  E( p* u
from sklearn.datasets import load_iris; b7 L& s# F8 k9 S& ?) Y1 v* t
from sklearn.cluster import KMeans
1 U! l+ x& ~" I/ wfrom sklearn.metrics import silhouette_score
; s! z, g, M3 a* e4 l" r% D8 H7 T/ H0 @! J* q" P( Z# D3 k, n$ [8 W
这些是导入所需的库。numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,sklearn.datasets中的load_iris用于加载鸢尾花数据集,sklearn.cluster中的KMeans用于K均值聚类,sklearn.metrics中的silhouette_score用于计算轮廓系数。" l9 V: X6 z; q2 J( {
df = pd.DataFrame(load_iris()['data'], columns=load_iris()['feature_names'])" \  L- R; o# y+ d  p$ o4 P

& G1 Z, x. O% \2 \- c这行代码使用load_iris函数加载鸢尾花数据集,并将数据存储到一个DataFrame对象df中。数据集中的每个样本具有4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。# P5 U3 P9 l3 p4 u- F
score_list = []
5 [8 G$ z7 u. g0 a9 w9 m  D3 g3 Ifor i in range(2, 10):- l: [" E+ Z( i% {& M
    model = KMeans(i)) j7 N/ V( H& G- j2 o* O2 q
    model.fit(df.iloc[:,:2])
: q, @8 P( i2 }) K: M) }0 W5 j- S    score_list.append(silhouette_score(df, model.labels_))
. D  f6 }  b9 k+ |$ Q1 E
, d" F5 P9 w+ U) v! Lplt.plot([i for i in range(2, 10)], score_list)9 `7 U8 M; c( p+ K+ R% g. j8 z# _! R
- a9 ]; B7 m, H: L+ Y
这段代码计算K取不同值时的轮廓系数,并绘制了K值与轮廓系数之间的曲线图。首先,循环从2到9遍历不同的K值。在每次迭代中,创建一个KMeans对象并指定K值,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,计算当前聚类结果的轮廓系数,并将其添加到score_list列表中。最后,使用matplotlib.pyplot绘制K值与轮廓系数之间的曲线图。
, f- C' i& y; O/ imodel = KMeans(3)
$ X" j' {9 L7 Y+ v; ~0 L8 q" mmodel.fit(df.iloc[:,:2]), G! T$ Q) @# p' O. t
df2 = df.iloc[:,:2].copy()- z  J+ @. G0 A; D  a8 r
df2['label'] = model.labels_
4 ~( |  I: G: h
9 y8 x! ?6 Q8 v$ i2 ffrom plotnine import *( k" x" T* c& w) A

+ r. X6 B! ?# |* G6 E(
! _. }$ X9 Z1 P4 M( @    ggplot(df2,aes('sepal length (cm)', 'sepal width (cm)', color='label'))
4 z; k  ^! j: a5 ]- i8 v    + geom_point()
( R) R# H$ D# V$ Z# S2 u: s    + theme_matplotlib()
2 b1 N- }  k7 X- G; X# k/ i" g, q)
4 Q7 g& C; C  j8 H. d2 E, I+ q# H0 N/ \# D7 I  z8 V0 F; Y, y  b/ w
这段代码进行了最终的K均值聚类和绘图。首先,创建一个KMeans对象并指定K值为3,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,创建一个新的DataFrame对象df2,其中包含原始数据集的前两列特征以及聚类结果的标签。然后,导入plotnine库,并使用其提供的函数绘制散点图。通过指定x轴为花萼长度,y轴为花萼宽度,颜色根据聚类标签进行分类。最后,使用theme_matplotlib函数设置绘图的主题样式为与matplotlib兼容的样式。
8 e3 j& B. v; E9 l' A) T4 x希望这个逐行解释对你有所帮助!如果你还有其他问题,请随时提问。0 h6 d* I' |4 Q; X
0 z) Y9 Y3 A# b3 {7 P1 k% Q
$ K- O3 m$ I  n
( Z0 g; V+ g5 x5 \

29.kmeans_clustering.py

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

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






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