C均值聚类(更常用的叫法是K均值算法,K-means clustering)是经典的非监督数据处理方法。实验目的在于加深学生对C均值聚类原理的理解、掌握的算法的实现过程,体会其在模式识别中的作用。
1实验原理
设定 C个类别并选取 C个初始聚类中心,按最小距离原则将各样本分配到 C类中的某一类;之后不断地计算各类中心并调整各样本的类别,最终使各样本到其所属类别中心的距离平方之和最小。
2实验内容
处理男生和女生的身高、体重数据,分别保存在文件FEMALE.TXT、MALE.TXT中,利用C均值方法进行聚类分析。
3实验要求
- 同时采用身高和体重数据作为特征,类别数设为2,利用C均值聚类方法对数据进行聚类,并将聚类结果表示在二维平面上;尝试不同的初始值,观察聚类结果是否发生变化。
clc;clear;close all
F = importdata('FEMALE.TXT')'
M = importdata('MALE.TXT')'
%
figure(2); hold on;
plot(F(1,:),F(2,:),'bo',M(1,:),M(2,:),'r*');
data = [F M];
% data = importdata('cmeans_data.txt');
% data = data';
figure(1);
plot(data(1,:),data(2,:),'b+');
[d,N] = size(data);
P = randperm(N,2);
m1 = data(:,P(1));
m2 = data(:,P(2));
for k = 1:100
S1=[];
S2=[];
for i=1:N
cur = data(:,i);
d1 = (cur - m1)'*(cur - m1);
d2 = (cur - m2)'*(cur - m2);
if d1<d2
S1 = [S1, cur];
else
S2 = [S2, cur];
end
end
plot(S1(1,:),S1(2,:),'bo',S2(1,:),S2(2,:),'r*');
m1_new = mean(S1,2);
m2_new = mean(S2,2);
if (m1_new == m1) & (m2_new == m2)
s=sprintf('迭代%d次,聚类收敛;两类样本数量分别是%d、%d',k-1,size(S1,2),size(S2,2));
uiwait(msgbox(s,'提示','modal'));
break;
else
m1 = m1_new;
m2 = m2_new;
end
end
结果:迭代6次,聚类收敛,两类样本数目分别是59,41.
图表
- 改变类别数,分别进行两类、三类、四类、五类聚类,画出聚类指标与类别数之间的关系曲线,探讨是否可以确定出合理的类别数目。
我的其他专栏:
关注我了解更多