动态聚类算法之聚类分析基础和实现基于欧式距离的 K-means 聚类法matlab实现

1.聚类分析基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

function [ distance ] = step1_mission( v1, v2 )
    %%%%%%%%%% Begin %%%%%%%%%%
    [m,p]=size(v1);
    [n,p]=size(v2);
    distance=zeros(m,n);
    for mm=1:m
        for nn=1:n
            distance(mm,nn)=sqrt(sum((v1(mm,:)-v2(nn,:)).^2));
        end
    end
    %%%%%%%%%% End %%%%%%%%%%
end

2.基于欧式距离的 K-means 聚类法

在这里插入图片描述
在这里插入图片描述

function [output_c] = step2_mission( vs, init_c )
    % 读取样本个数,特征维度,初始化类心
    [sample_num,~] = size(vs);    % sample_num读取样本个数
    [center_num, center_d] = size(init_c);  % center_num类心个数,center_d 特征维度大小
    old_c = init_c;
    new_c = init_c;
    
    % K-means 算法迭代部分
    while 1
        % 计算样本到类心欧式距离,并根据欧式距离进行分类
        %%%%%%%%%% Begin %%%%%%%%%%
        for i=1:sample_num
            infer=99999;
            for j=1:center_num
                dist=euclidean_dist(vs(i,:),init_c(j,:));
                if dist<infer
                    infer=dist;
                    classify(i)=j;
                end
            end
        end
        %%%%%%%%%% End %%%%%%%%%%

        % 初始化新类心
        new_c = zeros(center_num, center_d);
        new_c_count = zeros(1,center_num);
        
        % 使用重心法计算计算新类心
        for idx = 1:sample_num
            new_c(classify(idx),:) = new_c(classify(idx),:) + vs(idx,:);
            new_c_count(classify(idx)) = new_c_count(classify(idx)) + 1;
        end
        new_c = new_c./((new_c_count')*ones(1, center_d));

        % 判断是否收敛,阈值为0.01,是则结束迭代,否则更新类心继续迭代
        %%%%%%%%%% Begin %%%%%%%%%%
        flag=1;
        for i=1:center_num
            for j=1:center_d
                if old_c(i,j)-new_c(i,j)>0.01
                    flag=0;
                end
            end
        end
        if flag
            break;
        else
            old_c=new_c;
        end
        %%%%%%%%%% End %%%%%%%%%%
    end
    
    % 返回聚类类心作为结果
    output_c = new_c;
    
end


function distance = euclidean_dist(v1, v2)
    % 请将任务一中计算欧式距离的语句补充于此
    %%%%%%%%%% Begin %%%%%%%%%%
    [m,p]=size(v1);
    [n,p]=size(v2);
    distance=zeros(m,n);
    for mm=1:m
        for nn=1:n
            distance(mm,nn)=sqrt(sum((v1(mm,:)-v2(nn,:)).^2));
        end
    end
    %%%%%%%%%% End %%%%%%%%%%
end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happylife_mini

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值