这可能是我写的最后一个博客文章,谨记!
首先这是一个分类算法里面***最简单***的一个机器学习算法!
算法思想:
- 随机初始化C个类聚中心。确定样本点之间的距离计算公式(本文使用欧式距离,你也可以用马氏距离、Manhattan distance等);
- 按你采取的距离定义,计算每个样本点到各个类聚中心的距离,离哪一个中心近,就归为哪一个中心。这样把样本归完类后,再根据每个类的样本点就算类聚中心;
- 如果计算出来的新的类聚中心和之前的中心不同,则已新的类聚中心进行分类,即重复步骤2;否则停止迭代。分类结果和类聚中心即为我们所求。
-----------------------------我是分割线---------------------------------
你如果想在自己的工程中用这个算法,可以考虑使用MATLAB的kmean()这个function,简单高效率;
如果你想学习算法,建议还是老老实实敲一遍代码,也许你的代码执行效率和MATLAB提供的相差很大,但是,写一遍终归对自己有个交代。
算法代码如下:
%注意这里的data,我是读取的一个xlsx表,里面是要分类的数据,二维的
data = xlsread('C:\Users\Administrator\Desktop\实验6\实验数据.xlsx',1,'B2:E151');
C=2;%聚类中心个数
[M,N]=size(data);
%c=unifrnd(1,15,C,N); %随机产生C个聚类中心,存放在c里面 --初始中心
c=data(1:C,:); %用前三个样本点初始三个聚类中心
len = zeros(M,C);
result=zeros(M,1); %标记
realc =c; %计算得到的聚类中心
count=zeros(C,N+1); %计算聚类中心的中间量
while(true)
for i=1:M
for j=1:C
len(i,j)=norm(data(i,:)-c(j,:));
end
end
[dontCare,result]=min(len,[],2);
%重新计算类聚中心
for i=1:M
for j=1:C
if result(i,1)==j
for k=1:N
count(j,k)=data(i,k)+count(j,k);
end
count(j,end)=count(j,end)+1;
end
end
end
for i=1:C
if count(i,end) ==0
continue
end
for j=1:N
realc(i,j)=count(i,j)/count(i,end);
end
end
if isequal(c,realc)
break;
else
c=realc;
count(:,:)=0;
end
end
里面的result 存放的样本分类结果。初始化中心点选取的是样本集中的任意几个样本。
有什么意见和建议可以联系我。欢迎大家和我讨论。
我的邮箱:13659512310@163.com
顺便附上代码库:https://github.com/liAoI/