|
发表于 2022-4-17 22:56:12
|
显示全部楼层
本帖最后由 lassiter 于 2022-4-17 23:24 编辑
- function [basket,rate,J]=Kmean(P1,ZZ,signal)
- % 本程序求K-mean聚类
- % P1是点的集合,点的坐标用列向量表示
- % ZZ是初始聚类点,signal是点的标签信息,用来判断最后分类的正确率
- [~,N]=size(P1);ZZnew=ZZ; n=size(ZZ,2);E=10;
- % E是前一次聚类点与下一次聚类点的距离差
- while E>0
-
- ZZ=ZZnew;
- basket=cell(2,n); % 建立2行n列的“篮子”
- for i=1:N %遍历每个点,求每个点分别到初始聚类点的距离
- temp=P1(:,i);
- e=abs(temp*ones(1,n)-ZZ);
- e2=sum(e.*e,1); %欧氏距离
- %找到最近的聚类点,放入对应的“篮子”
- [~,b]=min(e2);
- basket{1,b}=[basket{1,b},temp];
- basket{2,b}=[basket{2,b},signal(1,i)];
- end
- %对“篮子”内的点集求均值,重新定义聚类点,重新计算聚类点的移动距离
- for i=1:n
- ZZnew(:,i)=mean(basket{1,i},2);
- end
- E=sum(sum(abs(ZZnew-ZZ)));
- end
- % 计算点集到新聚类点的距离差之和
- r=0;
- for i=1:n
- nn=size(basket{1,i},2);
- e=abs(ZZnew(:,i)*ones(1,nn)-basket{1,i});
- e2(i)=sum(sum(e.*e)); %欧氏距离
- end
- J=sum(e2);
-
- %根据标签信息计算分类正确率
- for i=1:n
- for j=1:n
- r(i,j)=sum(basket{2,i}==j);
- end
- end
- rate=sum(max(r'))/N;
- end
复制代码 |
|