您的位置:首页 > 编程语言

K-means自己写的代码,简单易懂,但是貌似效率有点低,没怎么优化

2014-04-19 10:49 399 查看
%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据
%我们只需要得到聚类中心即可,所以只返回一个矩阵变量

function [u]=k_means(data,N)
[m n]=size(data);   %m是数据个数,n是数据维数
ma=zeros(n);        %每一维最大的数
mi=zeros(n);        %每一维最小的数
u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置 N中心个数
index=zeros(m);   %m个数据的类别
for i=1:n
ma(i)=max(data(:,i));    %每一维最大的数
mi(i)=min(data(:,i));    %每一维最小的数
for j=1:N
u(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化,不过还是在每一维[min max]中初始化好些
end
end

for iteration =1:5  %我们就迭代5次就够了

%更新index矩阵,也就是标记矩阵
for i=1:m      %更新每个数据点标记
min1=Inf;
for j=1:N
dist=0;%计算欧式距离,此处为简便不加sqrt了
for k=1:n
dist=dist+(data(i,k)-u(j,k))*(data(i,k)-u(j,k));
end
if(dist<min1)
min1=dist;
min_num=j;
end
end
index(i)= min_num;%最后一次更新的min_num
end

%更新聚类中心
for i=1:N    %更新每个聚类中心
index_num=0;
index_sum=zeros(1,n);
for j=1:m
if(i==index(j))  %这个点属于第i个类
index_num=index_num+1;
index_sum=index_sum+data(index(j),:);
end
end
if(index_num~=0)
u(i,:)=index_sum/index_num;
end
end
end

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐