均值聚类算法。
聚类是对数据空间中数据对象进行分类,位于同一类中的数据对象之间的相似度较大,而位于不同类之间的数据对象差异度较大。聚类是一种无监督学习,能自动对数据集进行划分。常见的聚类算法:
k-means,dbscan,cure等算法。
k均值聚类算法:
第一步:选k个初始聚类中心,z1(1),z2(1),…zk(1),其中括号内的序号为寻找聚类中心的迭代运算的次序号。聚类中心的向量值可任意设定,例如可选开始的k个模式样本的向量值作为初始聚类中心。
第二步:逐个将需分类的模式样本按最小距离准则分配给k个聚类中心中的某一个zj(1)。
假设i=j时,其中k为迭代运算的次序号,第一次迭代k=1,sj表示第j个聚类,其聚类中心为zj。
第三步:计算各个聚类中心的新的向量值,zj(k+1),j=1,2,…,k
求各聚类域中所包含样本的均值向量:
其中nj为第j个聚类域sj中所包含的样本个数。以均值向量作为新的聚类中心,可使如下聚类准则函数最小:
在这一步中要分别计算k个聚类中的样本均值向量,所以称之为k-均值算法。
第四步:若 ,j=1,2,…,k,则返回第二步,将模式样本逐个重新分类,重复迭代运算;
若 ,j=1,2,…,k,则算法收敛,计算结束。
ii**。1. sonar数据。
clc, clear
sonar = csvread('e:\power\专业课程\大作业们\')
aa, bb]= size(sonar);
data1= sonar( (1: (floor(aa/2)) 1: bb-1 );划分前一半的数据作为第一类。
data2= sonar( (floor(aa/2): aa) )1: bb-1); 划分后一半的数据作为第二类。
p1=randsample(1:floor(aa/2), 1);
p2=randsample(floor(aa/2)+1:aa, 1);
y1= sonar(p1, 1:bb-1); 第一类的均值。
y2= sonar(p2, 1:bb-1); 第二类的均值。
for iii=1:500
num1= 0;
num2= 0;
sum1= zeros(1, bb-1);
sum2= zeros(1, bb-1);
for ii=1:aa
y11= sqrt( (sum( (y1- sonar(ii, 1:bb-1)).2 ))
y22= sqrt( (sum( (y2- sonar(ii, 1:bb-1)).2 ))
if (y11> y22)
sum2= sum2+ sonar(ii, 1:bb-1);
num2= num2+1;
l(ii)= 2;
elsesum1= sum1+ sonar(ii, 1:bb-1);
num1= num1+1;
l(ii)= 1;
endend %算出整体到所认为的均值之间的欧式距离。
找到离它距离近的数据作为与它一样的类别。
sum1= sum1/num1;
sum2= sum2/num2;
y1= sum1;
y2= sum2;
endnumber1 = 0;
number2 = 0;
for ii= 1:aa
if(l(ii)- sonar(ii, bb)==1)
number1 = number1+1;
elseif(l(ii)- sonar(ii, bb)==1)
number2= number2+1;
endend
correctate1to2= 1- number1/aa
correctate2to1= 1- number2/aa
2. wdbc数据。
clc; clear;
m = load('e:\power\专业课程\大作业们\')
aa, bb] =size(m);
wdbc= m(:,3:bb);
wdbc(:,bb-1)= m(:,2);
aa, bb]= size(wdbc);
data1= wdbc( (1: (floor(aa/2)) 1: bb-1 );划分前一半的数据作为第一类。
data2= wdbc( (floor(aa/2): aa) )1: bb-1); 划分后一半的数据作为第二类。
p1=randsample(1:floor(aa/2), 1);
p2=randsample(floor(aa/2)+1:aa, 1);
y1= wdbc(p1, 1:bb-1); 第一类的均值。
y2= wdbc(p2, 1:bb-1); 第二类的均值。
m1= wdbc(p1,bb)+j*p1
m2= wdbc(p2,bb)+j*p2
for iii=1:50
num1= 0;
num2= 0;
sum1= zeros(1, bb-1);
sum2= zeros(1, bb-1);
for ii=1:aa
y11= sqrt( (sum( (y1- wdbc(ii, 1:bb-1)).2 ))
y22= sqrt( (sum( (y2- wdbc(ii, 1:bb-1)).2 ))
if (y11> y22)
sum2= sum2+ wdbc(ii, 1:bb-1);
num2= num2+1;
l(ii)= 2; %如果数据距离y22近则把它划分到第二类去。
elsesum1= sum1+ wdbc(ii, 1:bb-1);
num1= num1+1;
l(ii)= 1; %如果数据距离y22近则把它划分到第1类去。
endend %算出整体到所认为的均值之间的欧式距离。
找到离它距离近的数据作为与它一样的类别。
sum1= sum1/num1;
sum2= sum2/num2;
hold on
plot(y11,'^
plot(y22,'*
y1= sum1;
y2= sum2;
endnumber1 = 0;
number2 = 0;
for ii= 1:aa
if(l(ii)- wdbc(ii, bb)==1)
number1 = number1+1; %数据认为在第二类被划分到第一类。
elseif(l(ii)- wdbc(ii, bb)==1)
number2 = number2+1; %数据认为在第一类被划分到第二类。
endend
counter1= 0;
counter2= 0;
correctrate1to2= 1- number1/aa;
counter1= counter1+ correctrate1to2
correctrate2to1= 1- number2/aa;
counter2= counter2+ correctrate2to1
iii. 实验结果分析。
1. sonar数据。
经过多次迭代后(其中迭代终止条件是迭代次数,此时数据收敛),将数据按均值分开,分成两类,我们将分好的两类数据于原始分类比较,找出它的错误率,将第一类划分到第二类的错误率和将第二类划分到第一类的错误率。上图是用1减去错误率后得到的识别率。
2. wdbc数据。
上图是wdbc数据的识别率,第二幅图是均值划分时,每一代的均值移动。从图中可以很好地看出来均值在不断的往好的方向移动。
同理,上图是wdbc数据的另一组识别率,第二幅图是均值划分时,每一代的均值移动。从图中可以很好地看出来均值在不断的往好的方向移动。可以发现有两组数据,因为k均值算法对初值的划分特别敏感。
所以他可能会有不同的划分,但是在多次实验中第二组数据次数比较多。所以wdbc稳定正确的划分识别率应该是第二组。
iv. 报告总结。
本次大作业让我学会了k-均值算法在模式识别中的应用,提高了编程能力,复习了迭代算法的思想。同样在这次报告中也发现了很多问题,在wdbc数据中发现了两组识别率,从图中可以看出来,可能因为是第一类和第二类的原始分类次序不同而导致的。k-均值算法对初值的要求很高,初值原本属于哪一类而被划分到哪一类,这些会影响到最终的划分,而不单单是迭代收敛的结果。
模式识别大作业
一。问题重述。利用fisher线性判别法和最近邻算法对sonar数据进行分类,并得出正确率。二。fisher线性判别法思路。用训练样本求出d维空间到一维空间的投影方向w,进而求出样本均值,进而可求出阈值t,带入测试样本得到投影点y,将y与t相比,即可进行分类判别。2.1 fisher准则函数中的基本...
模式识别大作业
作业1 用身高和 或体重数据进行性别分类 一 基本要求 用和的数据作为训练样本集,建立bayes分类器,用测试样本数据对该分类器进行测试。调整特征 分类器等方面的一些因素,考察它们对分类器性能的影响,从而加深对所学内容的理解和感性认识。具体做法 1 应用单个特征进行实验 以 a 身高或者 b 体重数...
模式识别大作业
一 题目。对sonar和wdbc中数据 如表1所示 进行分类,并将实验结果填入表2。不降维方法用邻近法,降维用fisher判别 表1 实验数据。表2实验结果 准确率 二 fisher线性判别法。fisher线性判别分析的基本思想 通过寻找一个投影方向 线性变换,线性组合 将高维问题降低到一维问题来解...