0

我正在编写一个感知器来学习对面孔图片中的性别进行分类。我对 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
4

3 回答 3

1

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

f=newp(X,Y)

创建一个感知器。

如果要创建 MLP,则:

f=newff(X,Y,NN)

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

NN=[5 3 2]

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

于 2011-03-26T02:14:51.553 回答
1

你可以阅读我前段时间做的这个问题。

我使用 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')

我想这可以给你一个想法来制作你描述的功能。对于错误,将预期结果与实际结果(类)进行比较

于 2011-03-26T23:09:25.223 回答
1

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

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

ff=newp(X,Y)

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

于 2011-03-27T12:00:54.903 回答