kmeans 聚类 k 值优化

kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略。

手肘法

核心思想

1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度;

2. 类别数越大,样本划分越精细,聚合程度越高,当类别数为样本数时,一个样本一个类,聚合程度最高;

3. 当k小于真实类别数时,随着k的增大,聚合程度显著提高,当k大于真实类别数时,随着k的增大,聚合程度缓慢提升;

4. 大幅提升与缓慢提升的临界是个肘点;

5. 评价聚合程度的数学指标类似 mse,均方差,是每个类别的样本与该类中心的距离平方和比上样本数;

示例代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
# 1 数据可视化
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
X = np.hstack((cluster1, cluster2)).T
plt.figure()
plt.axis([0, 5, 0, 5])
plt.grid(True)
plt.plot(X[:, 0], X[:, 1], ‘k.‘)
plt.show()

# 2 肘部法求最佳K值
K = range(1, 10)
mean_distortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    mean_distortions.append(
        sum(
            np.min(
                cdist(X, kmeans.cluster_centers_, metric=‘euclidean‘), axis=1))
        / X.shape[0])
plt.plot(K, mean_distortions, ‘bx-‘)
plt.xlabel(‘k‘)
font = FontProperties(fname=r‘c:\windows\fonts\msyh.ttc‘, size=20)
plt.ylabel(u‘平均畸变程度‘, fontproperties=font)
plt.title(u‘用肘部法确定最佳的K值‘, fontproperties=font)
plt.show()

输出手肘图

可以明显看出红色圆圈是个肘点。

缺点

1. 不是所有的数据都能呈现这样明显的肘点;

2. 单纯地以数据选择k值,可能脱离实际;

补充

在实际任务中,我们可能根据业务来确定 k 值,如区分男女,k=2,区分人种,k=3,黄黑白;

轮廓系数法

结合类内聚合度和类间分离度来评价聚类效果。

计算方法

1. 计算样本 i 到同簇内其他样本的平均距离 ai;【ai越小,说明该样本越应该被分到该簇,故可将 ai 视为簇内不相似度】

2. 计算簇内所有样本的 ai;

3. 计算样本 i 到其他簇内所有样本的平均距离 bi,并取min;【bi 视为 i 的类间不相似度,bi为i到其他类的所有bi中min,bi越大,越不属于其他类】

4. 样本 i 的簇内不相似度 ai 和类间不相似度 bi,计算轮廓系数

□ s_i 越接近1, 则说明样本 i 聚类合理。

□ s_i 越接近-1,说明样本 i 更适合聚到其他类

□ s_i 越接近0,则说明样本 i 在两个簇的边界上

这种方法计算量大,视情况使用。

参考资料:

https://blog.csdn.net/xiligey1/article/details/82457271

https://www.jianshu.com/p/f2b3a66188f1

原文地址:https://www.cnblogs.com/yanshw/p/10955809.html

时间: 2024-10-07 23:21:56

kmeans 聚类 k 值优化的相关文章

机器学习-KMeans聚类 K值以及初始类簇中心点的选取

[转]http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html 本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的

KMeans聚类 K值以及初始类簇中心点的选取 转

本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数. KMeans算法本

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ====================================================================== K-means算法分析与Python代码实现请参考之前的两篇博客: <机器学习实战>k

转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ======================================

SparkMLlib聚类学习之KMeans聚类

(一),KMeans聚类 k均值算法的计算过程非常直观: 1.从D中随机取k个元素,作为k个簇的各自的中心. 2.分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇. 3.根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数. 4.将D中全部元素按照新的中心重新聚类. 5.重复第4步,直到聚类结果不再变化. 6.将结果输出. (二),Spark下KMeans的应用 1,数据集下载:数据来源电影集ml-100k,解压后内容如下: 2,加载数据

Kmeans算法的K值和聚类中心的确定

0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果. 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2-3步直至新的质心与原质心相等或小于指定阈值,算法结束 参考Java代码

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛

如何选择K-Means中K的值

K-Means需要设定一个簇心个数的参数,现实中,最常用于确定K数的方法, 其实还是人手工设定.例如,当我们决定将衣服做成几个码的时候,其实就是在以 人的衣服的长和宽为为特征进行聚类.所以,弄清楚我们更在意的是什么,能够 引导选择更合适的K值. 有种方法能自动决定K值,也就是所谓的Elbow Method(DIVFRP层次聚类etc.). 它的idea是将不同K值及其相对应的cost function值画出来,将转折明显的地方K值设置 为最合适的K.如图: 但实际上,它并不是总是好用的.有时整个

【Python数据挖掘课程】 三.Kmeans聚类代码实现、作业及优化

这篇文章直接给出上次关于Kmeans聚类的篮球远动员数据分析案例,同时介绍这次作业同学们完成的图例,最后介绍Matplotlib包绘图的优化知识.        前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.Kmeans聚类数据分析及Anaconda介绍        希望这篇文章对你有所帮助,尤其是刚刚接触数据挖掘以及大数据的同学,同时准备尝试以案例为主的方式进行讲解.如果文章中存在不足或错误的地方,还请海涵