使用matlab进行K-means聚类

本文通过Matlab实现K-means聚类算法,详细展示了如何生成数据、初始化聚类中心、计算距离并更新聚类中心的过程。通过迭代直至误差收敛,最终实现了对四组数据的有效聚类。

使用matlab对输入数据进行K-means聚类。算法的思想来自基于密度方法的聚类
在这里插入图片描述
在这里插入图片描述

clear;
close all;
clc;
k = 4;
step_Tolerance = 0.001;

%% 生成数据
mu1 = [20 20];
S1 = [10 0;0 10];
data1 = mvnrnd(mu1,S1,100);
mu2 = [80 80];
S2 = [20 0;0 30];
data2 = mvnrnd(mu2,S2,200);
mu3 = [20 80];
S3 = [20 0;0 10];
data3 = mvnrnd(mu3,S3,100);
mu4 = [80 20];
S4 = [20 0;0 10];
data4 = mvnrnd(mu4,S4,100);
data = [data1; data2; data3; data4];


% image = imread('data.png');
% image = image(:,:,1);
% [x,y]=find(image == 0);
% data=[x,y];

%% 画出原始数据
figure(1);
plot(data(:,1),data(:,2),'k.');
grid on
daspect([1 1 1]);
xlabel('x');ylabel('y');
title('原始输入点');
hold on;

%% 初始聚类结果
temp = randperm(size(data, 1));
for i = 1: k
    center(i,:) = data(temp(i),:);
    color(i,:) = [rand(),rand(),rand()];
end

for i = 1: k
    x_dist(1,:) = data(:,1) - center(i,1);
    y_dist(2,:) = data(:,2) - center(i,2);
    distance = sqrt(x_dist(1,:).^2 + y_dist(2,:).^2);  % 欧氏距离
    dist(:,i) = distance';
end
[mindist, cluster] = min(dist, [], 2);
err_rec(1) = mean(mindist);
disp(['误差err=',num2str(err_rec(1))]);
figure(2);
for i = 1: k
    index = cluster==i;
    plot(data(index, 1), data(index, 2), '.','Color',color(i,:),'MarkerFaceColor',color(i,:));
    hold on
    plot(center(i,1), center(i,2), 'k*');
end
hold off
grid on
daspect([1 1 1]);
pause(0.1);

iteration = 1;
while(1)
    for i = 1: k
        index = cluster==i;
        center(i,:) = mean(data(index, :));
        
        x_dist(1,:) = data(:,1) - center(i,1);
        y_dist(2,:) = data(:,2) - center(i,2);
        distance = sqrt(x_dist(1,:).^2 + y_dist(2,:).^2);  % 欧氏距离
        dist(:,i) = distance';
    end
    [mindist, cluster] = min(dist, [], 2);
    err_rec(iteration+1) = mean(mindist);
    
    h = figure(2);
    for i = 1: k
        index = cluster==i;
        plot(data(index, 1), data(index, 2), '.','Color',color(i,:),'MarkerFaceColor',color(i,:));
        hold on
        plot(center(i,1), center(i,2), 'k*');
    end
    hold off
    grid on
    daspect([1 1 1]);
    pause(0.1);
    drawnow
    
    disp(['迭代次数ieration=',num2str(iteration)]);
    disp(['误差err=',num2str(err_rec(iteration+1))]);
    
    if iteration > 3 && err_rec(iteration) - err_rec(iteration+1) < step_Tolerance
        disp('————————————————————————————');
        disp('结束聚类');
        break
    end
    
    iteration = iteration + 1;
end

figure;
plot(0:iteration,err_rec);
grid on
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值