【问题标题】:creating a train perceptron in MATLAB for gender clasiffication在 MATLAB 中创建用于性别分类的训练感知器
【发布时间】:2011-03-26 22:27:59
【问题描述】:

我正在编写一个感知器来学习对人脸图片中的性别进行分类。我对 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 语句最小化误差函数?

如果可以帮助您回答这些问题,我可以提供我目前拥有的代码。

谢谢!

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

好的,所以我仍在为此编写代码,并希望在我有更完整的内容时将其发布。我现在最大的问题是:

我有以下功能:

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

【问题讨论】:

  • Matlab 文档本身相当详尽,并提供了背景材料、小示例和参考资料。提取一些特定于您的领域的论文,看看他们使用了哪些方法。
  • 您尝试了哪些方法,哪些方法不起作用?您有具体问题吗?
  • 你能把你所有的代码都放上来吗?
  • 这就是我所拥有的一切(有些代码由于某种原因没有在突出显示的部分上方突出显示)。代码的最后一部分是我正在考虑从您编写的代码中放入的代码。
  • 我看到您已将数据定义为 % input samples X = X_train; Y = y_train; ,我想这会加载数据...但是您需要将数据 分开 2个类,又名, -1 class male, 1 class female,在我发布的示例中,它分为两个类,例如: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]; 所以,我告诉你的是首先拆分数据,所以这样感知器将从示例中学习......这样做会错过比较感知器和正确类的输出

标签: matlab gradient perceptron


【解决方案1】:

你可以阅读这个question我前段时间。

我使用了一个matlab代码和一个函数感知器

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')

我想这可以给你一个想法来制作你描述的功能。 对错误比较预期结果和真实结果(类)

【讨论】:

  • 这很有帮助!不过我还有一些问题(见上文)
  • @Itamar Katz,你能帮我吗?
【解决方案2】:

假设您的数据集是 X(数据点)和 Y(类的标签)。

f=newp(X,Y)

创建一个感知器。

如果您想创建 MLP,那么:

f=newff(X,Y,NN)

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

NN=[5 3 2]

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

【讨论】:

【解决方案3】:

您所说的阈值是机器学习命名法中的偏差。这应该作为用户的输入,因为它是在训练期间使用的。

另外,我想知道您为什么不使用内置的 matlab 函数。即newp或newff。例如

ff=newp(X,Y)

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

【讨论】:

  • 主要是因为这是一个学校项目,这并不能表明我知道如何创建感知器,还因为我认为它不包括我需要的所有东西,以便为我的目标编写代码需要它做
  • 神经网络工具箱包含的内容超出您的想象。此外,您要求我们为您的项目编写代码。也许你应该关注这门课程?
  • 我已经提供了代码。我也关注课程。我了解感知器的理论——这是课堂上所教的。问题是硬件在 MATLAB 中(这不是编程课!)而且我从来没有学过 MATLAB。大约 8 年前,我在攻读第一个学位时学习了 JAVA,但也不太记得了
  • 好吧,伙计,不需要私信,但你并不能说服我。
猜你喜欢
  • 2013-12-23
  • 2019-08-19
  • 2016-03-02
  • 2021-09-07
  • 2021-12-15
  • 2013-01-03
  • 2018-08-28
  • 2017-05-10
  • 2014-11-04
相关资源
最近更新 更多