K-means聚类算法

k-means聚类算法


1、K-means聚类作用:
    K-means算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大

准则将靠近的点集归为一类,将相互紧凑且独立的点分为一类,从而对样本点进行分类。


2、K-means聚类算法流程:
(1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;
(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离dij;并根据最小距离重新对相应对象进行划分;
(3) 重新计算每个(有变化)聚类的均值(中心对象)
(4) 循环(2)到(3)直到每个聚类J不再发生变化为止

k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。

3、涉及命令和公式

(1)两点之间的距离 命令

Y=pdist(X);

Y = pdist(X,'metric') 

Y = pdist(X,distfun) 
Y = pdist(X,'minkowski',p) 
这里: 
X:为数据矩阵 
metric:各种距离方法 
‘euclidean’:欧几里得距离Euclidean distance (default) ‘seuclidean’:标准欧几里得距离. ‘mahalanobis’:马氏 距离 ‘cityblock’:绝对值距离 ‘minkowski’:明可夫斯基距离 


(2)求点群中心



(3)类类距离计算命令

Z=linkage(Y)

Y:为pdist输出的结果,即点点的距离矩阵。

 ‘method’:为计算类类间距离的方法。它们有: ‘single': 最短距离法 (系统内定) ‘complete’:最长距离法。 ‘average’:平均距离法。 ‘weighted’:加权平均距离法。 ‘centroid’:中心距离法。 ‘median’:加权重心法。


(4)聚类命令cluster

T=cluster(z,'cutoff',c)

Z:为linkage输出的层次数据。 

‘cutoff’:按某个值进行切割,值c取(0,1)之间的值。


(5)做聚类图命令
H=dendrogram(z,p)

p为原始节点个数的设置,p=0时显示全部点,系统内定显示30点。


4、算法MATLAB实现:

(1)调用MATLAB自带K-means算
      open kmeans
(2)编写代码
clear all;
close all;
clc;

%第一类数据
mu1=[0 0 ];  %均值
S1=[0.3 0 ;0 0.3];  %协方差
data1=mvnrnd(mu1,S1,50);   %产生高斯分布数据

%%第二类数据
mu2=[4 4];
S2=[0.3 0; 0 0.3];
data2=mvnrnd(mu2,S2,50);


%显示数据
plot(data1(:,1),data1(:,2),'+');
hold on;
plot(data2(:,1),data2(:,2),'+');
grid on;

%两类数据合成一个不带标号的数据类
data=[data1;data2];   %这里的data是不带标号的

%k-means聚类
[u re]=KMeans(data,2);  %最后产生带标号的数据,标号在所有数据的最后,意思就是数据再加一维度
[m n]=size(re);

%最后显示聚类后的数据
figure;
hold on;
for i=1:m 
    if re(i,3)==1   
         plot(re(i,1),re(i,2),'ro'); 
    else re(i,3)==2
         plot(re(i,1),re(i,2),'go'); 
   
    end
end
grid on;
function
%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据
function [u re]=KMeans(data,N)   
    [m n]=size(data);   %m是数据个数,n是数据维数
    ma=zeros(n);        %每一维最大的数
    mi=zeros(n);        %每一维最小的数
    u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置
    for i=1:n
       ma(i)=max(data(:,i));    %每一维最大的数
       mi(i)=min(data(:,i));    %每一维最小的数
       for j=1:N
            u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
       end      
    end
   
    while 1
        pre_u=u;            %上一次求得的中心位置
        for i=1:N
            tmp{i}=[];     
            for j=1:m
                tmp{i}=[tmp{i};data(j,:)-u(i,:)];
            end
        end
        
        quan=zeros(m,N);
        for i=1:m        %求解中心位置
            c=[];
            for j=1:N
                c=[c norm(tmp{j}(i,:))];
            end
            [junk index]=min(c);
            quan(i,index)=norm(tmp{index}(i,:));           
        end
        
        for i=1:N            %求各点到中心位置的距离平方和,如不变则算法收敛
           for j=1:n
                u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
           end           
        end
        
        if norm(pre_u-u)<0.001  %不断迭代直到位置不再变化
            break;
        end
    end
    
    re=[];
    for i=1:m
        tmp=[];
        for j=1:N
            tmp=[tmp norm(data(i,:)-u(j,:))];
        end
        [junk index]=min(tmp);
        re=[re;data(i,:) index];
    end
    
end

5、实验结果
聚类前随机产生点的分布:

聚类后:

6、算法总结:

①.算法流程

输入:聚类个数k,以及 n个数据。   

输出:满足方差最小标准的k个聚类。
 (1)从n个数据对象任意选择k个对象作为初始聚类中心
   (2)计算每个对象与聚类中心的距离;并根据最小距离重新对相应对象进行划分
   (3)重新计算每个聚类的均值作为新的聚类中心
   (4)循环(2)到(3)直到每个聚类不再发生变化为止

②. 算法分析

  K-Means的优化目标可以表示为:

    
其中,x_n表示数据对象,μ_k表示中心点,r_nk在数据点n分配到类别k的时候为1,没有分配到类别k的时候为0。

整个算法通过迭代计算,找到合适的r_nk和μ_k来,使得J最小。

算法流程的第二步,固定μ_k,更新r_nk,将每个数据对象放到与其最近的聚类中心的类别中,自然这一步能够保证在固定μ_k的情况下,J的值降到了最小。
    算法流程的第三步,固定r_nk,更新μ_k,此时J对μ_k(实际上是μ_0,μ_1,...分别求导)求导并令结果等于零,得到:

      
    即,当新的中心点取每个类别中的中心值的时候,每个类别内部的标准距离下降最多。J是所有类别距离内部的距离之和,因此保证了的固定r_nk的情况下,J的值降到了最小。
    两个步骤,J的值都在下降,随着迭代次数增加J的值会下降到一个极小值。

③. 结束条件

 · 每个聚类内部元素不在变化,这是最理想的情况了。

 · 前后两次迭代,J的值相差小于某个阈值。
      · 迭代超过一定的次数


④算法优缺点:
优点:原理简单,实现容易,收敛速度快。

缺点:
1.算法复杂度高O(nkt)
2.不能发现非凸形状的簇,或大小差别很大的簇
3.需样本存在均值(限定数据种类)
4. 必须首先给出k(要生成的簇的数目),k值很难选择。事先并不知道给定的数据应该被分成什么类别才是最优的。 
5.对噪声和离群点敏感
6.最重要是结果不一定是全局最优,只能保证局部最优。
    改进方法:
k-means++算法
ISODATE算法

1、改进离群点的影响:
离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响。
2、初始聚类中心的选择:
通过在一开始给定一个适合的数值给k,通过一次K-means算法得到一次聚类中心。对于得到的聚类中心,根据得到的k个聚类的距离情况,合并距离最近的类,因此聚类中心数减小,当将其用于下次聚类时,相应的聚类数目也减小了,最终得到合适数目的聚类数。可以通过一个评判值E来确定聚类数得到一个合适的位置停下来,而不继续合并聚类中心。重复上述循环,直至评判函数收敛为止,最终得到较优聚类数的聚类结果。
3、对初始聚类中心的选择的优化:
首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点。或者选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。该方法对于k值的选择也是十分有效的。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值