%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
K-means自己写的代码,简单易懂,但是貌似效率有点低,没怎么优化
最新推荐文章于 2021-03-20 07:02:30 发布