一种基于改进k均值的谱聚类算法(matlab实现)

function [c]=APkspectclust(C,k,N)
%%%%%%%%%%%%%%%%%%%%%%
tic

%%%%%%%%%%%%%% For question 9 comment out the next 3 lines


gnd=zeros(0,0);
for i=1:k
    gnd=[gnd;ones(N(i),1)*i];
end
% allpts=[cluster1;cluster2];          %还是50*2的矩阵
goto=length(C);   
N=size(C,1);
M=size(C,2);
%goto=50
%%

    

%% compute A (step 1)


maxdist=0;
WW=zeros(N,N);
for i=1:N-1
       for j=i+1:N
           dist=norm(C(i,:)-C(j,:));
           WW(i,j)=dist;
           WW(j,i)=WW(i,j);
           if(dist>maxdist)
               maxdist=dist;
           else
               continue;
           end
       end
end

sigma=0.05*maxdist;

W1=WW.*WW;
S=exp(-W1/(2*sigma^2));
A=S-diag(diag(S));
    % W=-(WW-min(WW(:)))/(max(WW(:))-min(WW(:)));
    % W1=W.*W;
    % S=exp(-W1/(2*sigma^2));
    % A=S-diag(diag(S));

    % subplot(2,3,2)          %2*3列的画布
    % imagesc(A); colorbar;   %把矩阵的元素数按色彩对应到图上,并添加色标值
    %

    %% step 2
    D = diag(sum(A'));
    L=D^(-.5)*A*D^(-.5);
    % subplot(2,3,3)
    % imagesc(L); colorbar;


    %% step 3
    [X,di]=eig(L);     %特征向量,特征值
    [Xsort,Dsort]=eigsort(X,di);
    Xuse=Xsort(:,1:k);  %最大的两个特征值对应的2个特征向量
    % subplot(2,3,4)
    % imagesc(Xuse); colorbar;


    %% normalize X to get Y (step 4)
    Xsq = Xuse.*Xuse;
    divmat=repmat(sqrt(sum(Xsq')'),1,k);
    Y=Xuse./divmat;
    % subplot(2,3,5)
    % imagesc(Y); colorbar;

    %% step 5/6
   
   
     [c]=APkmeans(Y,k);

     kk=c;
     for i=1:k
         ci=find(kk==i);
     end
     
c = bestMap(gnd,c);       %calculate accuracy

AC = length(find(gnd == c))/length(gnd);
    
    
fprintf('the accuracy is %f\n',AC);
MIhat = MutualInfo(gnd,c);
fprintf('the NMI is %f\n',MIhat);

 

toc

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值