Matlab实现Kmeans算法(每行代码标注详细注解)

本文主要为了完成平日作业,并进一步加深对算法的理解。也希望对来访的读者有所帮助。

目录

一、什么是Kmeans算法

二、Kmeans算法的意义

三、Kmeans算法代码解析

1.关键概念

2.大致思路

3.对照每行代码的详细注解

四、总结

总结


一、什么是Kmeans算法

        k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

二、Kmeans算法的意义

        K-means算法通常可以应用于维数、数值都很小且连续的数据集,比如:从随机分布的事物集合中将相同事物进行分组。它的应用有许多,比如文档分类器乘车数据分析IT警报的自动化聚类等许多方面。

三、Kmeans算法代码解析

1.关键概念

欧式距离公式:(计算其他点到不同中心点的距离,判断属于哪个簇类)

2.大致思路

(1)从N个数据文档(样本)随机选取K个数据文档作为质心(聚类中心)。
本文在聚类中心初始化实现过程中采取在样本空间范围内随机生成K个聚类中心。
(2)对每个数据文档测量其到每个质心的距离,并把它归到最近的质心的类。
(3)重新计算已经得到的各个类的质心。
(4)迭代(2)~(3步直至新的质心与原质心相等或小于指定阈值,算法结束。
本文采用所有样本所属的质心都不再变化时,算法收敛。

3.对照每行代码的详细注解

function [U, E_in] = KMeans(data, K)
[N, d] = size(data);
% init U
sampleIds = randsample(1:N, K, false); //从n个点中随机选择三个点作为中心点
U = data(sampleIds, :); //以这三个点为中心形成簇类
labels_u = zeros(N, 1); //初始换建立一个N行1列的零数组
stop = true; 
while stop //把true复制给stop,需要一直循环
 for i = 1:N //从第1个点一直到第n个点
 x = data(i, :); //读取第1个数据放到X里面
 % check label 
 label = 0; //初始化label为0,代表是第几个簇类
 dist = 0; //初始化dist距离为0
 for j = 1:K //计算到达三个中心点的距离,依次推断属于哪个簇类
 tmp_dist = sum((x-U(j, :)).^2); //计算欧式距离,因比较大小,不用开根号也行
 if label == 0 || tmp_dist < dist //如果是第一次计算lable=0或者此时的距离小于上一次计算出的距离
 label = j; //当前的点暂时属于第j个聚类
 dist = tmp_dist; //欧式距离更新为当前的更小值
 end 
 end //循环结束
 if labels_u(i) ~= label //如果第个i点不等于label
 stop = false; //继续循环
 end
 labels_u(i) = label; //第个i点属于第label个簇类
 end 
 if stop == true //退出循环
 break;
 end
 %update U //更新中心点
 new_U = zeros(K, d); //初始化中心点,并全部清零
 labels_count = zeros(K, 1); //统计不同簇类的个数
 for i = 1:N //遍历所有点
 label = labels_u(i); //提取出簇类标志
 new_U(label, :) = new_U(label, :) + data(i, :); //这行代码不太懂,所有标签及对应data数据之和
 labels_count(label) = labels_count(label) + 1; //属于相同簇类的加起来
 for i = 1:K%
 new_U(i, :) = new_U(i, :)/labels_count(i); //初始化的中心点除以每个聚类里面总的个数
 end
 U = new_U; //用新的U来代替
end
E_in = 0;
for i = 1:N //N个点需要重新遍历
 label = labels_u(i); //将label标签提取出来
 u = U(label, :); 
 E_in = E_in + norm(data(i)-u); //每一个点跟中心的距离,所有的距离应该是欧式距离的和
end
E_in = E_in/N; //欧式距离的和除以N,每个点距离的举止,表示聚合的效果
end

四、总结

以上就是对于Kmeans算法每行代码详细注解的全部内容啦,希望对大家有所帮助,快快收藏,好好学习这个算法吧!我也很乐意与读者进行探讨!

作者:高垚淼原文地址:https://blog.csdn.net/TaloyerG/article/details/123946300

%s 个评论

要回复文章请先登录注册