📄 ganzhiqi.m
字号:
% 姓名:郑筠 学号:S200502106 2006.3.9 %
%===============基于感知函数准则的线性分类器设计================
% 感知准则函数利用梯度下降算法求增广权向量的做法,可简单叙述为:
%任意给定一向量初始值a(1),第k+1次迭代时的权向量a(k+1)等于第k次的权向量
%a(k)加上被错分类的所有样本之和与q(k)的乘积。可以证明,对于线性可分的
%样本集,经过有限次修正,一定可以找到一个解向量a ,即算法能在有
%限步内收敛。其收敛速度的快慢取决于初始权向量a(1) 和系数q(k)。
close all;
%已知有两类数据w1和w1,二者的先验概率已知
P1=0.6;
P2=0.4;
%已知有两个样本空间w1和w2,这些点对应的三维坐标的分布情况是:
x1=[0.2331 1.5207 0.6499 0.7757 1.0524 1.1974
0.2908 0.2518 0.6682 0.5622 0.9023 0.1333
-0.5431 0.9407 -0.2126 0.0507 -0.0810 0.7315
0.3345 1.0650 -0.0247 0.1043 0.3122 0.6655
0.5838 1.1653 1.2653 0.8137 -0.3399 0.5152
0.7226 -0.2015 0.4070 -0.1717 -1.0573 -0.2099];
y1 =[2.3385 2.1946 1.6730 1.6365 1.7844 2.0155
2.0681 2.1213 2.4797 1.5118 1.9692 1.8340
1.8704 2.2948 1.7714 2.3939 1.5648 1.9329
2.2027 2.4568 1.7523 1.6991 2.4883 1.7259
2.0466 2.0226 2.3757 1.7987 2.0828 2.0798
1.9449 2.3801 2.2373 2.1614 1.9235 2.2604];
z1 =[0.5338 0.8514 1.0831 0.4164 1.1176 0.5536
0.6071 0.4439 0.4928 0.5901 1.0927 1.0756
1.0072 0.4272 0.4353 0.9869 0.4841 1.0992
1.0299 0.7127 1.0124 0.4576 0.8544 1.1275
0.7705 0.4129 1.0085 0.7676 0.8418 0.8784
0.9751 0.7840 0.4158 1.0315 0.7533 0.9548];
x2 =[1.4010 1.2301 2.0814 1.1655 1.3740 1.1829
1.7632 1.9739 2.4152 2.5890 2.8472 1.9539
1.2500 1.2864 1.2614 2.0071 2.1831 1.7909
1.3322 1.1466 1.7087 1.5920 2.9353 1.4664
2.9313 1.8349 1.8340 2.5096 2.7198 2.3148
2.0353 2.6030 1.2327 2.1465 1.5673 2.9414];
y2 =[1.0298 0.9611 0.9154 1.4901 0.8200 0.9399
1.1405 1.0678 0.8050 1.2889 1.4601 1.4334
0.7091 1.2942 1.3744 0.9387 1.2266 1.1833
0.8798 0.5592 0.5150 0.9983 0.9120 0.7126
1.2833 1.1029 1.2680 0.7140 1.2446 1.3392
1.1808 0.5503 1.4708 1.1435 0.7679 1.1288];
z2 =[0.6210 1.3656 0.5498 0.6708 0.8932 1.4342
0.9508 0.7324 0.5784 1.4943 1.0915 0.7644
1.2159 1.3049 1.1408 0.9398 0.6197 0.6603
1.3928 1.4084 0.6909 0.8400 0.5381 1.3729
0.7731 0.7319 1.3439 0.8142 0.9586 0.7379
0.7548 0.7393 0.6739 0.8651 1.3699 1.1458];
%三维空间样本的分布情况
figure(1);
subplot(1,2,1);
plot3(x1,y1,z1,'ro',x2,y2,z2,'b*');
title('图1:样本分布图(o:一类,*:二类)');
grid on;
fprintf('样本分布图如图1所示......\n');
%样本的规范化
x2=-x2;
y2=-y2;
z2=-z2;
%初始化
pre_a=[1 1 1];%初始化权值,取为行向量
k=1;%迭代步数
q=1;%初始化迭代系数
sum=[0;0;0];%初始化错分样本的总和,取为列向量
%计算第一次错分样本的总和
[m1,n1]=size(x1);%m1行数,n2列数
for i=1:(m1*n1)
temp=[x1(i);y1(i);z1(i)];
if(pre_a*temp<0)
sum=sum+temp;
end
end
[m2,n2]=size(x2);
for i=1:(m2*n2)
temp=[x2(i) ;y2(i); z2(i)];
if(pre_a*temp<0)
sum=sum+temp;
end
end
%计算a(1)
q=q/k;
a=pre_a+q*sum';
%跌代
while(max(abs(a-pre_a))>0.00001)
sum=[0;0;0];%sum清零
for i=1:(m1*n1)
temp=[x1(i);y1(i);z1(i)];
if(a*temp<0)
sum=sum+temp;
end
end
for i=1:(m2*n2)
temp=[x2(i);y2(i);z2(i)];
if(a*[x1(i);y1(i);z1(i)]<0)
sum=sum+temp;
end
end
%计算a(k+1)
pre_a=a;
k=k+1;
q=q/k;
a=pre_a+q*sum';
end
%输出迭代信息
fprintf('跌代了%d次,最终权值:',k);
a=a'%将a转化为列向量
%画投影图
shadow1=[];
for i=1:(m1*n1)
temp=a'*[x1(i);y1(i);z1(i)];
shadow1=[shadow1;temp];
end
shadow2=[];
for i=1:(m2*n2)
temp=a'*[x2(i);y2(i);z2(i)];
shadow2=[shadow2;temp];
end
subplot(1,2,2);
plot(shadow1,'ro');
grid on;
title('图2:投影图(横轴:序列数;纵轴:投影值)');
hold on;
plot(shadow2,'b*');
fprintf('投影分布图如图2所示......\n');
%计算分界域值点
mm1=[0];
for i=1:m1*n1
mm1=mm1+shadow1(i);
end
mm1=mm1/(m1*n1);%计算投影后一维空间的w1类样本均值
mm2=[0];
for i=1:m2*n2
mm2=mm2+shadow2(i);
end
mm2=mm2/(m2*n2);%计算投影后一维空间的w2类样本均值
Y0=(mm1+mm2)/2+log(P1/P2)/(m1*n1+m1*n2-2);
%输入测试数据,每列为一组测试数据
fprintf('测试数据如下(可更改):\n');
test =[-1.0000 -1.2000 -1.0000 0.2000 0.2300 1.2099
1.5000 -1.0000 -0.9000 1.5000 2.3300 1.2604
1.6000 -0.5500 -1.6800 1.8900 1.4300 1.1548]
c1=[];c2=[];g1=0;g2=0;%记数
temp=size(test,2);
shadow3=[];shadow4=[];
for i=1:temp
shadow=a'*test(:,i);
if(shadow<Y0)
shadow3=[shadow3;shadow];
c1=[c1;i];
g1=g1+1;
else
shadow4=[shadow4;shadow];
c2=[c2;i];
g2=g2+1;
end
end
fprintf('共%d组测试数据,第',temp);
c1=c1'
fprintf('组测试数据被判为w1类,共%d个\n',g1);
fprintf('第');
c2=c2'
fprintf('组测试数据被判为w2类,共%d个\n',g2);
fprintf('组测试数据的投影见图2绿点所示......\n');
plot(shadow3,'go');
plot(shadow4,'g*');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -