学习笔记|模式识别|Kmeans聚类以及matlab中kmeans函数的使用

一、聚类介绍

聚类分析是指事先不了解每一个样本的类别或其他的先验知识,而唯一的分类根据是样本的特征,利用某种相似度度量的方法,把特征相同或相似的归为一类,实现聚类划分,聚类是一种无监督分类方法。同一个聚合类中的模式比不同聚合类中的模式更相似,从而对模式间的相互关系做出估计。聚类分析的结果可以被用来对数据提出初始假设,分类新数据,测试数据的同类型及压缩数据。

1、聚类的定义

在模式空间S中,若给定N个样本X1,X2,...,XN,聚类的定义是:按照相互类似的程度找到相应的区域R1,R2,...,RM,对任意Xi(i=1,2,...,N)归入其中一类,而且不会同时属于两类。

2、聚类准则

我们需要一种聚类准则来评判聚类的优劣,以便知道我们的聚类结果是否足够好。聚类的优劣是就某一种评价准则而言,很难有对各种准则都表现优良的聚类方法。

聚类准则的确定基本上有两种方法:

(1)试探法:根据所分类的问题,确定一种准则,并用它来判断样本分类是否合理。例如,以距离函数作为相似性的度量,用不断修改的阈值来探究对此种准则的满足程度,当取得极小值时,就认为得到了最佳划分。基于试探的聚类算法包括最临近规则的试探法、最大最小距离试探法和层次聚类试探法。

(2)规定一种准则函数,其函数值与样本的划分有关,当取得极小值时,就认为得到了最佳划分。

有一种简单而又广泛应用的准则,即误差平方和准则:

设有N个样本,分别属于类,设有Ni个样本的类,其均值为

然后求所有簇的误差平方和:

我们有很多种聚类方法可以将N个样本划分为M类,但是我们想要找到能使J值最小的那种方法。

经验表明,当各类样本都很密集,各类样本个数相差不大,而类间距离较大时,适合采用误差平方和准则。若各类样本数相差很大,类间距较小时,就有可能将样本数多的类一分为二,而得到的J值却比只有一类时更小,误以为得到了更优的划分,实际上是错误的划分。

常用的聚类方法有均值聚类、分层聚类和模糊聚类。

二、Kmeans方法介绍

K均值聚类,也叫K-means,它是一种迭代的改进探索法。基本思想是:首先把输入点分为K个初始化组,可以使用随机或者一些启发式数据,然后计算每组的中心点,根据中心点的位置把样本分到离他最近的中心,重新确定分组,再继续重复不断地计算中心并重新分组,直到样本不再改变分组(中心点位置不再改变)。

Kmeans的聚类准则函数是上面提到的误差平方和准则。

1、Kmeans算法基本步骤:

(1)有N个样本,用I表示迭代次数,初始I=1,若已知样本分属于K个类,选取K个初始聚合中心

(2)计算每个样本到聚合中心的距离

然后取距离最短的那个中心点所在的类别作为该样本的类别。

(3)计算K个新的聚合中心:

(4)若,则I=I+1,返回(2);否则,算法结束。

可以看到上面的算法步骤里面其实并没有使用误差平方和准则来决定算法是否该结束,而是根据中心点位置是否发生变化来决定。

接下来介绍初始分类的选取和调整的方法:

(1)成批处理法:先在样本中选取一批中心点,计算其他样本到中心点的距离,把样本归于最近的中心点,形成初始分类,再重新计算各中心。这种方法在每次计算各类中心点时所有样本都会参与计算。上面的方法就是这种。

(2)逐个处理法:先在样本中选取一批中心点,当计算完第一个样本时,把它归为最近的一类,形成新的分类,然后基于目前已经归好类的样本重新计算新的中心点,然后再计算第二个样本,对其归类。这种方法在每个样本归类后都会改变聚类中心,相比成批处理法在所有样本都归类后再计算新的中心点,这种方法则是在一个样本归类后就马上基于现有已经归类的样本计算新的中心点。

2、最佳初始分类K的选取

如果我们没有事先知道样本有多少类,那我们如何确定K呢?

我们可以令K逐渐增加,然后根据误差平均和来判断算法是否该停止。使用Kmeans,误差平均和J会随着K的增加而单调减少。最初由于K较小,随着K增大J会迅速减少,但当K增加到一定数值时,J的减少速度会变慢。我们将J的减少速度变缓慢的那个点称为拐点,在拐点处的K值就是最佳初始分类。

这个图也叫“肘子图”,在“肘子”那里就是拐点。

3、Kmeans的优缺点

优点:

(1)如果变量很大,Kmeans比层次聚类的计算速度更快

(2)与层次聚类相比,K均值可以得到更紧密的簇,尤其是对于球状簇

(3)大数据集合效率比较高

(4)当结果簇是密集的,簇与簇之间区别明显时效果较好

缺点:

(1)依赖K的初始值: K对最终结果的影响至关重要,经常发生得到次优划分的情况。给定合适的 K值,需要先验知识,且多次尝试不同的初始值。

(2)依赖初始中心点的选择:聚类结果受初始中心点的影响很大,不同的初始点选择会导致截然不同的结果,并且当按最近邻归类时,如果遇到与两个中心点距离相等的情况,不同的选择也会造成不同的结果。可以采用多次初始化来获得更好的结果。

(3)对噪声和离群点敏感:这类数据能够对误差平均和产生极大的影响。

三、matlab中使用kmeans函数对数据进行聚类

以下是《模式识别与人工智能(基于matlab)》的一段代码

clear all;
clc;
% 加载样本dataset,包含训练数据和测试数据,数据shape为[样本数,特征维数] %%
% 样本一共有4类
load('dataset.mat');
data = [A_test;B_test;C_test;D_test];

% 调用kmeans函数进行聚类分析
[IDX,C,SUMD,D] = kmeans(data,4); % K=4
 % IDX:聚类结果
 % C:聚类中心
 % SUMD:每一个样本到该聚类中心的距离和
 % D:每一个样本到各个聚类中心的距离
 
plot3(data(:,1),data(:,2),data(:,3),'*');
grid;
D = D';
minD=min(D);
index1 = find(D(1,:) ==min(D))
index2 = find(D(2,:) ==min(D))
index3 = find(D(3,:) ==min(D))
index4 = find(D(4,:) ==min(D))
line(data(index1,1),data(index1,2),data(index1,3),'linestyle', 'none','marker','*','color','g');
line(data(index2,1),data(index2,2),data(index2,3),'linestyle', 'none','marker','*','color','r');
line(data(index3,1),data(index3,2),data(index3,3),'linestyle', 'none','marker','+','color','b');
line(data(index4,1),data(index4,2),data(index4,3),'linestyle', 'none','marker','+','color','y');
title('Kmeans聚类图');
xlabel('第一特征座标');
ylabel('第二特征座标');
zlabel('第三特征座标');

聚类结果图:

命令行窗口的输出:


index1 =

    12    13    14    15    17    18    19    20    21    22    23    24


index2 =

     6     7     8     9    10    11


index3 =

    25    26    27    28    29    30


index4 =

     1     2     3     4     5    16

更多的Kmeans改进方法推荐看这篇文章:KMeans 算法(一)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章