K-Means聚类算法的4个步骤流程!

88 篇文章 1 订阅
78 篇文章 0 订阅

聚类分析是我们数据挖掘中常用的算法,常常用于没有分类,但又有相关相似性的样本研究当中,包括了K-Means、K-中心点和系统聚类三种算法,各自有各自的特点和适用环境。今天我们大圣众包根据网络资源详细介绍下K-Means聚类算法。

  首先,先看看K-Means聚类算法是什么?一般来说,K-Means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。

  k-means算法基本步骤

  (1)从数据中选择k个对象作为初始聚类中心;

  (2)计算每个聚类对象到聚类中心的距离来划分;

  (3)再次计算每个聚类中心

  (4)计算标准测度函数,之道达到最大迭代次数,则停止,否则,继续操作。

  K如何确定

  与层次聚类结合,经常会产生较好的聚类结果的一个有趣策略是,首先采用层次凝聚算法决定结果粗的数目,并找到一个初始聚类,然后用迭代重定位来改进该聚类。

  初始质心的选取

  常见的方法是随机的选取初始质心,但是这样簇的质量常常很差。

  (1)多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。

  (2)取一个样本,并使用层次聚类技术对它聚类。从层次聚类中提取K个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:样本相对较小;K相对于样本大小较小。

  (3)取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。

  距离的度量

  常用的距离度量方法包括:欧几里得距离和余弦相似度。欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大;空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间[-1,1],值越大,差异越小。

  质心的计算

  对于距离度量不管是采用欧式距离还是采用余弦相似度,簇的质心都是其均值。

  算法停止条件

  一般是目标函数达到最优或者达到最大的迭代次数即可终止。对于不同的距离度量,目标函数往往不同。当采用欧式距离时,目标函数一般为最小化对象到其簇质心的距离的平方和;当采用余弦相似度时,目标函数一般为最大化对象到其簇质心的余弦相似度和。

  空聚类的处理

  如果所有的点在指派步骤都未分配到某个簇,就会得到空簇。如果这种情况发生,则需要某种策略来选择一个替补质心,否则的话,平方误差将会偏大。

  (1)选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。

  (2)从具有最大SSE的簇中选择一个替补的质心,这将分裂簇并降低聚类的总SSE。如果有多个空簇,则该过程重复多次。

  适用范围及缺陷

  K-Menas算法试图找到使平方误差准则函数最小的簇。当潜在的簇形状是凸面的,簇与簇之间区别较明显,且簇大小相近时,其聚类结果较理想。对于处理大数据集合,该算法非常高效,且伸缩性较好。

  但该算法除了要事先确定簇数K和对初始聚类中心敏感外,经常以局部最优结束,同时对“噪声”和孤立点敏感,并且该方法不适于发现非凸面形状的簇或大小差别很大的簇。

  克服缺点的方法:使用尽量多的数据;使用中位数代替均值来克服outlier的问题。



在Python中实现K-means聚类算法通常包括以下步骤: 1. **导入库**: 首先需要导入必要的库,如`numpy`用于处理矩阵运算,`pandas`用于数据预处理,以及专门用于K-means的`sklearn.cluster`模块。 ```python import numpy as np from sklearn.cluster import KMeans import pandas as pd ``` 2. **数据准备**: 确保数据是数值型的,并将其整理成二维数组或者DataFrame格式。如果数据有缺失值,可以填充或删除。 ```python # 示例数据 data = pd.read_csv('your_data.csv') # 从CSV或其他源加载数据 X = data.values ``` 3. **设定K值**: 决定要将数据分成多少类别(群组),这通常是预先确定的。 ```python k = 3 # 假设我们要分为3类 ``` 4. **初始化质心**: 使用随机选择或者其他策略(如K-means++)来初始化K个聚类中心。 ```python kmeans = KMeans(n_clusters=k, init='random') initial_centers = kmeans.fit_predict(X) centroids = kmeans.cluster_centers_ ``` 5. **迭代优化**: 进行多次迭代直到收敛,每次迭代中: - 将每个点分配给最近的质心形成的聚类。 - 更新所有聚类的新质心(平均值)。 ```python while not kmeans.converged_: # 分配每个样本到最近的聚类 labels = kmeans.predict(X) # 更新质心 centroids = np.array([X[labels == i].mean(0) for i in range(k)]) kmeans.cluster_centers_ = centroids ``` 6. **结果输出**: 得到最终的聚类结果,包括每个数据点所属的聚类编号。 ```python predictions = kmeans.labels_ ``` 7. **评估聚类效果**: 可视化聚类结果,计算轮廓系数(Silhouette Coefficient)等指标来评估聚类的质量。 ```python # 可选:可视化聚类结果 import matplotlib.pyplot as plt plt.scatter(X[:, 0], X[:, 1], c=predictions, cmap='viridis') plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x') plt.show() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值