资源简介

基于Matlab实现: 模式识别 改进的K-Means++算法 实现模式分类

资源截图

代码片段和文件信息

%% --Document Description
% Created at 2019/03/21: by Feichao(Charles Fei)
% Version:  V1_0
% 程序功能描述:
%       基于K-Means++算法实现二维空间模式的聚类分析
%% --初始化
clc;
clear;
close all;

%样本数据生成
Num = 100;                                               %每个中心的样本个数
Diffusance = 0.4;                                        %样本扩散度

x1 = Diffusance*randn(2Num) + ones(2Num);                    %中心点(11)
x2 = Diffusance*randn(2Num) - ones(2Num);                    %中心点(-1-1)
x3 = Diffusance*randn(2Num) + [ones(1Num); -ones(1Num)];    %中心点(1-1)
x4 = Diffusance*randn(2Num) + [-ones(1Num);ones(1Num)];     %中心点(-11)
X = [x1 x2 x3 x4];                                             %样本数据

%参数设置与初始化
Num_Data=size(X2);      %样本数目
K=4;                     %聚类中心个数
S=zeros(KNum_Data);     %保存聚类结果
D=zeros(1K);            %距离
SUM=zeros(2K);          %样本和
N=zeros(1K);            %样本数
Z=zeros(2K);            %聚类中心
Z_Updated=zeros(2K);        %更新后的聚类中心
C=zeros(2K);       
m=0;
n=0;
%% --初始聚类中心的选择
Z(:1)=X(:randperm(Num_Data1));
for i=2:K
   D1=zeros(i-1Num_Data);  
   for j=1:Num_Data
       for k=1:i-1
           D1(kj)=pdist2(X(:j)‘Z(:k)‘‘Euclidean‘);
       end
       [D2(j)~]=min(D1(:j)); 
   end
   [~a]=max(D2);
   Z(:i)=X(:a); 
end
disp(‘初始聚类中心:‘)
disp(Z);
%% --显示原始数据
figure
scatter(X(1:)X(2:)‘k‘‘filled‘);
title(‘基于K-Means++算法的原始样本数据‘);
%% --迭代计算
figure
 while(n ~= 2*K)
    n=0;
    SUM=zeros(2K);
    N=zeros(1K);
    S=zeros(KNum_Data);
    for num=1:Num_Data
        for k=1:K
            D(k)=pdist2(X(:num)‘Z(:k)‘‘Euclidean‘);     %计算距离
        end
        [~i]=min(D);       %求最小值
        for k=1:K
            if(i==k)
                SUM(:k)=SUM(:k)+X(:num);
                N(k)=N(k)+1;
                m=N(k);
                S(km)=num;
                %绘制散点图 
                if(k==1)
                    scatter(X(1num)X(2num)‘r‘‘filled‘);
                end 
                if(k==2)
                    scatter(X(1num)X(2num)‘y‘‘filled‘);
                end
                if(k==3)
                    scatter(X(1num)X(2num)‘g‘‘filled‘);
                end
                if(k==4)
                    scatter(X(1num)X(2num)‘m‘‘filled‘);
                end
                hold on
            end
        end    
    end
     for k=1:K
         Z_Updated(:k)=SUM(:k)./N(k);        %新聚类中心
     end
     C=Z-Z_Updated;
     for i=1:2*K
         if(abs(C(i))<=0.01)
             n=n+1;
         end
     end
     Z=Z_Updated;
 end
scatter(Z(1:)Z(2:)‘k‘‘x‘);
title(‘基于K-Means++算法的聚类分析‘);
%结果输出
disp(‘聚类中心:‘)
disp(Z);


 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2879  2019-03-26 11:49  K_MeansPlusPlus.m

----------- ---------  ---------- -----  ----

                 2879                    1


评论

共有 条评论