Kmeans聚类算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zengxiantao1994/article/details/73441922

Kmeans聚类算法

动态聚类算法

        任务:是将数据集划分成一定数量的子集,例如将一个数据集划分成3、4个子集等。因此要划分成多少个子集往往要预先确定,或大致确定,当然这个子集数目在理想情况能体现数据集比较合理的划分。

        要解决的问题是:  1、怎样才能知道该数据集应该划分的子集数目?

                                    2、如果划分数目已定,则又如何找到最佳划分?

        因为数据集可以有许多种不同的划分方法,需要对不同的划分作出评价,并找到优化的划分结果。由于优化过程是从不甚合理的划分到“最佳”划分,是一个动态的迭代过程,故这种方法称为动态聚类方法。

 

动态聚类方法的要点

        1.选定某种距离度量作为样本间的相似性度量;

        2.确定样本合理的初始分类,包括代表点的选择,初始分类方法的选择等;

        3.确定某种评价聚类结果质量的准则函数,以调整初始分类直至达到该准则函数的极值。

        以上三点是动态聚类方法的三个要素,其中初始划分只是为了使划分能从某个初始点开始,而相似度量计算方法对解决实际问题很重要,先从最简单的度量——数据之间的欧氏距离开始,然后再涉及其它相似性度量方法。第三个要素,即使用准则函数作为优化的评价是动态聚类方法的核心。

 

K- Means聚类算法

        K- Means是迭代动态聚类算法中的一种,其中K表示类别数,Means表示均值。

        顾名思义K-Means是一种通过均值对数据点进行聚类的算法。K-Means算法通过预先设定的K值及每个类别的初始质心对相似的数据点进行划分。并通过划分后的均值迭代优化获得最优的聚类结果。 


K- Means算法的关键问题

K值的选择

        K值是聚类结果中类别的数量。简单的说就是我们希望将数据划分的类别数。K值决定了初始质心的数量。K值为几,就要有几个质心。

        选择最优K值没有固定的公式或方法,需要人工来指定,建议根据实际的业务需求,或通过层次聚类(Hierarchical Clustering)的方法获得数据的类别数量作为选择K值的参考。这里需要注意的是选择较大的K值可以降低数据的误差,但会增加过拟合的风险。

初始质心(代表点)的选择方法

        1.凭经验选择代表点。根据问题的性质,用经验的办法确定类别数,从数据中找出从直观上看来是较合适的代表点。

        2.将全部数据随机地分为C类,计算各类重心,将这些重心作为每类的代表点。

        3.“密度”法选择代表点。这里的“密度”是具有统计性质的样本密度。一种求法是对每个样本确定大小相等的邻域(如同样半径的超球体),统计落在其邻域的样本数,称为该点“密度”。在得到样本“密度”后,选“密度”为最大的样本点作为第一个代表点,然后人为规定距该代表点距离外的区域内找次高“密度”的样本点作为第二个代表点,依次选择其它代表点,使用这种方法的目的是避免代表点过分集中在一起。

        4.从(c-1)聚类划分问题的解中产生C聚类划分问题的代表点。其具体做法是先从一类聚类的解找两聚类划分的代表点,再依次增加一个聚类代表点。对样本集首先看作一个聚类,计算其总均值,然后找与该均值相距最远的点,由该点及原均值点构成两聚类的代表点。依同样方法,对已有(c-1)个聚类代表点(由(c-1)个类均值点组成)找一样本点,使该样本点距所有这些均值点的最小距离为最大,这样就得到了第c个代表点。

确定初始划分的方法

        1.对选定的代表点按距离最近的原则将样本划属各代表点代表的类别。

        2.在选择样本的点集后,将样本按顺序划归距离最近的代表点所属类,并立即修改代表点参数,用样本归入后的重心代替原代表点,因此代表点在初始划分过程中作了修改。

        3.一种既选择了代表点又同时确定了初始划分的方法。规定一个正整数ε,选择


        4.先将数据标准化:



准则函数—误差平方和准则

        这个准则函数是以计算各类均值mi,与计算各类样本到其所属类均值点误差平方和为准则,若各类均值表示成:


        其中第i类集合为ci,其样本数目为Ni。

        此时误差平方和准则可表示成:


        其含义是各类样本与其所属样本均值间误差平方之总和。对于样本集的不同分类,导致不同的样本子集ci及其均值从而得到不同的Je值而最佳的聚类是使Je为最小的分类。


K-Means算法步骤


        总结来说就是:

        (1)、第一步是为待聚类的点寻找聚类中心;

        (2)、第二步是计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去;

        (3)、第三步是计算每个聚类中所有点的坐标平均值,并将这个均值作为新的聚类中心。

        反复执行(2)、(3),直到聚类中心不再进行大范围移动或者聚类次数达到要求为止。


K-Means算法实例

        例:以下是一组用户的年龄数据,将K值定义为2对用户进行聚类。并随机选择16和22作为两个类别的初始质心。

Data_Age = [15,15, 16, 19, 19, 20, 20, 21, 22, 28, 35, 40, 41, 42, 43, 44, 60, 61, 65];

CenterId1 =16,  CenterId2 = 22

(1)、计算距离并划分数据

        通过计算所有用户的年龄值与初始质心的距离对用户进行第一次分类。计算距离的方法是使用欧式距离。距离值越小表示两个用户间年龄的相似度越高。

 

第一次迭代:

Data_Age  =  [15,15, 16, 19, 19, 20, 20, 21, 22, 28, 35, 40, 41, 42, 43, 44, 60, 61, 65];

Distance(16)=  [1, 1, 0, 3, 3, 4, 4, 5, 6, 12, 19, 24, 25, 26, 27, 28,44, 45, 49];

Distance(22)=  [7, 7,6, 3, 3, 2, 2, 1, 0, 6, 13, 18, 19, 20, 21, 22, 38, 39,43];

Group1_(16)=  [15,15, 16];   Mean =15.33

Group2_(22)=  [19,19, 20, 20, 21, 22, 28, 35, 40, 41, 42, 43, 44, 60, 61, 65];  Mean = 36.25


(2)、使用均值作为新的质心

        将两个分组中数据的均值作为新的质心,并重复之前的方法,迭代计算每个数据点到新质心的距离,将数据点划分到与之距离较小的类别中。

第二次迭代:

Data_Age = [15,15, 15.33, 16, 19, 19, 20, 20, 21, 22, 28,35, 36.25, 40, 41, 42, 43, 44, 60, 61, 65];

Distance(15.33)=[0.33, 0.33, 0.67,3.67, 3.67, 4.67, 4.67, 5.67, 6.67, 12.67, 19.67, 24.67, 25.67, 26.67,27.67, 28.67, 44.67, 45.67, 49.67];

Distance(36.25)=[21.25, 21.25, 20.25, 17.25, 17.25, 16.25,16.25, 15.25, 14.25, 8.25, 1.25, 3.75, 4.75, 5.75,6.75, 7.75, 23.75, 24.75, 28.75];

Group1_(15.33)=[ 15, 15, 16, 19, 19, 20, 20, 21, 22];   Mean = 18.56

Group2_(36.25)=[ 28, 35, 40, 41, 42, 43, 44, 60, 61,65];  Mean = 45.90

第三次迭代:

Data_Age = [15,15, 16, 18.56, 19, 19, 20, 20, 21, 22, 28,35, 40, 41, 42, 43, 44, 45.90, 60, 61, 65];

Distance(18.56)=[3.56, 3.56, 2.56,0.44, 0.44, 1.44, 1.44, 2.44, 3.44, 9.44, 16.44, 21.44, 22.44, 23.44,24.44, 25.44, 41.44, 42.44, 46.44];

Distance(45.90)=[30.90, 30.90, 29.90, 26.90, 26.90, 25.90,25.90, 24.90, 23.90, 17.90, 10.90, 5.90, 4.90, 3.90,2.90, 1.90, 14.10, 15.10, 19.10];

Group1_(18.56)=[ 15, 15, 16, 19, 19, 20, 20, 21, 22, 28];   Mean = 19.50

Group2_(45.90)=[ 35, 40, 41, 42, 43, 44, 60, 61, 65];  Mean = 47.89

第四次迭代:

Data_Age = [15,15, 16, 19, 19, 19.50, 20, 20, 21, 22, 28,35, 40, 41, 42, 43, 44, 47.89, 60, 61, 65];

Distance(19.50)=[4.5, 4.5, 3.5,0.5, 0.5, 0.5, 0.5, 1.5, 2.5, 8.5, 15.5, 20.5, 21.5, 22.5, 23.5, 24.5,40.5, 41.5, 45.5];

Distance(47.89)=[32.89, 32.89, 31.89, 28.89, 28.89, 27.89,27.89, 26.89, 25.89, 19.89, 12.89, 7.89, 6.89, 5.89,4.89, 3.89, 12.11, 13.11, 17.11];

Group1_(19.50)=[ 15, 15, 16, 19, 19, 20, 20, 21, 22,28];   Mean = 19.50

Group2_(47.89)=[ 35, 40, 41, 42, 43, 44, 60, 61, 65];  Mean = 47.89


(3)、算法停止条件

       迭代计算每个数据到新质心的距离,直到新的质心和原质心相等,算法结束。


MATLAB中的kmeans函数

MATLAB中的kmeans函数采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小。

使用方法:

Idx = Kmeans(X,K)

[Idx, C] = Kmeans(X,K)

[Idc, C, sumD] = Kmeans(X,K)

[Idx, C, sumD, D] = Kmeans(X,K)

各输入输出参数介绍:

X---N*P的数据矩阵

K---表示将X划分为几类,为整数

Idx---N*1的向量,存储的是每个点的聚类标号

C---K*P的矩阵,存储的是K个聚类质心位置

sumD---1*K的和向量,存储的是类间所有点与该类质心点距离之和

D---N*K的矩阵,存储的是每个点与所有质心的距离

[┈] = Kmeans(┈,’Param1’,’Val1’,’Param2’,’Val2’,┈)

其中参数Param1、Param2等,主要可以设置为如下:

1、’Distance’---距离测度

‘sqEuclidean’---欧氏距离

‘cityblock’---绝对误差和,又称L1

‘cosine’---针对向量

‘correlation’---针对有时序关系的值

‘Hamming’---只针对二进制数据

2、’Start’---初始质心位置选择方法

   ‘sample’---从X中随机选取K个质心点

‘uniform’---根据X的分布范围均匀的随机生成K个质心

‘cluster’---初始聚类阶段随机选取10%的X的子样本(此方法初始使用’sample’方法)

Matrix提供一K*P的矩阵,作为初始质心位置集合

3、’Replicates’---聚类重复次数,为整数

 

MATLAB代码:

% KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。
% 然后按平均法重新计算各个簇的质心,从而确定新的簇心。一直迭代,直到簇心的移动距离小于某个给定的值。

% 随机获取200个点
X = [randn(50,2)+[-ones(50,1), +ones(50,1)]; randn(50,2)+[ones(50,1), ones(50,1)]; ...
        randn(50,2)+[ones(50,1), -ones(50,1)]; randn(50,2)+[-ones(50,1),-ones(50,1)]];
%{
    MATLAB中的kmeans函数采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小。
    使用方法:
        Idx = Kmeans(X,K)
        [Idx,C] = Kmeans(X,K)
        [Idc,C,sumD] = Kmeans(X,K)
        [Idx,C,sumD,D] = Kmeans(X,K)
    各输入输出参数介绍:
        X---N*P的数据矩阵
        K---表示将X划分为几类,为整数
        Idx---N*1的向量,存储的是每个点的聚类标号
        Ctrs---K*P的矩阵,存储的是K个聚类质心位置
        sumD---1*K的和向量,存储的是类间所有点与该类质心点距离之和
        D---N*K的矩阵,存储的是每个点与所有质心的距离

%}
opts = statset('Display','final');
[Idx,Ctrs,SumD,D] = kmeans(X,4,'Replicates',4,'Options',opts);
 
% 画出聚类为1的点。
% X(Idx==1,1),为第一类的样本的第一个坐标;X(Idx==1,2)为第一类的样本的第二个坐标
plot(X(Idx==1,1), X(Idx==1,2), 'r.', 'MarkerSize', 14);
hold on;
plot(X(Idx==2,1), X(Idx==2,2), 'b.', 'MarkerSize', 14);
hold on;
plot(X(Idx==3,1), X(Idx==3,2), 'g.', 'MarkerSize', 14);
hold on;
plot(X(Idx==4,1), X(Idx==4,2), 'y.', 'MarkerSize', 14);
hold on;
 
% 绘出聚类中心点,kx表示是交叉符
plot(Ctrs(:,1), Ctrs(:,2), 'kx', 'MarkerSize', 14, 'LineWidth', 4);

legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4', 'Centroids', 'Location', 'NW');
grid on;

%{
    [┈] = Kmeans(┈,’Param1’,’Val1’,’Param2’,’Val2’,┈)
    其中参数Param1、Param2等,主要可以设置为如下:
    1、'Distance'---距离测度
        'sqEuclidean'---欧氏距离
        'cityblock'---绝对误差和,又称L1
        'cosine'---针对向量
        'correlation'---针对有时序关系的值
        'Hamming'---只针对二进制数据
    2、'Start'---初始质心位置选择方法
        'sample'---从X中随机选取K个质心点
        'uniform'---根据X的分布范围均匀的随机生成K个质心
        'cluster'---初始聚类阶段随机选取10%的X的子样本(此方法初始使用’sample’方法)
        Matrix提供一K*P的矩阵,作为初始质心位置集合
    3、'Replicates'---聚类重复次数,为整数
%}


展开阅读全文

没有更多推荐了,返回首页