K均值聚类
%%%%%%% 对给定的二维点集,利用Kmeans方法进行聚类
clc, clear all, close all
%% 1.数据导入
%%%构造一组数据,其分类数目从直观上比较明显
mu1 = [1 1];
Sigma1 = [0.5 0; 0 0.5];
mu2 = [3 3];
Sigma2 = [0.2 0; 0 0.2];
% rng(1); %%% 加了rng(1),使得每次运行程序时,种子固定,产生的随机数是一样的,绘出的图形是一样的
X = [mvnrnd(mu1,Sigma1,1000);mvnrnd(mu2,Sigma2,1000)]; %%%%%产生高斯分布数据。X是一个2000*2的矩阵,表示2000个二维点
%%%绘图示意
plot(X(:,1),X(:,2),'ko')
title('Scatter Plot')
xlim([min(X(:)) max(X(:))]) % Make axes have the same scale
ylim([min(X(:)) max(X(:))])
%% 2.聚类
e=0.01; %%%若聚类中心在迭代前后变化小于e,则跳出循环
iter = 1000; %%%最大迭代次数
[n,~]=size(X);%%%得到x的行数,即样本或向量的个数n
idx = zeros(n,1); %%%Idx(i)表示第i个点的类别,值为1或者2
temp=randperm(n,2);%%%产生2个n以内的随机整数
clusters=[X(temp(1),:);X(temp(2),:)] %%%在样本中随机取两点作为初始的两个聚类中心
new_clusters=zeros(2,2); %%%%迭代中的聚类中心,先设为0矩阵
%% 请在下述两行注释之间填写代码,针对给出的平面点集,把它们分为两类
m=2;
s=1;
D = zeros(2,n);
v1=clusters(1,:);
v2=clusters(2,:);
V1 = zeros(2,1000);
V2 = zeros(2,1000);
V1(:,2) = v1;
V2(:,2) = v2;
while(abs(V1(1,s) - V1(1,s+1)) > e || abs(V1(2,s) - V1(2,s+1) > e || abs(V2(1,s) - V2(1,s+1)) > e || abs(V2(2,s) - V2(2,s+1)) > e)||s