2017-07-09 11 views
-1

おはようございます!私はJavaのコースのために自分自身を準備しようとここに新しいです。今、私は簡単なパーセプトロンをモデル化したYouTubeのThe Coding Trainによって書かれたこのコードを再作成していました。私は入力値(3つの数字)を入力し、Perceptronクラスのオブジェクトpを作成し、p.guessを取得する別ファイルを持っています。しかし、それは私に0.0の結果を与えます。それはsignumの有効な出力であるため可能ですが、すべてではありません。ここで私のJavaの知識の欠如は私を下げることができます。ウェイト配列の変更を必ず認識していると思いますか?私はそれが乗算で最初に作成された空の配列を使用すると思う...これを修正するには?私はページの終わりのコードでそれを呼び出します:メインメソッド以外の変数にアクセス

import java.io.*; 
import java.lang.*; 
import java.util.*; 
public class Perceptron { 
static double[] weights = new double [3]; 
    public static void main(String[] args){ 
     for (int i = 0; i<weights.length; i++){ 
      weights[i] = randomNumber(-1, 1); 
     } 
     System.out.println(Arrays.toString(weights)); 
    } 
    public static double guess(double[] inputs){ 
     double sum = 0; 
     for (int i = 0; i < weights.length; i++){ 
      sum += weights[i]*inputs[i]; 
     } 
     double myguess = Math.signum(sum); 
     return myguess; 
    } 
    public static double randomNumber(int min, int max) { 
     double d = Math.random()*(max - min) + min; 
     return d; 
    } 
} 


public class myTest{ 
    public static void main(String[] args){ 
     Perceptron p = new Perceptron(); 
     double inputs[] = {-1, 0.5, -0.5}; 
     double eval = p.guess(inputs); 
     System.out.println(eval); 
    } 
} 
+0

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、問題を示す[最小限の、完全で実証可能な例](http://stackoverflow.com/help/mcve)に戻ってください。 –

+1

guess(double [] inputs)メソッドをどこで呼びましたか? –

+0

私は最終的にそれを –

答えて

0

合意されている、ゼロは非常にありそうもありません。私がこの可能性を見ることができる唯一の方法は、推測に渡す入力がすべてゼロであるかどうか、おそらくこれを推測メソッドに追加してチェックします。

System.out.println(Arrays.toString(inputs)); 

いくつかの既知の値を渡して、必要な方法でテストすることができます。 weights配列について

public static double guessWithKnownValues() { 
    final double[] knownValues = {-0.1d,0.1d,-0.1d}; 
    final double guess = guess(knownValues); 
    System.out.println(guess(knownValues)); 
    return guess; 
} 

- はい、推測では、この配列への更新に気づくでしょう、両方のメインと推測方法で重みの配列への参照は、配列の同じインスタンスを指します。

編集に応じて:テストとperecptronを別々のプロセスとして実行しているので、はい、重みは初期化されていません - あなたの疑惑は正しいです。静的なものを取り除き、このようなPerceptonクラスを書いてみて、あなたのテストを実行してください。

public class Perceptron { 
    double[] weights = new double [3]; 

    public Perceptron() { 
     for (int i = 0; i<weights.length; i++){ 
      weights[i] = randomNumber(-1, 1); 
     } 
    } 

    public double guess(double[] inputs){ 
     double sum = 0; 
     for (int i = 0; i < weights.length; i++){ 
      sum += weights[i]*inputs[i]; 
     } 
     double myguess = Math.signum(sum); 
     return myguess; 
    } 

    public double randomNumber(int min, int max) { 
     double d = Math.random()*(max - min) + min; 
     return d; 
    } 
} 
+0

ハと呼んで、あなたの編集を見て、答えを更新するコードを編集しました... – GrumpyWelshGit