K-means聚类算法

一、简介

    k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程,即存在有先验知识的训练数据集。
  k-means算法中的k代表类簇个数,means代表类簇内数据对象的均值(这种均值是一种对类簇中心的描述),因此,k-means算法又称为k-均值算法。k-means算法是一种基于划分的聚类算法,以距离作为数据对象间相似性度量的标准,即数据对象间的距离越小,则它们的相似性越高,则它们越有可能在同一个类簇。数据对象间距离的计算有很多种,k-means算法通常采用欧氏距离来计算数据对象间的距离。

二、K-means算法详解

2.1 详解

k-means算法以距离作为数据对象间相似性度量的标准,通常采用欧氏距离来计算数据对象间的距离。下面给出欧式距离的计算公式:
在这里插入图片描述
其中,D表示数据对象的属性个数。
  k-means算法聚类过程中,每次迭代,对应的类簇中心需要重新计算(更新):对应类簇中所有数据对象的均值,即为更新后该类簇的类簇中心。定义第k个类簇的类簇中心为Centerk,则类簇中心更新方式如下:
在这里插入图片描述
其中,Ck表示第k个类簇,|Ck|表示第k个类簇中数据对象的个数,这里的求和是指类簇Ck中所有元素在每列属性上的和,因此Centerk也是一个含有D个属性的向量。
    k-means算法需要不断地迭代来重新划分类簇,并更新类簇中心,对于迭代终止条件,可以设为当聚类中心不再改变,或者设定迭代次数T,当到达第T次迭代,则终止迭代,此时所得类簇即为最终聚类结果。

2.2 图示分析

下面用一组图来分析K-means算法如何执行:

    如上图所示,图(a)表示的是初始的数据集,假设k=2。在图(b)中,我们随机选择了两个k类所对应的类别质心(初始化),即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图( c )所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对当前标记为红色和蓝色的点分别求其新的质心,如图(d)所示,新的红色质心和蓝色质心的位置已经发生了变动。图(e)和图(f)重复了我们在图( c )和图(d)的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图(f)。
  当然在实际K-Mean算法中,我们一般会多次运行图( c )和图(d),才能达到最终的比较优的类别。

三、K-means算法思想

3.1 实现步骤

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法。其实现过程如下:
第一步:从文件中读取数据,点用元组表示;确定聚类个数k。
第二步:初始化k个聚类中心。在所获得的的样本区间范围内随机产生k个值作为初始质心。
第三步:对每个数据点进行分类,选择相似度最高的质心所在的簇作为该样本的类别,形成k个簇。
第四步:计算每个簇中所有点的平均值,更新聚类中心。
第五步:迭代3~4步,直至聚类中心不再更改或达到最大迭代次数,算法结束。

3.2 流程图

四、算法优缺点分析

4.1 优点

  1. 原理简单,容易实现。
  2. 当数据集是密集的,且簇与簇之间区别明显时,会有较好的效果。
  3. 算法的可解释度比较强。
  4. 主要需要调参的参数仅仅是簇数k。
  5. 收敛速度快。

4.2 缺点

  1. 需要指定K值,但是很多情况下K值难以估计。
  2. 采用迭代算法,可能只能得到局部最优解,而无法得到全局最优解。
  3. 应用到大规模数据集时会存在较大误差。
  4. 对噪音和异常点比较敏感。

五、代码实现与分析

5.1 训练数据集

选取50个样本作为本次的训练数据,每个样本有两个维度,分别用二维坐标图的x轴、y轴表示。

data.txt

1.2 6.1
3.5 4.4
3.6 3.7
2.6 8.2
2.8 7.1
3.0 6.2
2.5 5.6
8.0 9.0
8.2 8.2
9.3 7.9
7.4 7.1
3.1 6.4
3.9 8.9
3.7 6.8
6.8 8.0
2.0 4.2
2.1 5.0
2.3 3.8
8.1 9.5
8.5 10.4
7.6 8.5
8.6 7.3
7.7 8.8
1.8 7.9
1.5 9.0
1.7 3.3
0.9 6.0
0.4 4.1
7.0 10.0
1.7 8.7
1.3 8.0
2.8 8.6
2.2 8.9
2.1 7.3
2.5 9.2
2.2 6.5
3.4 8.5
8.1 1.3
8.5 2.4
8.8 3.3
9.0 1.2
10.7 2.9
7.9 3.7
7.5 2.5
8.5 0.6
10.8 1.6
9.2 0.5
6.8 2.0
8.5 3.6
10.0 1.7

在这里插入图片描述

5.2 matlab代码

初始化聚类中心:

function [center] = kCenter(dataSet,k)
[m,n] = size(dataSet);
center = zeros(k,n);
for j = 1:n
    minRowCol = min(dataSet(:,j));
    differ = max(dataSet(:,j))-min(dataSet(:,j));
    center(:,j) = minRowCol + rand(k,1)*differ; %随机生成k个聚类中心
end   
end

K-means核心算法实现:

A = load('data.txt');
center = k_means(A, 3);
function [ center ] = k_means( dataSet, k )  
[m,n] = size(dataSet);    %初始化聚类中心  
center = kCenter(dataSet, k);   
datab = zeros(m,1);%做一个m*1的矩阵,用于存储数据点所属的类别 
flag = 1;
while true
    if flag == 0 %当flag为0时,表示聚类中心不再更改,则算法结束
        break
    end 
  flag = 0;      
    %对所有数据点进行分类   
    for i = 1:m        
        minlength = inf;          
        minIndex = 0;           
        for j = 1:k   
             pA = dataSet(i,:);
             pB = center(j,:);
             dist =  (pA-pB)*(pA-pB)';%欧式距离
            if dist < minlength                  
                minlength = dist;                   
                minIndex = j;               
            end
        end
        if datab(i,1) ~= minIndex       % 若所属类别有变化,则表示有更改,置flag为1 
            flag = 1;               
            datab(i,1)=minIndex;           
        end
    end
    %计算各簇平均值,更改聚类中心
    for j = 1:k           
        total = zeros(1,n);          
        sum = 0;        
        for i = 1:m            
            if datab(i,1) == j                    
                total = total + dataSet(i,:);              
                sum = sum+1;               
            end
        end
        center(j,:) = total./sum;  
    end
end
hold on
 for i = 1:m     
     switch datab(i,1)     
         case 1               
             plot(dataSet(i,1), dataSet(i,2), '.r');    
         case 2               
             plot(dataSet(i,1), dataSet(i,2), '.g');           
         otherwise              
             plot(dataSet(i,1), dataSet(i,2), '.b');  
          title('最终聚类结果');
     end
 end
 plot(center(:,1),center(:,2),'+k');
end

5.3 结果分析

k=2时
在这里插入图片描述
k=3时
在这里插入图片描述
k=4时(多次运行,得到不同结果)
在这里插入图片描述
在这里插入图片描述
分析:由于样本数量较少,簇与簇之间区别较明显,所以设定的迭代终止条件为聚类中心不再改变,若样本数目较多的情况下可以设定最高迭代次数作为迭代终止条件。对于不同的k值,会得到不同的聚类结果,由于初始聚类中心是随机生成的,对最终结果影响较大,即使选定k值,运行多次也可能得到不同的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值