模式识别大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式识别大作业
一、问题描述
现有sonar和wdbc这两个样本数据集,取一半数据作为训练样本集,其余
数据作为测试样本集,用c-means算法对所给数据进行聚类,并已知类別数为2,随机初始样本聚类中心,进行10次求解,并计算聚类平均正确率。
二、算法描述
C均值算法的基本思想是,通过迭代寻找C个聚类的一种划分方案,使得用这C个聚类的均值来代表相应各类样本时所得到的总体误差最小。
1、数据初始化:类别数c=2,样本类标trueflag(n,1)(其中n为样本个数);
2、初始聚类中心:用随机函数随机产生1~n中的2个数,选取随机数所
对应的样本为初始聚类中心(mmnow);
3、更新样本分类:计算每个样本到两类样本中心的距离,根据最小距离
法则,样本将总是分到距离较近的类别;
4、更替聚类中心:根据上一步的分类,重新计算两个聚类中心(mmnext);
5、判断终止条件:当样本聚类中心不再发生变化即mmnow==mmnext时,
转5);否则,更新mmnow,将mmnext附给mmnow,即mmnow=mmnext,
转2);
6、计算正确率:将dtat(i,1)与trueflag(i,1)(i=1~n)进行比较,统计正确
分类的样本数,并计算正确率c_meanstrue(1,ii)。(ii=1~10);
7、将上述过程循环10次,得到10次的正确率,并计算平均正确率ave。
三、实验数据
表1 实验数据
四、实验结果
注:表中准确率是十次实验结果的平均值
五、程序源码
对sonar分类(对wdbc分类的代码与之类似)
clc;clear;
accuracy = 0;
for i = 1:10
data = xlsread('sonar.xls');
data = data';
%初始划分2个聚类
rand(:,1:size(data,2)) = data(:,randperm(size(data,2))'); %使矩阵元素按列重排
A(:,1) = rand(:,1);
B(:,1) = rand(:,2); %选取代表点
m = 1;
n = 1;
for i = 3:size(rand,2)
temp1 = rand(:,i) - A(:,1);
temp2 = rand(:,i) - B(:,1);
temp1(61,:) = [];
temp2(61,:) = []; %去掉标号后再计算距离
if norm(temp1) < norm(temp2)
m = m + 1; %A类中样本个数
A(:,m) = rand(:,i);
else
n = n + 1; %B类中样本个数
B(:,n) = rand(:,i);
end
end
%划分完成
m1 = mean(A,2);
m2 = mean(B,2);
%计算Je
J = 0;
for i = 1:m
temp = A(:,i) - m1;
temp(61,:) = []; %去掉标号的均值
J = J + norm(temp)^2;
end
for i = 1:n
temp = B(:,i) - m2;
temp(61,:) = [];
J = J + norm(temp)^2;
end
test = [A,B];
N = 0; %Je不变的次数
while N < m + n
rarr = randperm(m + n); %产生1-208即所有样本序号的随机不重复序列向量
y = test(:,rarr(1,1));
if rarr(1,1) <= m %y属于A类时
if m == 1
continue
else
temp1 = y - m1;
temp1(61,:) = [];
temp2 = y - m2;
temp2(61,:) = [];
p1 = m / (m - 1) * norm(temp1);
p2 = n / (n + 1) * norm(temp2);
if p2 < p1
test = [test,y];
test(:,rarr(1,1)) = [];
m = m - 1;
n = n + 1;
end
end
else %y属于B类时
if n == 1
continue
else
temp1 = y - m1;
temp1(61,:) = [];
temp2 = y - m2;
temp2(61,:) = [];
p1 = m / (m + 1) * norm(temp1);
p2 = n / (n - 1) * norm(temp2);
if p1 < p2
test = [y,test];
test(:,rarr(1,1)) = [];
m = m + 1;
n = n - 1;
end
end
end
A(:,1:m) = test(:,1:m);
B(:,1:n) = test(:,m + 1:m + n);
m1 = mean(A,2);
m2 = mean(B,2);
%计算Je
tempJ = 0;
for i = 1:m
temp = A(:,i) - m1;
temp(61,:) = []; %去掉标号的均值
tempJ = tempJ + norm(temp)^2;
end
for i = 1:n
temp = B(:,i) - m2;
temp(61,:) = [];
tempJ = tempJ + norm(temp)^2;
end
if tempJ == J
N = N + 1;
else
J = tempJ;
end
end %while循环结束
%判断正确率
correct = 0;
false = 0;
A(:,1:m) = test(:,1:m);
B(:,1:n) = test(:,m + 1:m + n);
c = mean(A,2);
if abs(c(61,1) - 1) < abs(c(61,1) - 2) %聚类A中大多为1类元素
for i = 1:m
if A(61,i) == 1
correct = correct + 1;
else
false = false + 1;
end
end