我正在复习一段来自多伦多感知器MATLAB代码的代码
代码如下:
function [w] = perceptron(X,Y,w_init)w = w_init;for iteration = 1 : 100 %<- 实际上,使用一些停止准则! for ii = 1 : size(X,2) %循环遍历训练集 if sign(w'*X(:,ii)) ~= Y(ii) %错误的决策? w = w + X(:,ii) * Y(ii); %然后将(或减去)此点添加到w end end sum(sign(w'*X)~=Y)/size(X,2) %显示错误分类率end
所以我正在阅读如何将此函数应用于数据矩阵X和目标Y,但是,不知道如何使用此函数,我理解,它返回一个权重向量,所以它可以分类。
你能给出一个例子并解释一下吗?
我尝试过
X=[0 0; 0 1; 1 1]Y=[1 0; 2 1]w=[1 1 1]Result = perceptron( X, Y, w )??? Error using ==> mtimesInner matrix dimensions must agree.Error in ==> perceptron at 15 if sign(w'*X(:,ii)) ~= Y(ii) Result = perceptron( X, Y, w' )??? Error using ==> neMatrix dimensions must agree.Error in ==> perceptron at 19 sum(sign(w'*X)~=Y) / size(X,2);
谢谢
感谢你的回答,我还有一个问题,如果我改变 Y = [0, 1],算法会发生什么?
所以,使用此感知器代码,任何输入数据都无法与 Y = [0,1] 一起使用,对吗?
—————————–编辑————————
还有一个问题,如果我想绘制划分两个类的线,我知道我们可以通过解决与权重相关的线性方程组来得到这条线,但是如何得到呢?我该怎么做?我正在尝试这样的事情
% 初始权重w_init = [ 1 1 1]';% 从感知器返回的权重wtag = perceptron(X,Y,w_init,15);% 连接两者Line = [wtag,w_init]% 求解线性系统,我这样做正确吗?rref(Line')% 绘制???
回答:
您应该首先了解每个输入的含义:
X
是示例的输入矩阵,大小为M x N,其中M是特征向量的维度,N是样本数。由于用于预测的感知器模型是Y=w*X+b
,因此您必须在X
中提供一个额外的维度,该维度是常数,通常设置为1
,因此b
项是“内置”到X
中。在下面的X
示例中,我将X
的最后一个条目设置为所有样本中的1
。Y
是来自X
的每个样本的正确分类(您希望感知器学习的分类),因此它应该是一个N维行向量 – 每个输入示例一个输出。由于感知器是一个二元分类器,因此它应该只有2个不同的可能值。查看代码,您会发现它检查预测的符号,这告诉您Y
的允许值应为-1,+1
(而不是例如0,1
)。w
是您尝试学习的权重向量。
所以,尝试使用以下方法调用该函数:
X=[0 0; 0 1; 1 1];Y=[1 -1];w=[.5; .5; .5];
编辑
使用以下代码调用感知器算法,并以图形方式查看结果:
% 输入样本X1=[rand(1,100);rand(1,100);ones(1,100)]; % class '+1'X2=[rand(1,100);1+rand(1,100);ones(1,100)]; % class '-1'X=[X1,X2];% 输出类别 [-1,+1];Y=[-ones(1,100),ones(1,100)];% 初始化权重向量w=[.5 .5 .5]';% 调用感知器wtag=perceptron(X,Y,w);% 预测ytag=wtag'*X;% 在原始数据上绘制预测figure;hold onplot(X1(1,:),X1(2,:),'b.')plot(X2(1,:),X2(2,:),'r.')plot(X(1,ytag<0),X(2,ytag<0),'bo')plot(X(1,ytag>0),X(2,ytag>0),'ro')legend('class -1','class +1','pred -1','pred +1')