K-means聚类算法
来源:互联网 发布:软件管家官方下载安装 编辑:程序博客网 时间:2024/06/11 21:04
额…想了很久不知道写什么好。最后还是觉得写K-means聚类算法好了。
K-means聚类算法,也就是K均值算法,是基于原型的聚类(prototype-based clustering)中一种非常古老的,广泛使用的聚类算法。
粗略来说,K-means算法的大概流程如下:
顾名思义,K-means聚类算法,整个算法中有两个量非常重要,那就是K和means(均值)了。K是指使用算法者希望数据可以聚类成多少类,也就是所期望的的簇的个数,是需要人为设定的参数。而means指的是簇的均值向量,根据公式计算出来的量。
对于同一数据集,不同的K值输入,会导致完全不同的簇划分(不仅仅是簇数量的不同),例如:
K=2时的K-means聚类效果图
K=5时的K-means聚类效果图
(以上数据是用MLDemos软件随便乱点出来的)
很明显,K的取值不同,除了会导致划分的簇数量的不同,也可能会导致原本划分在不同簇变成划分在同一簇。
初始均值向量的选择在一定程度上决定了该聚类的迭代次数。一开始作为初始均值向量的K个样本,也称为初始质心,它们的选择,可以是人为主观选择,可以是随机选择,也可以是通过某种特定的方法选择。例如:
这种数据分布情况下,K=3时,初始质心的选择,人为主观选择或许是一种不错的决定(不是故意捣乱的话,都能选择到3个初始质心的大概位置吧)。
再例如:
对于这种不容易直观地看出聚类规律的数据分布,一般都是随机选择初始质心。
还有一些特殊的初始质心选择方法,这里就不一一举出。
而对于根据各样本和各均值向量之间的距离来划分簇这一步,代表着聚类的质量如何,其度量依据是采用误差平方和(Sum of the Squared Error,SSE),SSE的形式定义如下:
其中
SSE在一定程度上刻画了簇内样本围绕均值向量的紧密程度。它的值越小,则簇内样本相似度越高。
因为这个题目是今天才决定好要写的,有些问题由于时间关系还没解决好。所以,这里提出两个我还没想到怎么解决的问题,下次写出解决方法。
一:K-means聚类可能会产生空簇。由于K-means聚类是通过样本和均值向量的距离最短为簇划分依据的,那么就有可能出现没有任何一个样本划分进某一簇的情况,那样就会产生空簇,导致SSE的值偏大。例如:
(图中,黄、蓝、紫色区域代表空簇。当然,这个图是极端情况,样本数目小于K。)
二:虽然数据预处理经常是包括离群点(异常值)处理,但是有些特殊的情况下,离群点(异常值)比起正常的点(值)更有价值(例如保险欺诈?)。所以,有时候离群点(异常值)是不能剔除掉的。而进行K-means聚类时,不可剔除的离群点可能会导致SSE的值偏大。例如:
(图中绿色区域右上角的几个离群点里绿色区域质心距离遥远啊。)
最后,贴上K-means聚类算法的MATLAB实现(源代码来自《MATLAB数据分析与挖掘实战》,张良均、杨坦、肖刚、徐圣兵等著)
%% 使用K-Means算法聚类特征数据clear ;% 参数初始化inputfile = '../data/data.xlsx'; % 载入数据k = 3; % 聚类的类别iteration = 500 ; % 聚类最大循环次数distance = 'sqEuclidean'; % 距离函数%% 读取数据[num,txt]=xlsread(inputfile);data = num(:,2:end);%% 数据标准化data = zscore(data);%% 调用kmeans算法opts = statset('MaxIter',iteration);[IDX,C,~,D] = kmeans(data,k,'distance',distance,'Options',opts);%% 打印结果for i=1:k disp(['第' num2str(i) '组聚类中心为:']); disp(C(i,:));enddisp('K-Means聚类算法完成!');
- k-means聚类算法
- k-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- K-MEANS聚类算法
- k-means聚类算法
- K-means聚类算法
- 聚类算法 K-means
- K-means聚类算法
- K-means聚类算法
- K-means聚类算法
- 聚类算法:K-means
- K-means聚类算法
- K-means聚类算法
- 浅析观察者模式
- C++——对象创建的两种方式
- 基数排序
- ML初笔记
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds....
- K-means聚类算法
- 如何利用反射获取字段的数据
- i think i need a houseboat
- Socket编程服务端原理简单介绍
- HDU-5642 King's Order
- Android开发 二维码的生成
- 关于迭代器的一些总结
- nyoj613
- websocket资源收集