K-means聚类算法

K-means聚类算法

1.1 题目的主要研究内容(宋体四号加粗左对齐)

  1. K-means算法原理推导并分析
  2. MATLAB自带K-means函数分析

(3)基于MATLAB的算法分析,使用轮廓SC来量化两种方法

1.2 题目研究的工作基础或实验条件

(1)Windows10

(2)MATLAB 2018

1.3 设计思想

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

K-mean算法步骤如下:

(1)随机选取K个样本为中⼼

(2)分别计算所有样本到随机选取的K个中⼼的距离

(3)样本离哪个中⼼近就被分到哪个中⼼

(4)计算各个中⼼样本的均值(最简单的⽅法就是求样本每个维度的平均值)作为新的中心

(5)重复(2)(3)(4)直到新的中⼼和原来的中⼼基本不变化的

时候,算法结束

1.4 流程图

         

1.5 主要程序代码

%% 原理推导K均值

[m,n]=size(data);%求出横纵坐标长度

cluster_num=4;%设置聚类数

cluster=data(randperm(m,cluster_num),:);%设定的初始中心

epoch_max=1000;%最大迭代次数(中心达不到阈值循环不会停)

therad_lim=0.001;%中心变化阈值(新的中心和前一个中心变化小于这个阈值)

epoch_num=0;

while(epoch_num%最大迭代次数判断

    epoch_num=epoch_num+1;

    for i=1:cluster_num

    distance=(data-repmat(cluster(i,:),m,1)).^2;

    distance1(:,i)=sqrt(sum(distance'));%计算每一个数据到每个中心的欧式距离

    end

    [~,index_cluster]=min(distance1');%找到每一行距离最小所在的位置

    for j=1:cluster_num

    cluster_new(j,:)=mean(data(find(index_cluster==j),:));%所有类别分别找出来,然后求平均值作为新的一类

    end

    if (sqrt(sum((cluster_new-cluster).^2))>therad_lim)%阈值的判断,新的中心和原来的中心

        cluster=cluster_new;

    else

        break;

    end

end

%% 画出聚类效果

figure(2)

subplot(2,1,1)

a=unique(index_cluster); %找出分类出的个数

C=cell(1,length(a));%不同的数据找出来,存在元胞里

for i=1:length(a)

   C(1,i)={find(index_cluster==a(i))};

end

for j=1:cluster_num%把每一类元胞里的数据取出来

    data_get=data(C{1,j},:);

    scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);%画散点,设置透明度,边缘透明度

    hold on%不同类别分别画出

end

plot(cluster(:,1),cluster(:,2),'kd','LineWidth',2);%画出聚类中心

hold on

sc_t=mean(silhouette(data,index_cluster'));%评价聚类好坏的指标(轮廓系数)

title_str=['原理推导K均值聚类','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_t)];

title(title_str)%加上图标题

%% MATLAB自带kmeans函数

subplot(2,1,2)

[index_km,center_km]=kmeans(data,cluster_num) ;%MATLAB自带kmeans函数

a=unique(index_km); %找出分类出的个数

C=cell(1,length(a));

for i=1:length(a)

   C(1,i)={find(index_km==a(i))};

end

for j=1:cluster_num

    data_get=data(C{1,j},:);

    scatter(data_get(:,1),data_get(:,2),100,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);

    hold on

end

plot(center_km(:,1),center_km(:,2),'kd','LineWidth',2);

hold on

sc_k=mean(silhouette(data,index_km));

title_str1=['MATLAB自带kmeans函数','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_k)];

title(title_str1)

1.6 运行结果及分析

可以看到由原理推导而得K均值效果和自带函数效果差不多。由于K均值算法初值随机,所以每次结果可能是不一样的,甚至有比较大的差别。所以才存在一些优化k均值的算法,主要是优化初始聚类点的选取。

A4纸,左侧装订

你可能感兴趣的:(1024程序员节,机器学习,分类,python,matlab)