有一个K_means++算法的程序看不懂,希望可以给讲解一下 40C

clear
clc

fg_load=csvread('fg-load.csv');

data1=[];
data=[];

%%对风能进行归一化处理%%
[f_shuju,f_shujus]=mapminmax(fg_load(:,2)',0,1);

fg_load(:,2)=f_shuju';

for i=1:8760
data1=[data1 fg_load(i,:)];
end
clear i;

for i=1:365
data(i,:)=data1(1,i*72-71:i*72);%%data为365*72

end

N=4; %%k数目
[m n]=size(data); %m是数据个数,n是数据维数

ma=zeros(n); %每一维最大的数

mi=zeros(n); %每一维最小的数
u=zeros(N,n); %随机初始化,最终迭代到每一类的中心位置

%%k-means++算法确定初始聚类%%

u(1,:)=data(round(rand(1)*m),:);

dis=inf(m,N);

for i=2:N
for j=1:m
dis(j,i-1)=norm(data(j,:)-u(i-1,:));

diss(j)=min(dis(j,:));

end
rand_diss=rand(1)*sum(diss);
for k=1:m
rand_diss=rand_diss-diss(k);
if rand_diss<=0
u(i,:)=data(k,:);
break;
end
end

end

    jj=0;
while 1
    jj=jj+1
    pre_u=u;            %上一次求得的中心位置
    for i=1:N
        tmp{i}=[];      % 公式一中的x(i)-uj,为公式一实现做准备
        for j=1:m
            tmp{i}=[tmp{i};data(j,:)-u(i,:)];
        end
    end

    quan=zeros(m,N);
    for i=1:m        %公式一的实现
        c=[];
        for j=1:N
            c=[c norm(tmp{j}(i,:))];
        end
        [junk index]=min(c);
        quan(i,index)=norm(tmp{index}(i,:));           
    end

    for i=1:m
        for j=1:N
            if quan(i,j)>0
                quan(i,j)=1;
            end
        end
    end


    for i=1:N            %公式二的实现
       for j=1:n
            u(i,j)=sum(quan(:,i).*data(:,j))/sum(quan(:,i));
       end           
    end

    if norm(pre_u-u)<0.1  %不断迭代直到位置不再变化
        break;
    end

% if jj>100
% break;
% end
end

re=[];
for i=1:m
    tmp=[];
    for j=1:N
        tmp=[tmp norm(data(i,:)-u(j,:))];
    end
    [junk index]=min(tmp);
    re=[re;data(i,:) index];
end


%%反归一化处理%%
for i=1:24
    re(:,i*3-1)=mapminmax('reverse',re(:,i*3-1)',f_shujus)';
    u(:,i*3-1)=mapminmax('reverse',u(:,i*3-1)',f_shujus)';%%聚类结果
end

% re1=re(:,1:72)';
% re2=re(:,73)';
%

% [Sw,Sb] = scatter_mat(re1,re2);
%

% PFS=(trace(Sb)/(N-1))/(trace(Sw)/(m-N))

%

1个回答

K-means 思想很简单的 比如你分4类 最开始随机选4个点 作为4个类的中心点 然后计算其他所有点到这点的距离(一般取欧氏距离,二维数据就是两点的直线距离) 到哪个中心点最近就分为哪个类 循环了所有点后 每个类别都会有很多点
然后再平均一下每个类别的点 作为中心点 再循环上面的步骤不停的迭代 最后没什么变化就停止下来。
直接解释代码不知道怎么解释,可以根据这个思想,逐行看代码每一步是在对数据做什么事情,就明白了
而且k-means结果和最初的随机中心点有关系 一般matlab直接调用函数实现即可,matlab对初始的中心点选择是做了处理的。
希望能帮到你,手打的很累,可以参考下面的文章
https://blog.csdn.net/google19890102/article/details/26149927

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

1
K-means中有一句话看不懂
0
丢石头的游戏的一个算法的问题如何采用C语言的程序的编程的方法来实现的呢
0
因数的合并,真分数化简的一个算法,怎么利用的C语言的程序技术来实现代码的
0
数字连乘的一个算法问题,循环的计算用C语言的程序设计的办法
0
一个生日的推算的算法的问题,如何利用C语言的程序的设计来实现呢?
0
矩阵的优化的一个算法的问题怎么实现,用C语言的程序的编程的技术的实现
0
一个rank的分类的一个算法的问题,用了C语言的程序的设计怎么求解的
0
一个矩形构成的矩阵的算法问题,如何利用C程序的设计的语言的方式实现呢
0
一个对抗比赛中的寻最短路的算法问题,如何利用C程序语言编写的过程来实现的
0
数学上的一个大数计算的问题的算法构成,采用C语言的程序的设计的办法怎么做
0
建图取余判重的一个算法的实现的问题,怎么采用C语言程序编写技术的实现的过程,怎么做
0
一个比较特殊的文字的编辑的算法的实现,怎么利用C语言的程序的设计的思路来做
0
一个绘图填色的算法的计算问题,运用C语言的程序编写程序来实现的办法怎么做
0
最大公约数的计算的一个代码算法程序,看下怎么来修改和实现的,用C语言
0
QSC码的一个计算的问题,采用C语言的程序的设计的方式怎么来实现这个算法的
0
如何使用聚类算法K-means对karate经典数据集进行划分
0
机器人的比赛的一个算法问题,用到排列数,怎么用C语言的程序的编写来实现的
0
分层的等级排名的一个算法的综合使用,采用C语言的程序的编写的实现怎么做
0
累计求和之后的排序的算法的问题,如何利用C语言的程序的编写的思想来实现的
0
广度遍历算法在图的数据结构上的一个运用问题,怎么利用C程序的语言的形式实现?