-76

単層ニューラル ネットワークの実装には、2 つのデータ ファイルがあります。

In:
    0.832 64.643
    0.818 78.843

Out:
    0 0 1
    0 0 1

上記は2つのデータファイルのフォーマットです。

対象の出力は、対応する入力が属する特定のクラスに対して「1」、残りの 2 つの出力に対して「0」です。

問題は次のとおりです。

単層ニューラル ネットワークは、Y = A*X + b で A (3 x 2 行列) と b (3 x 1 ベクトル) を見つけます。ここで、Y は [C1, C2, C3]' で、X は [x1, x2]' です。 .

上記の問題をニューラル ネットワークで解決するには、方程式を次のように書き直すことができます。 1]'

これで、3 つの入力ノード (それぞれ x1、x2、および 1 に 1 つ) と 3 つの出力 (C1、C2、C3) を持つニューラル ネットワークを使用できます。

結果として得られる 9 つの重み (3 つの入力と 3 つの出力の間に 9 つの接続があるため) は、A' 行列の要素に相当します。

基本的に、私はこのようなことをしようとしていますが、うまくいきません:

function neuralNetwork   
    load X_Q2.data
    load T_Q2.data
    x = X_Q2(:,1);
    y = X_Q2(:,2);

    learningrate = 0.2;
    max_iteration = 50;

    % initialize parameters
    count = length(x);
    weights = rand(1,3); % creates a 1-by-3 array with random weights
    globalerror = 0;
    iter = 0;
    while globalerror ~= 0 && iter <= max_iteration
        iter = iter + 1;
        globalerror = 0;
        for p = 1:count
            output = calculateOutput(weights,x(p),y(p));
            localerror = T_Q2(p) - output
            weights(1)= weights(1) + learningrate *localerror*x(p);
            weights(2)= weights(1) + learningrate *localerror*y(p);
            weights(3)= weights(1) + learningrate *localerror;
            globalerror = globalerror + (localerror*localerror);
        end 
    end 

この関数を別のファイルに記述し、以前のコードで呼び出しています。

function result = calculateOutput (weights, x, y)
    s = x * weights(1) + y * weights(2) + weights(3);
    if s >= 0
        result = 1;
    else
        result = -1;
    end
4

1 に答える 1

225

コードにいくつかの問題を見つけることができます。主な問題は、ターゲットがマルチクラス(バイナリではない) であるため、クラスごとに 1 つずつ 3 つの出力ノードを使用する ( 1-of-N encodingと呼ばれる) か、異なるアクティベーション関数で単一の出力ノードを使用する必要があることです。 (単なるバイナリ出力 -1/1 または 0/1 以上のことができるもの)

以下のソリューションでは、パーセプトロンは次の構造を持っています。

perceptron_strucutre

%# load your data
input = [
    0.832 64.643
    0.818 78.843
    1.776 45.049
    0.597 88.302
    1.412 63.458
];
target = [
    0 0 1
    0 0 1
    0 1 0
    0 0 1
    0 0 1
];

%# parameters of the learning algorithm
LEARNING_RATE = 0.1;
MAX_ITERATIONS = 100;
MIN_ERROR = 1e-4;

[numInst numDims] = size(input);
numClasses = size(target,2);

%# three output nodes connected to two-dimensional input nodes + biases
weights = randn(numClasses, numDims+1);

isDone = false;               %# termination flag
iter = 0;                     %# iterations counter
while ~isDone
    iter = iter + 1;

    %# for each instance
    err = zeros(numInst,numClasses);
    for i=1:numInst
        %# compute output: Y = W*X + b, then apply threshold activation
        output = ( weights * [input(i,:)';1] >= 0 );                       %#'

        %# error: err = T - Y
        err(i,:) = target(i,:)' - output;                                  %#'

        %# update weights (delta rule): delta(W) = alpha*(T-Y)*X
        weights = weights + LEARNING_RATE * err(i,:)' * [input(i,:) 1];    %#'
    end

    %# Root mean squared error
    rmse = sqrt(sum(err.^2,1)/numInst);
    fprintf(['Iteration %d: ' repmat('%f ',1,numClasses) '\n'], iter, rmse);

    %# termination criteria
    if ( iter >= MAX_ITERATIONS || all(rmse < MIN_ERROR) )
        isDone = true;
    end
end

%# plot points and one-against-all decision boundaries
[~,group] = max(target,[],2);                     %# actual class of instances
gscatter(input(:,1), input(:,2), group), hold on
xLimits = get(gca,'xlim'); yLimits = get(gca,'ylim');
for i=1:numClasses
    ezplot(sprintf('%f*x + %f*y + %f', weights(i,:)), xLimits, yLimits)
end
title('Perceptron decision boundaries')
hold off

提供した 5 つのサンプルに対するトレーニングの結果:

Iteration 1: 0.447214 0.632456 0.632456 
Iteration 2: 0.000000 0.447214 0.447214 
...
Iteration 49: 0.000000 0.447214 0.447214 
Iteration 50: 0.000000 0.632456 0.000000 
Iteration 51: 0.000000 0.447214 0.000000 
Iteration 52: 0.000000 0.000000 0.000000 

プロット

上記の例で使用されているデータには、5 つのサンプルしか含まれていないことに注意してください。各クラスでより多くのトレーニング インスタンスがあれば、より意味のある結果が得られます。

于 2010-08-11T12:07:52.443 に答える