K-means聚类算法
1.1 题目的主要研究内容(宋体四号加粗左对齐)
(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纸,左侧装订