確率的ニューラル ネットワーク
確率的ニューラル ネットワークは分類問題に使用できます。入力が与えられると、最初の層は、入力ベクトルから学習入力ベクトルまでの距離を計算し、入力が学習入力にどの程度近いかを示す要素を含むベクトルを生成します。2 番目の層は、入力の各クラスでのこれらの寄与を合計し、正味出力として確率のベクトルを生成します。最後に、2 番目の層の "競合" 伝達関数が、これらの確率の最大値を選択し、そのクラスに対して 1 を、その他のクラスに対して 0 を生成します。このシステムのアーキテクチャを以下に示します。
ネットワーク アーキテクチャ
Q 個の入力ベクトルとターゲット ベクトルのペアがあると仮定します。各ターゲット ベクトルには K
個の要素があります。これらの要素のうち 1 つが 1 で、残りは 0 です。このようにして、各入力ベクトルは K
個のクラスの 1 つに関連付けられます。
最初の層の入力の重み IW1,1 (net.IW{1,1}
) は、Q 個の学習ペアから形成される行列の転置 P'
です。入力が与えられると、||
dist
||
ボックスは、入力が学習セットのベクトルにどの程度近いかを示す要素を含むベクトルを生成します。これらの要素は、要素ごとにバイアスが乗算され、伝達関数 radbas
に送られます。学習ベクトルに近い入力ベクトルは、出力ベクトル a1 において 1 に近い数で表されます。入力が 1 つのクラスの複数の学習ベクトルに近い場合、その入力は a1 において 1 に近い複数の要素で表されます。
2 番目の層の重み LW1,2 (net.LW{2,1}
) は、ターゲット ベクトルの行列 T に設定されます。各ベクトルは、入力の特定のクラスに関連付けられている行のみ 1 であり、それ以外は 0 です (関数 ind2vec
を使用して、適切なベクトルを作成します)。乗算 Ta1 は、K
個の入力クラスそれぞれに対応する a1 の要素を合計します。最後に、2 番目の層の伝達関数 compet
が、n2 の最大の要素に対して 1 を生成し、それ以外には 0 を生成します。このように、このネットワークは入力ベクトルを正しい確率が最大である特定の K
クラスに分類します。
設計 (newpnn)
PNN は関数 newpnn
を使用して作成できます。たとえば、7 つの入力ベクトルとそれらに対応するターゲットはそれぞれ
P = [0 0;1 1;0 3;1 4;3 1;4 1;4 3]'
以下が得られます。
P = 0 1 0 1 3 4 4 0 1 3 4 1 1 3 Tc = [1 1 2 2 3 3 3]
以下が得られます。
Tc = 1 1 2 2 3 3 3
正しい場所に 1 があるターゲット行列が必要です。これは関数 ind2vec
によって取得できます。これは正しい場所以外が 0 の行列を提供します。したがって、次を実行し
T = ind2vec(Tc)
次の結果が得られます。
T = (1,1) 1 (1,2) 1 (2,3) 1 (2,4) 1 (3,5) 1 (3,6) 1 (3,7) 1
これで、ネットワークを作成してシミュレーションを行うことができます。入力 P
を使用して、正しい分類が生成されることを確認します。関数 vec2ind
を使用して出力 Y
を行 Yc
に変換し、分類をわかりやすくします。
net = newpnn(P,T); Y = sim(net,P); Yc = vec2ind(Y)
これは次を生成します。
Yc = 1 1 2 2 3 3 3
ネットワークの設計に使用したもの以外のベクトルの分類を試すこともできます。以下の P2
に示したベクトルを分類してみましょう。
P2 = [1 4;0 1;5 2]' P2 = 1 0 5 4 1 2
これらのベクトルはどのように分類されるのでしょうか。シミュレーションを実行し、前と同様にベクトルをプロットすると、次の結果が得られます。
Yc = 2 1 3
これらのテスト ベクトルは、それぞれクラス 2、1、および 3 にかなり近かったので、この結果は良好のようです。このネットワークは、その動作がうまく汎化されており、ネットワークの設計に使用したもの以外のベクトルを適切に分類できます。
PNN 分類を試してみることをお勧めします。それによって、PNN の設計方法や、設計に使用されていないベクトルをネットワークが正しく分類できる仕組みを確認できます。