0

顔の写真で性別を分類する方法を学ぶために、パーセプトロンをコーディングしています。私は MATLAB に非常に慣れていないので、多くの助けが必要です。いくつかの質問を聞きたいんです:

  1. 関数のコードを作成しようとしています:

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

    ここで、y は予測結果、x は非常に大きな行列として入れられたトレーニング/テスト セット、w は方程式の重みです。の後の部分%は私が書こうとしているものですが、これを MATLAB コードで記述する方法がわかりません。そこに何かアイデアはありますか?

  2. 私は2番目の関数をコーディングしようとしています:

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

    w、x、および y は上記と同じ値を持ち、err はパーセプトロンのステップを通じて最小化しようとしているエラーの関数です。

  3. 元の方程式で勾配降下法を使用して、パーセプトロンにステップを作成してエラーの割合を下げようとしています。if then ステートメントを使用してエラー関数を最小限に抑えるために、勾配降下を使用して w をインクリメントする方法を知っている人はいますか?

これらの質問に答えるのに役立つ場合は、今までのコードを掲載できます。

ありがとうございました!

編集 - - - - - - - - - - - - -

OK、私はまだこれのコードに取り組んでおり、より完全なものができたら公開したいと思います. 今の私の最大の質問は次のとおりです。

私は次の機能を持っています:

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つのニューロン、2番目の層に3つ、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 に答える