• matlab下K-means Cluster 算法实现


    一、概念介绍

          K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最有分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。

          K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

      k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,评价指标J的值没有发生变化,说明算法已经收敛。

    二、K-means算法

     它是一种迭代的算法:

          (1) 、首选随机选择k个点作为k个Cluster的重心;

          (2)、计算每个点到各个Cluster重心的距离,将它加入到最近的那个Cluster;

          (3)、重新计算每个Cluster的重心;

          (4)、重复过程2~3,直到各个Cluster重心在某个精度范围内不变化或者达到最大迭代次数。

    别看算法简单,很多复杂算法的实际效果或许都不如它,而且它的局部性较好,容易并行化,对大规模数据集很有意义;算法时间复杂度是:O(nkt),其中:n是聚类点个数k是Cluster个数,t是迭代次数。

       以上资料来源于网络摘抄;

    三 、matlab下实现K-means Cluster算法,Code如下:

    %matlab code
    % K-means Cluster
    %load data.dat
    x_data = 50*rand(1,100);
    y_data = 50*rand(1,100);;
    % x_data = data(:,1);
    % y_data = data(:,2);
    data_size = length(x_data);
    a = randsample(1:data_size,2);
    c1_x = x_data(a(1));
    c1_y = y_data(a(1));
    c2_x = x_data(a(2));
    c2_y = y_data(a(2));
    iter = 2;
    max_iter = 100;
    J_1 = 1;
    J_2 = 1;
    figure
    while J_1>0.1 && J_2>0.1 && iter<max_iter
        c1_xx = 0;
        c1_yy = 0;
        c2_xx = 0;
        c2_yy = 0;  
        c1_num = 0;
        c2_num = 0; 
        for k=1:data_size
            Distance1 = (x_data(k)-c1_x)^2 + (y_data(k)-c1_y)^2 ;
            Distance2 = (x_data(k)-c2_x)^2 + (y_data(k)-c2_y)^2 ;
            if Distance1 > Distance2
                lable(k) = 1;
                c2_xx = c2_xx+x_data(k);
                c2_yy = c2_yy+y_data(k);
                c2_num = c2_num+1;
            else
                lable(k) = 0;
                c1_xx = c1_xx+x_data(k);
                c1_yy = c1_yy+y_data(k);
                c1_num = c1_num+1;
            end
        end
        c1_xx = c1_xx/c1_num;
        c1_yy = c1_yy/c1_num;
        c2_xx = c2_xx/c2_num;
        c2_yy = c2_yy/c2_num;  
        J_1 = (c1_x-c1_xx)^2 + (c1_y-c1_yy)^2 ;
        J_2 = (c2_x-c2_xx)^2 + (c2_y-c2_yy)^2 ;
        c1_x = c1_xx;
        c1_y = c1_yy;
        c2_x = c2_xx;
        c2_y = c2_yy;
        iter = iter+3
        hold on
        plot(c1_x,c1_y,'bp','MarkerSize',iter)
        hold on
        plot(c2_x,c2_y,'mp','MarkerSize',iter)
    end
    
    % figure
    % plot(c1_x,c1_y,'kp','MarkerSize',iter+2)
    % hold on
    % plot(c2_x,c2_y,'rp','MarkerSize',iter+2)
    for idx = 1:data_size
        if lable(idx) == 1
            hold on
            plot(x_data(idx),y_data(idx),'ro')
        else 
            hold on
            plot(x_data(idx),y_data(idx),'ko')
        end
    end
    最后仿真效果展示如下:

          五角星代表聚类中心的变化情况,可见收敛的速度还是很快的。



  • 相关阅读:
    WPF样式之画刷结合样式
    年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
    30分钟学会XAML
    spring注解之@Import注解的三种使用方式
    大白话讲解Spring的@bean注解
    SpringBoot中的五种对静态资源的映射规则
    Spring注解之@Autowired、@Qualifier、@Resource、@Value
    Spring中如何使用工厂模式实现程序解耦?
    Spring注解之@Component、@Controller、@Service、@Repository
    Spring整合Redis
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205070.html
Copyright © 2020-2023  润新知