利用模拟退火提高Kmeans的聚类精度

利用模拟退火提高Kmeans的聚类精度

Kmeans算法是一种非监督聚类算法,由于原理简单而在业界被广泛使用,一般在实践中遇到聚类问题往往会优先使用Kmeans尝试一把看看结果。本人在工作中对Kmeans有过多次实践,进行过用户行为聚类(MapReduce版本)、图像聚类(MPI版本)等。然而在实践中发现初始点选择与聚类结果密切相关,如果初始点选取不当,聚类结果将很差。为解决这一问题,本博文尝试将模拟退火这一启发式算法与Kmeans聚类相结合,实践表明这种方法具有较好效果,已经在实际工作中推广使用。

K-MEANS算法:输入:聚类个数k,以及包含 n个数据对象的数据。输出:满足方差最小标准的k个聚类。

处理流程:

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

(2) 循环(3)到(4)直到每个聚类不再发生变化为止

(3) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;

(4) 重新计算每个(有变化)聚类的均值(中心对象)

1.1 Step 1

1.2 Step 2

1.3 Step 3

1.4 Step 4

1.5 Step 5

2 初始点与聚类结果的关系

K means的结果与初始点的选择密切相关,往往陷于局部最优。

2.1 例子

下面以一个实际例子来讲初始点的选择将影响聚类结果。首先3个中心点(分别是红绿蓝三点)被随机初始化,所有的数据点都还没有进行聚类,默认全部都标记为红色,如下图所示:

迭代最终结果如下:

如果初始点为如下:

最终会收敛到这样的结果:

3 解决方法

那怎么解决呢?一般在实际使用中,我们会随机初始化多批初始中心点,然后对不同批次的初始中心点进行聚类,运行完后选择一个相对较优的结果。这种方法不仅不够自动,而且有较大概率得不到较优的结果。目前,研究较多的是将模拟退火、遗传算法等启发式算法与Kmeans聚类相结合,这样能大大降低陷于局部最优的困境。下图就是模拟退火的算法流程图。

4 实战

“纸上得来终觉浅,绝知此事要躬行”,仅知道原理而不去实践永远不能深刻掌握某一知识。本人实现了基于模拟退火的Kmeans算法以及普通的Kmeans算法,以便进行比较分析。

4.1 实验步骤

1)首先我们随机生成二维数据点以便用于聚类。

2)基于原生的Kmeans得到的结果。

3)基于模拟退火的Kmeans得到的结果

4.2 结论

由上图的实验结果可以看出,基于模拟退火的Kmeans所得的总体误差准则结果为:19309.9。

而普通的Kmeans所得的总体误差准则结果为:23678.8。

可以看出基于模拟退火的Kmeans所得的结果较好,当然,此算法的复杂度较高,收敛所需的时间较长。

时间: 2024-11-07 20:00:03

利用模拟退火提高Kmeans的聚类精度的相关文章

【机器学习实战之三】:C++实现K-均值(K-Means)聚类算法

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类(类别体系是自动构建的).聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好.本文要介绍一种称为K-均值(K-means)聚类的算法.之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成. 在介绍K-均值之前,先讨论一席簇识别(cluster identification).簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些

提高C8051F350中ADC精度应注意的一些问题

提高C8051F350中ADC精度应注意的一些问题

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这些是多线程的基本原理. .NET 4.0以后对多线程的实现变得更简单了. 本节主要讨论.NET4.0多线程的新特性——使用Task类创建多线程. 读前必备: A. LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 B. 泛型          [.net 面向对象编程基础] (

k-means均值聚类算法(转)

4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量数据的时候,如果通过预处理使得数据满足分类算法的要求,则代价非常大,这时候可以考虑使用聚类算法.聚类属于无监督学习,相比于分类,聚类不依赖预定义的类和类标号的训练实例.本文首先介绍聚类的基础——距离与相异度,然后介绍一种常见的聚类算法——k均值和k中心点聚类,最后会举一个实例:应用聚类方法试

K-均值(K-means)聚类算法

聚类是一种无监督的学习,它将相似的对象归到同一个簇中. 这篇文章介绍一种称为K-均值的聚类算法,之所以称为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成. 聚类分析视图将相似对象归入同一簇,将不相似对象归到不同簇. 下面用Python简单演示该算法实现的原理: 函数loadDataSet先将文本文件导入到一个列表中,并添加到dataSet中,返回的结果即为需加载的训练数据. def loadDataSet(fileName): dataMat = [] fr =

如何利用工具提高工作效率

作为IT从业者,我每天的工作都是和电脑打交道,因此这几年来多少积累了些让自己受益的提高效率的工具,但一直没有系统地整理过这方面的经验.直到上周一个同事问我:怎么让在公司电脑上的工作同步到家里的电脑上,然后在家也可以把工作做好.我告诉了她可以用百度云盘以及有道云笔记等工具实现.因此我意识到很多对我来说已经稀疏平常的软件工具,其实对很多不擅长电脑技术的人来说,确是需要有人告诉他去了解并花点功夫去掌握的.科技存在的意义本应该就是改善人们生活的质量的,我希望做这个理念的倡导者和践行者,因此下面介绍一下我

基于K-means Clustering聚类算法对电商商户进行级别划分(含Octave仿真)

在从事电商做频道运营时,每到关键时间节点,大促前,季度末等等,我们要做的一件事情就是品牌池打分,更新所有店铺的等级.例如,所以的商户分入SKA,KA,普通店铺,新店铺这4个级别,对于不同级别的商户,会给予不同程度的流量扶持或广告策略.通常来讲,在一定时间段内,评估的维度可以有:UV,收订金额,好评率,销退金额,广告位点击率,转化率,pc端流量.手机端流量.客单价......等n多个维度,那么如何在这n多个维度中找到一种算法,来将我们的品牌划分到4个级别中呢?今天所讨论的K-means聚类算法是其

全面了解R语言中的k-means如何聚类?

下面将在iris数据集上演示k-means聚类的过程. 先从iris数据集中移除Species属性,然后再对数据集iris调用函数kmeans,并将聚类结果存储在变kmeans.result中. 在下面的代码中,簇的数目设置为3. iris2 <- iris iris2$Species <- NULL (kmeans.result <- kmeans(iris2, 3)) 将聚类结果与类标号(Species)进行比较,查看相似的对象是否被划分到同一个簇中. table(iris$Spec

利用Adaboost提高分类性能

Adaboost为一种集成算法,是对其他算法进行组合的一种方式. 本文将通过单层决策树分类器建立一个Adaboost优化算法,即利用多个弱分类器构建一个强分类器. 弱分类器:分类器性能比随机猜测要略好,但是也不会好太多. 强分类器:分类器性能比随机猜测好很多. 下面结合代码说明Adaboost算法原理和思路: 单层决策树是一种简单的决策树,仅基于单个特征来做决策. 首先加载简单的训练数据. def loadSimpleData(): dataMat = np.mat( [ [1.0,2.1],