在之前的模式识别研究中,判别函数J(.)已知的参数,即假设概率密度函数的参数形式已知。本节不考虑概率密度函数的确切形式,使用非参数化方法来解决判断函数。由于线性判断函数具有许多优良的特性,我们只考虑以下形式的判断函数:它们是x的每个重量的线性函数,或以x为自变量的某些函数的线性函数。在设计传感器之前,需要明确以下基本概念:
一、判别函数:是指由x的每个分量线性组合而成的函数:
如果样本有c类,则有c个判别函数,本节只讨论两类样本的分类。要求实现以下判断规则:
二、样本线性可分:即在特征空间中,多个样本可以用一个或多个线性分界面正确分离;对于两种样本点w1和w2.样本点集合表示:
,使用判别函数
来划分w1和w2.判断函数的权向量需要这些样本集来确定a,增加样本向量可以使用y,也就是说,增广权向量a,使得:
其中:
样本是线性的。下图中的第一张图是线性的,第二张图是不可分割的。所有符合条件的权向量都称为解向量。
解区限制一般:引入余量b,满足解向量要求:
余量b的加入在一定程度上可防止优化算法收敛到解区的边界。
三、传感器标准函数
这里考虑线性不等式结构
标准函数的问题,使标准函数J(.)为:
Y是被权向量a错分的样本集。JP(a*) = min JP(a) = 0 时,a*是解向量。这是感知器(Perceptron)准则函数。
1.基本传感器设计
梯度下降迭代算法可用于最小化传感器标准函数:
其中,k迭代次数,η调整步长。也就是说,下一次迭代的权向量是将当前时刻的权向量调整到目标函数的负梯度。
也就是说,在每一步迭代中,根据某个系数将错分样本叠加到权向量上。这样,就可以得到感知算法。
2.批处理感知器算法
3.固定增量感知器算法
一般来说,一次修改所有错误样本并不是最有效的方法,更常用的是每次只修改一个样本或一批样本的固定增量方法:
收敛分析:只要训练样本集是线性的,对于任何初始值 a(1) ,经过有限的迭代操作,算法必须收敛。当样本线性不可分割时,传感器算法不能收敛。
总结:感知器是最简单可以“学习”的机器,是解决线性可分的最基本方法。也是很多复杂算法的基础。感知器的算法的推广有很多种,如带裕量的变增量感知器、批处理裕量松弛算法、单样本裕量松弛算法等等。
以下是批处理感知器算法和固定增量感知器算法MATLAB为测试提供四组数据:
% 传感器算法的批处理
function BatchPerceptron(w1, w2)
figure;
plot(w1(:,1),w一、二、ro‘);
hold on;
grid on;
plot(w2(:,1),w2.b ‘);
% 所有训练样本都要求增加特征y
one = ones(10,1);
y1 = [one w1];
y2 = [one w2];
w12 = [y1; -y2]; % 标准化增加样本
y = zeros(size(w12,1),1); % 错分样本集y最初是零矩阵
% 初始化参数
a = [0 0 0]; % [0 0 0];
Eta = 1;
time = 0; % 收敛步数
while any(y<=0)
for i=1:size(y,1)
y(i) = a * w12(i,:)‘;
end;
a = a sum(w12(find(y<=0),a
time = time 1;%收敛步数
if (time >= 300)
break;
end
end;
if (time >= 300)
disp(目标函数不能在规定的最大迭代次数内收敛);
disp([‘批处理感知器算法的解矢量a为: ‘,num2str(a)]);
else
disp([当批处理感知器算法收敛时,解矢量a为: ‘,num2str(a)]);
disp([批处理感知器算法收敛步数k为: ‘,num2str(time)]);
end
在坐标中找到样本的集中区域,以便打印样本坐标图
xmin = min(min(w1(:,1)),min(w(:,1));
xmax = max(max(w1.max(w(:,1));
xindex = xmin-1:(xmax-xmin)/100:xmax 1;
yindex = -a(2)*xindex/a(3)-a(1)/a(3);
plot(xindex,yindex);
title(实现两类数据分类的‘批处理传感器算法’);
% 固定增量感知器算法
function FixedIncrementPerceptron(w1, w2)
[n, d] = size(w1);
figure;
plot(w1(:,1),w一、二、ro‘);
hold on;
grid on;
plot(w2(:,1),w2.b ‘);
% 所有训练样本都要求增加特征y
one = ones(10,1);
y1 = [one w1];
y2 = [one w2];
w12 = [y1; -y2]; % 标准化增加样本
y = zeros(size(w12,1),1); % 错分样本集y最初是零矩阵
% 初始化参数
a = [0 0 0];
Eta = 1;
% k = 0;
time = 0; % 收敛的步数
yk = zeros(10,3);
y = a * w12‘;
while sum(y<=0)>0
% for i=1:size(y,1)
% y(i) = a * w12(i,:)‘;
% end;
y = a * w12‘;
rej=[];
for i=1:2*n %这个循环计算a(K 1) = a(k) sum {yj被误分类} y(j)
if y(i)<=0
a = a w12(i,:);
rej = [rej i];
end
end
% fprintf(‘after iter %d, a = %g, %g\n‘, time, a);
% rej
time = time 1;
if ((size(rej) == 0) | (time >= 300))
break;
end
end;
if (time >= 300)
disp(目标函数不能在规定的最大迭代次数内收敛);
disp(固定增量感知器算法的解矢量a为: ‘,num2str(a)]);
else
disp(【固定增量感知器算法收敛时解矢量a为: ‘,num2str(a)]);
disp([固定增量感知器算法收敛步数kt为: ‘,num2str(time)]);
end
%找到样本在坐标中的集中区域,以便于打印样本坐标图
xmin = min(min(w1.min(w(:,1));
xmax = max(max(w1.max(w(:,1));
xindex = xmin-1:(xmax-xmin)/100:xmax 1;
% yindex = -a(2)*xindex/a(3)-a(1)/a(3);
yindex = -a(2)*xindex/a(3) - a(1)/a();
plot(xindex,yindex);
title(‘固定增量感知器算法实现两类数据的分类‘);
close all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 感知器实验
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w1 = [ 0.1 1.1;...
6.8 7.1;...
-3.5 -4.1;...
2.0 2.7;...
4.1 2.8;...
3.1 5.0;...
-0.8 -1.3;...
0.9 1.2;...
5.0 6.4;...
3.9 4.0];
w2 = [ 7.1 4.2;...
-1.4 -4.3;...
4.5 0.0;...
6.3 1.6;...
4.2 1.9;...
1.4 -3.2;...
2.4 -4.0;...
2.5 -6.1;...
8.4 3.7;...
4.1 -2.2];
w3 = [-3.0 -2.9;...
0.54 8.7;...
2.9 2.1;...
-0.1 5.2;...
-4.0 2.2;...
-1.3 3.7;...
-3.4 6.2;...
-4.1 3.4;...
-5.1 1.6;...
1.9 5.1];
w4 = [-2.0 -8.4;...
-8.9 0.2;...
-4.2 -7.7;...
-8.5 -3.2;...
-6.7 -4.0;...
-0.5 -9.2;...
-5.3 -6.7;...
-8.7 -6.4;...
-7.1 -9.7;...
-8.0 -6.3];
BatchPerceptron(w1, w2);
FixedIncrementPerceptron(w1, w3);