K-means聚类算法

来源:互联网 发布:软件管家官方下载安装 编辑:程序博客网 时间:2024/06/11 21:04

额…想了很久不知道写什么好。最后还是觉得写K-means聚类算法好了。

K-means聚类算法,也就是K均值算法,是基于原型的聚类(prototype-based clustering)中一种非常古老的,广泛使用的聚类算法。

粗略来说,K-means算法的大概流程如下:

Created with Raphaël 2.1.0输入样本集D、聚类簇数K选择K个样本作为初始均值向量means计算各样本与各均值向量的距离将距离各均值向量最近的样本分别划入相应的簇新旧均值向量是否相同?输出K个簇的划分用新均值向量代替旧均值向量yesno

顾名思义,K-means聚类算法,整个算法中有两个量非常重要,那就是K和means(均值)了。K是指使用算法者希望数据可以聚类成多少类,也就是所期望的的簇的个数,是需要人为设定的参数。而means指的是簇的均值向量,根据公式计算出来的量。

对于同一数据集,不同的K值输入,会导致完全不同的簇划分(不仅仅是簇数量的不同),例如:

K=2

K=2时的K-means聚类效果图

K=5

K=5时的K-means聚类效果图

(以上数据是用MLDemos软件随便乱点出来的)

很明显,K的取值不同,除了会导致划分的簇数量的不同,也可能会导致原本划分在不同簇变成划分在同一簇。

初始均值向量的选择在一定程度上决定了该聚类的迭代次数。一开始作为初始均值向量的K个样本,也称为初始质心,它们的选择,可以是人为主观选择,可以是随机选择,也可以是通过某种特定的方法选择。例如:

主观选择

这种数据分布情况下,K=3时,初始质心的选择,人为主观选择或许是一种不错的决定(不是故意捣乱的话,都能选择到3个初始质心的大概位置吧)。

再例如:

这里写图片描述

对于这种不容易直观地看出聚类规律的数据分布,一般都是随机选择初始质心。

还有一些特殊的初始质心选择方法,这里就不一一举出。

而对于根据各样本和各均值向量之间的距离来划分簇这一步,代表着聚类的质量如何,其度量依据是采用误差平方和(Sum of the Squared Error,SSE),SSE的形式定义如下:

SSE=i=1KxCidist(Ci,x)2

其中 dist 是欧几里得空间中两个对象之间的标准欧几里得距离L2 )。
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聚类算法完成!');
0 0
原创粉丝点击