0

Java でシグモイド関数を作成しました。これは、単一の数値を処理する場合は正常に機能しますが、最初のデータ入力後に配列が失敗する場合は機能します。私の問題を説明するためのデータを次に示します (出力は 3 桁に丸められます)。

    Input | Correct Output | Output
        0 |       0.5      | 0.5
     -1,0 |    0.27,0.5    | 0.27,0.62
   1,0,-1 |  0.73,0.5,0.27 | 0.73,0.62,0.64

私のコードは次のとおりです。

double[] data = { 1, 0, -1 };
System.out.println(sigmoid(data)[0] + "," + sigmoid(data)[1] + "," + sigmoid(data)[2]);

double[] sigmoid(double[] data) {
    for (int i = 0; i < data.length; i++)
        data[i] = 1 / (1 + Math.exp(-data[i]));
    return data;
}

これが私の愚かな明らかな見落としである場合は、私が何時間も無駄にしようとしてきたので教えてください。

4

1 に答える 1

1

Java は値渡しですが、関数に渡される値は入力配列への参照であり、配列のコピーではないため、関数はその場で配列を変更します - あなたの各呼び出しprintlnは前の呼び出しからの結果を更新しています.

配列のコピーを作成して、結果を返します。

static double[] sigmoid(double[] data) {
    double[] z = Arrays.copyOf(data, data.length);
    for (int i = 0; i < z.length; i++)
        z[i] = 1 / (1 + Math.exp(-z[i]));
    return z;
}
于 2016-11-28T05:40:48.050 に答える