前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现所有算法-K-means

Python实现所有算法-K-means

作者头像
云深无际
发布2022-08-05 11:44:14
3730
发布2022-08-05 11:44:14
举报
文章被收录于专栏:云深之无迹云深之无迹

Python实现所有算法-二分法

Python实现所有算法-力系统是否静态平衡

Python实现所有算法-力系统是否静态平衡(补篇)

Python实现所有算法-高斯消除法

Python实现所有算法-牛顿-拉夫逊(拉弗森)方法

Python实现所有算法-雅可比方法(Jacobian)

Python实现所有算法-矩阵的LU分解

Python实现所有算法-牛顿前向插值

Python实现所有算法-正割法(Secant)

Python实现所有算法-牛顿优化法

Python实现所有算法-音频过滤器.上

Python实现所有算法-音频过滤器.下(巴特沃斯)

K-means 算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,两个对象的距离越近,其相似度就越大。而簇是由距离靠近的对象组成的,因此算法目的是得到紧凑并且独立的簇。

假设要将对象分成 k 个簇,算法过程如下:

(1) 随机选取任意 k 个对象作为初始聚类的中心(质心,Centroid),初始代表每一个簇;

(2) 对数据集中剩余的每个对象根据它们与各个簇中心的距离将每个对象重新赋给最近的簇;

(3) 重新计算已经得到的各个簇的质心;

(4) 迭代步骤(2)-(3)直至新的质心与原来的质心相等或小于设定的阈值,算法结束。

注意!

(1) 在 K-means 算法 k 值通常取决于人的主观经验;

(2) 距离公式常用欧氏距离和余弦相似度公式,前者是根据位置坐标直接计算的,主要体现个体数值特征的差异,而后者更多体现了方向上的差异而不是位置上的,cosθ越接近 1 个体越相似,可以修正不同度量标准不统一的问题;

(3) K-means 算法获得的是局部最优解,在算法中,初始聚类中心常常是随机选择的,一旦初始值选择的不好,可能无法得到有效的聚类结果。

对于一堆数据,K 值(簇数)的最优解如何确定呢?常见的有“肘”方法

(Elbow method)和轮廓系数法(Silhouette Coeffient):

① “肘”方法:核心指标是 SSE(sum of the squared errors,误差平方和),即所有样本的聚类误差(累计每个簇中样本到质心距离的平方和),随着 K 的增大每个簇聚合度会增强,SSE 下降幅度会增大,随着 K 值继续增大 SSE 的下降幅度会减少并趋于平缓,SSE 和 K 值的关系图会呈现成一个手肘的形状,此肘部对应的 K 值就是最佳的聚类数。

② 轮廓系数法:结合聚类的凝聚度(Cohesion)和分离度(Separation)来考虑,凝聚度为样本与同簇其他样本的平均距离,分离度为样本与最近簇中所有样本的平均距离,该值处于-1~1 之间,值越大表示聚类效果越好。

以 iris 数据为例:

代码实现

由图看出拐点在 K=2 处,K=3 次之,iris 实际数据分成了三类。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档