数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-21 10:57
标题: python实现k均值聚类
K均值聚类(K-means Clustering)是一种常见的聚类算法,它将数据点划分为预先指定数量的聚类。该算法使用迭代的方法,通过最小化样本点与所属聚类中心之间的距离来优化聚类结果。
1 S2 O2 F% p& x% `- N" q- K( n+ B8 zK均值聚类算法的步骤如下:
. I1 G/ j) T% P" L6 G6 f; r
; i8 j1 y2 B1 \2 Q1.随机选择K个初始聚类中心点(质心)。K代表要形成的聚类数量。
) ?$ i& Y' }) f9 I& G9 U8 n5 o2.将数据点分配给最近的聚类中心,形成K个聚类。
$ v: `; N2 j" r, v. A4 Q9 X4 F3.计算每个聚类的新聚类中心,即将当前所属聚类中的样本点的均值作为新的聚类中心。
5 b0 d7 U5 f) ~: b. Z& ?7 ]7 m8 m* _4.重复步骤2和步骤3,直到满足某个停止条件,例如聚类中心不再发生变化或达到最大迭代次数。
  ^: o5 p7 _9 l. e; i* q% P( Z- ~
. ^1 b, B# g. ]" q; x/ XK均值聚类算法的优点包括简单、易于实现,以及在大规模数据集上的高效性。然而,该算法对于初始聚类中心的选择敏感,并且对于非凸形状的聚类较为困难。
$ y' N, Q3 h) P, l8 @在Python中,你可以使用scikit-learn库中的KMeans类来实现K均值聚类算法。该类提供了灵活的参数设置,例如聚类数量、初始聚类中心的选择方法等。- g6 [/ N! V# l5 l% ~' {. L, b
逐行解释代码的含义:, t8 ~# z& y. o5 m
import numpy as np! q$ y. a. I3 ?0 Y" m1 S
import pandas as pd9 E6 C; R$ e4 j/ w7 U# Y
import matplotlib.pyplot as plt
6 K3 \2 v* b* e- g+ A) ?from sklearn.datasets import load_iris
; z( f$ a1 ?5 l$ [% Yfrom sklearn.cluster import KMeans
- W# `) t3 c& `, nfrom sklearn.metrics import silhouette_score
1 r* [' `  H8 \/ j; l3 r' Q6 d* t. N2 _  N* H& J  _3 M/ q
这些是导入所需的库。numpy用于数值计算,pandas用于数据处理,matplotlib.pyplot用于绘图,sklearn.datasets中的load_iris用于加载鸢尾花数据集,sklearn.cluster中的KMeans用于K均值聚类,sklearn.metrics中的silhouette_score用于计算轮廓系数。
$ }; F0 R! \) Y- m  N8 Rdf = pd.DataFrame(load_iris()['data'], columns=load_iris()['feature_names']): z4 L( f: N+ ~
8 F: N( Z# g8 X5 ~3 T! ^  D0 d
这行代码使用load_iris函数加载鸢尾花数据集,并将数据存储到一个DataFrame对象df中。数据集中的每个样本具有4个特征:花萼长度(sepal length)、花萼宽度(sepal width)、花瓣长度(petal length)和花瓣宽度(petal width)。
1 N( l) [. S: I/ sscore_list = []# v5 X, N1 m3 U
for i in range(2, 10):5 j! ?, k. H7 G7 y7 z) k% |8 D, b
    model = KMeans(i)1 l' ^7 d$ I  T& n' W
    model.fit(df.iloc[:,:2])9 D, h1 ~! P/ S
    score_list.append(silhouette_score(df, model.labels_))
" A; B; N! g$ J: @" g
2 D2 p# x1 i4 \: ~3 V/ ~plt.plot([i for i in range(2, 10)], score_list)- s/ j' Z. D- I; _) f
6 B# \6 M1 h1 K0 A+ Q" O# d
这段代码计算K取不同值时的轮廓系数,并绘制了K值与轮廓系数之间的曲线图。首先,循环从2到9遍历不同的K值。在每次迭代中,创建一个KMeans对象并指定K值,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,计算当前聚类结果的轮廓系数,并将其添加到score_list列表中。最后,使用matplotlib.pyplot绘制K值与轮廓系数之间的曲线图。1 _0 b1 V5 q: p7 N. Z. Q, V* X6 O
model = KMeans(3); ~/ ]! Q6 D' ~. D
model.fit(df.iloc[:,:2])2 s* X# B2 u1 K4 K+ F
df2 = df.iloc[:,:2].copy()
# B3 x' z2 u6 }, ?) S9 t$ kdf2['label'] = model.labels_* H: I  s$ \; q- w9 c8 S2 {

  s0 o. _4 q/ bfrom plotnine import *
- j$ k4 U6 L* y, {. S& q: h1 ]# ~& k) ?; d) Q$ `3 h
(
3 X, m9 c* Q6 j* I& i9 x    ggplot(df2,aes('sepal length (cm)', 'sepal width (cm)', color='label'))
! s: o  D4 t2 F+ h" P    + geom_point()% C2 g! ~& [9 [$ P  s5 m
    + theme_matplotlib()
$ S+ e5 o, `4 B) [5 S)) I% e1 v4 o0 D# |! H
3 ^/ O8 Z' c7 Z# G% f9 z/ {! x8 f
这段代码进行了最终的K均值聚类和绘图。首先,创建一个KMeans对象并指定K值为3,然后使用鸢尾花数据集的前两列特征进行聚类。接下来,创建一个新的DataFrame对象df2,其中包含原始数据集的前两列特征以及聚类结果的标签。然后,导入plotnine库,并使用其提供的函数绘制散点图。通过指定x轴为花萼长度,y轴为花萼宽度,颜色根据聚类标签进行分类。最后,使用theme_matplotlib函数设置绘图的主题样式为与matplotlib兼容的样式。
. y$ J8 H( p' W4 p8 C9 ~8 a希望这个逐行解释对你有所帮助!如果你还有其他问题,请随时提问。
% I( j, e/ G; F" v8 [
; L1 i7 z. W+ ?
: T  c( D$ j3 a) z- s' B0 g
1 B5 f% [" n2 i. z) f3 E. x* `3 F( g

29.kmeans_clustering.py

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

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






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