1

MATLAB で単純なパーセプトロン トレーニング関数を作成しようとしています。エラーが見つからなかったときに重みを返したい。

ここに分類したいデータがあります。

d = rand(10,2);
figure

labels = ones(10,1);
diff =  d(:,1) + d(:,2) - 1;
labels( diff + 1 >= 1) = 2;

pathWidth = 0.05;
labels( abs(diff) < pathWidth) = [];
d(abs(diff) < pathWidth,:) = [];

plot(d(labels == 1,1),d(labels == 1,2),'k.','MarkerSize',10)
plot(d(labels == 2,1),d(labels == 2,2),'r.','MarkerSize',10)

d のポイント数を増やすと、2 つのクラス (赤、黒) 間の区分がより明確になるラベル付きデータ セットが生成されます。

私のパーセプトロン関数では、データ (d) とラベルを渡します。x 値、y 値、バイアスの 3 つの入力があります。各入力には、0 から 1 の間のランダムな重みが割り当てられています。パーセプトロン関数でデータセット d に Z という名前を付けたことに注意してください。シグモイド活性化関数を使用しましたが、while ループを 1 回実行し、その後は常に true を返します。シグモイド関数も inf または 1 のいずれかの値を与えました。以下では、しきい値活性化のみを使用していますが、継続的にループしているようです。体重を返さない。問題は以下のifステートメントにあると思います

if(v >= 0 && labels(i) == 1 || v < 0 && labels(i) == 2)

パーセプトロン機能:

function perceptron(data,labels)

sizea = numel(data(:,1));
weights = rand(sizea,3);

Z = data(:,:)
eta = 0.5;
errors = 1;
count = 0;

while errors > 0 
    errors = 0;
    v = sum((1*weights(1,1)) + (Z(:,1)*weights(1,2)) + (Z(:,2)*weights(1,3)));
    if v >= 1
        v = 1;
    else 
        v = 0;
    end
    count = count + 1
    for i = 1:sizea % for each object in dataset
        if(v == 1 && labels(i) == 1 || v == 0 && labels(i) == 2)
            errors = 1;
            weights(1,1) = weights(1,1) - (2*v-1) * eta * 1;
            weights(1,2) = weights(1,2) - (2*v-1) * eta * Z(i,1);
            weights(1,3) = weights(1,3) - (2*v-1) * eta * Z(i,2);
            v = sum((1*weights(1,1)) + (Z(:,1)*weights(1,2)) + (Z(:,2)*weights(1,3)));
            if v >= 1
                v = 1;
            else 
                v = 0;
            end
        end
    end 
end
4

1 に答える 1