聚类分析|k-means聚类方法及其Python实现

0. k-means算法简介

k-means算法由MacQueen在1967年提出。是一种经典的基于划分的聚类方法。

划分方法(Partitioning Method)是基于距离判断样本相似度,通过不断迭代将含有多个样本的数据集划分成若干个簇,使每个样本都属于且只属于一个簇,同时聚类簇的总数小于样本总数目。

该方法需要事先给定聚类数以及初始聚类中心,通过迭代的方式使得样本与各自所属类别的簇中心的距离平方和最小,聚类效果很大程度取决于初始簇中心的选择。
K-means算法接受输入量k,然后将n个数据样本的样本集D划分为k个簇以便使所获得的聚类满足:
(1)同一簇中的数据样本相似度较高,而不同簇中的数据样本相似度较小。
(2)聚类相似度是利用各簇中数据样本的均值所获得一个“簇中心”(引力中心)来进行计算的。

1. k-means算法工作原理

  1. 数据样本分类
    从D中任意选择k个数据样本作为初始簇中心。对于所剩下其它数据样本,则根据它们与这些簇中心的相似度(距离),分别将它们分配给与其最相似的簇中心所代表的簇。
  2. 簇中心的调整
    计算每个所获新簇的簇中心(该簇中所有数据样本的均值)
  3. 不断重复这一过程直到标准测度函数开始收敛为止
    一般标准测度函数都采用均方差。
    假设待聚类的数据样本集 D D D ,将其划分为 k k k 个簇,簇 C C C的中心为 Z Z Z,定义准则函数 E E E:
    E = ∑ i = 1 k ∑ D i s ∈ C i D i s 2 ( Z i , D i s ) E=\sum^{k}_{i=1}\sum_{D_{is}\in C_i} Dis^2(Z_i,D_{is}) E=i=1kDisCiDis2(Zi,Dis)

其中 D i s 2 ( Z i , D i s ) Dis^2(Z_i,D_{is}) Dis2(Zi,Dis) Z i Z_i Zi与样本 D i s D_{is} Dis的距离。
一次迭代中产生的最佳样本集合的中心 Z Z Z成为下一次迭代的簇中心。

2. k-means算法流程

输入: 聚类个数k以及数据样本集D
输出: 满足方差最小标准的k个聚类
处理流程:
step1: 从 D D D中任意选择 k k k个数据样本作为初始簇中心;
step2: 根据簇中数据样本的平均值,将每个数据样本重新赋给最类似的簇;
step3: 更新簇的平均值,即计算每个簇中数据样本的平均值;
step4: 循环step2到step3直到每个聚类不再发生变化为止。

例: 设数据样本集合为D={1,5,10,9,26,32,16,21,14},将D聚为3类,即k=3。
随机选择前三个样本{1},{5},{10}作为初始簇类中心Z1、Z2和Z3,采用欧氏距离计算两个样本之间的距离。
第一次迭代:按照三个聚类中心分为三个簇{1}、{5}和{10,9,26,32,16,21,14}。对于产生的簇分别计算平均值,得到平均样本为1、5和18.3,作为新的簇类中心Z1、Z2和Z3进入第二次迭代。
第二次迭代:通过平均值调整数据样本所在的簇,重新聚类,即将所有数据样本分别计算出与Z1、Z2和Z3的距离,按最近的原则重新分配,得到三个新的簇:{1}、{5,10,9}和{26,32,16,21,14}。重新计算每个簇的平均值作为新的簇类中心。
依次类推,第五次迭代时,得到的三个簇与第四次迭代的结果相同,而且准则函数E收敛,迭代结束。
在这里插入图片描述

3. k–means算法的Python实现

KMeans函数格式:

KMeans(n_clusters=8, max_iter=300, min_iter=10, init='k-means++')

参数说明:
(1) n_clusters:要进行的分类的个数,即k的值,默认是8。
(2) max_iter:最大迭代次数,默认300。
(3) min_iter:最小迭代次数,默认10。
(4) init:有三个可选项:

‘k-means++’:使用k-means++算法,默认选项;
‘random’:从初始质心数据中随机选择k个观察值;
形如 (n_clusters, n_features) 并给出初始质心的数组形式的参数。

#利用k-means聚类算法实现鸢尾花数据(第3个和第4个维度)的聚类。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:,2:] #只取后两个维度
#绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='0')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()
estimator = KMeans(n_clusters=3)#构造聚类器
estimator.fit(X)#聚类
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='1')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='2')
plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='3')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()

在这里插入图片描述
在这里插入图片描述

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
聚类分析是一种无监督学习方法,用于将数据集中的样本划分为不同的簇。而K-means算法是一种常用的聚类分析方法之一。该算法的基本思想是将样本聚类成k个簇,具体的步骤如下: 1. 随机选取k个聚类质心点作为初始值。 2. 对于每一个样例i,计算其应该属于的类,即找到与样例i最近的质心,将其归为该类。 3. 对于每一个类j,重新计算该类的质心,即将该类中所有样例的均值作为新的质心。 4. 重复步骤2和步骤3,直到质心不再发生变化或达到预定的迭代次数。这时候,算法收敛,得到最终的聚类结果。 在聚类分析中使用K-means算法,需要确定聚类的簇数k,并通过迭代计算找到最佳的质心来实现样本的划分。 <span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Python机器学习实验-聚类-sklearn模块中的KMeans算法](https://download.csdn.net/download/weixin_63378697/88229147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [聚类算法:K-means聚类图像分割](https://download.csdn.net/download/weixin_38639642/13752303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皖山文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值