Метод Java Sigmoid возвращает неверные результаты

Я написал сигмоидную функцию в 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;
}

Если это просто глупо очевидный упущение с моей стороны, пожалуйста, скажите мне, что я пытался часами безрезультатно, и спасибо за любые ответы.

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;
}
Другие вопросы по тегам