私は2クラスの単純なパーセプトロン問題に取り組んでいます。私のプロジェクトでは、GUIパネルからユーザーがマウスをクリックして分類します。クラス1の期待される出力:1およびクラス2の期待される出力-1。私の問題は、離散パーセプトロンは正常に機能しているが、1ポイント停止後の連続パーセプトロンはエラーを減少させることです。何が間違っているのかわかりません。私はたくさんのコードとソースを探します。
私の公式;
このような。
d
:期待される出力、
net
:重み*入力合計、
y
:入力行列([x1 x2 -1])および
o
:実際の出力。
以下の連続パーセプトロンのコード。
while (totalError > Emax)
{
totalError = 0;
for(i=0; i<point.Count; i++)
{
double x1 = point[i].X1;
double x2 = point[i].X2;
double net = (x1 * w0) + (x2 * w1) + (x0 * w2);
double o = (2 / (1 + Math.Exp(-net))) - 1;
double error = Math.Pow(point[i].Class - o, 2);
w0 += (x1 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
w1 += (x2 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
w2 += (x0 * c * (point[i].Class - o) * (1 - Math.Pow(o, 2))) / 2;
totalError += error;
}
totalError = totalError / 2;
ErrorShow(cycle, totalError);
objGraphic.Clear(Color.White);
DrawSeperationLine();
cycle++;
}
Emax = 0.001が選択されました。このように機能するプロジェクト。行の位置が正しくないことがわかります。クラス1は青、クラス2は赤です。
forループに問題があると思います。
コードのコンソール出力:
編集: @TaW(道路を表示してくれてありがとう)と話し合った後、出力(活性化関数)に問題があることがわかりました。常に1または-1を返します。その後、重量変更関数[ 1-Math.Pow(o,2)
]の部分で0が返され、重量変更が0に等しくなります。それで、私の質問では、この問題をどのように解決できますか。型キャストが機能しません。
私の質問の解決策は、正規化を使用することです。正規化には標準偏差を使用します。標準偏差コードは以下のとおりです。
for(i=0;i<point.Count;i++){
x1 += point[i].X1;
x2 += point[i].X2;
}
meanx1 = x1 / point.Count;
meanx2 = x2 / point.Count;
for(i=0;i<point.Count;i++){
totalX1 += Math.Pow(point[i].X1 - meanx1, 2);
totalX2 += Math.Pow(point[i].X2 - meanx2, 2);
}
normX1 = totalX1 / (point.Count - 1);
normX2 = totalX2 / (point.Count - 1);
normX1 = normX1 / 100;
normX2 = normX2 / 100;
最後の除算は、値を減らすために使用されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加