模式识别大作业

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档