在MATLAB中创建火车感知器用于性别分类

时间:2011-03-26 22:28:00

标签: matlab gradient perceptron

我正在编写一个感知器来学习在脸部图片中对性别进行分类。我对MATLAB非常新,所以我需要很多帮助。我有几个问题:

  1. 我正在尝试编写函数代码:

    function [y] = testset(x,w)  
    %y = sign(sigma(x*w-threshold))
    

    其中y是预测结果,x是作为非常大的矩阵放入的训练/测试集,并且w是等式上的权重。 %之后的部分是我想写的部分,但我不知道如何在MATLAB代码中编写它。那里有什么想法吗?

  2. 我正在尝试编写第二个函数:

    function [err] = testerror(x,w,y)  
    %err = sigma(max(0,-w*x*y))
    

    w,x和y具有与上述相同的值,并且err是我的错误函数,我试图通过感知器的步骤最小化。

  3. 我试图通过在原始方程中使用梯度下降来在我的感知器中创建一个步骤来降低误差百分比。有没有人知道如何使用渐变下降来增加w以使用if then语句最小化错误函数?

  4. 如果可以帮助你回答这些问题,我可以提出我现在的代码。

    谢谢!

    编辑--------------------------

    好的,所以我仍在为此编写代码,并希望在我有更完整的东西时提出来。我现在最大的问题是:

    我有以下功能:

    function [y] = testset(x,w)  
    y = sign(sum(x*w-threshold))
    

    现在我知道我应该设置一个门槛,但是无法弄清楚我应该把它作为门槛!那里有什么想法吗?

    编辑----------------------------
    这就是我到目前为止所拥有的。仍然需要对它进行更改,但我会很感激输入,特别是关于结构,以及需要进行更改的建议!

    function [y] = Perceptron_Aviva(X,w)
    y = sign(sum(X*w-1));
    end
    
    function [err] = testerror(X,w,y)
        err = sum(max(0,-w*X*y));
    end
    
    %function [w] = perceptron(X,Y,w_init)
    %w = w_init;
    %end
    
    %------------------------------
    
    % input samples
    X = X_train;
    
    % output class [-1,+1];
    Y = y_train;
    
    % init weigth vector
    w_init = zeros(size(X,1));
    w = w_init;
    
    
    %---------------------------------------------
    loopcounter = 0
    
    while abs(err) > 0.1 && loopcounter < 100
    
        for j=1:size(X,1)
    
            approx_y(j) = Perceptron_Aviva(X(j),w(j))
    
            err = testerror(X(j),w(j),approx_y(j))
    
            if err > 0 %wrong (structure is correct, test is wrong)
                w(j) = w(j) - 0.1 %wrong
            elseif err < 0 %wrong
                w(j) = w(j) + 0.1 %wrong
            end
    
           % -----------
           % if sign(w'*X(:,j)) ~= Y(j) %wrong decision?
           %      w = w + X(:,j) * Y(j);   %then add (or subtract) this point to w
        end
    

3 个答案:

答案 0 :(得分:1)

假设您的数据集是X,数据块和Y,即类的标签。

f=newp(X,Y)

创造一个感知器。

如果你想创建一个MLP,那么:

f=newff(X,Y,NN)

其中NN是网络架构,即指定每个隐藏层处的神经元数量的阵列。例如

NN=[5 3 2]

将对应于第一层有5个神经元的网络,第二层有3个神经元,第二个隐藏层有2个。

答案 1 :(得分:1)

你可以读一下我之前做过的question

我使用matlab代码和函数perceptron

function [w] = perceptron(X,Y,w_init)

w = w_init;
for iteration = 1 : 100  %<- in practice, use some stopping criterion!
  for ii = 1 : size(X,2)         %cycle through training set
    if sign(w'*X(:,ii)) ~= Y(ii) %wrong decision?
      w = w + X(:,ii) * Y(ii);   %then add (or subtract) this point to w
    end
  end
  sum(sign(w'*X)~=Y)/size(X,2)   %show misclassification rate
end

从代码(@Itamar Katz)调用,如(随机数据):

% input samples
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];

% output class [-1,+1];
Y=[-ones(1,100),ones(1,100)];

% init weigth vector
w=[.5 .5 .5]';

% call perceptron
wtag=perceptron(X,Y,w);
% predict
ytag=wtag'*X;


% plot prediction over origianl data
figure;hold on
plot(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')

我想这可以让你有机会制作你描述的功能。 错误比较预期结果与实际结果(类)

答案 2 :(得分:1)

你所谓的阈值就是机器学习命名中的偏见。这应留作用户的输入,因为它是在训练期间使用的。

另外,我想知道你为什么不使用内置的matlab函数。即newp或newff。 e.g。

ff=newp(X,Y)

然后你可以设置对象ff的属性来完成选择梯度下降等工作。