Как вычислить производную от f(net)=tanh(net) в c

#c #neural-network #trigonometry #complex-numbers

#c #нейронная сеть #тригонометрия #комплексные числа

Вопрос:

Мне нужно реализовать многослойный персептрон с использованием алгоритма Левенберга — Марквардта. Чтобы найти наклон функции активации (tanh), необходимо вычислить производную от tanhx = sec ^ 2 hx haas. Есть ли какая-либо библиотечная функция в c для вычисления sec ^ 2 hx.
Заранее спасибо.

Ответ №1:

Стандартная библиотека предоставляет гиперболические функции синуса, косинуса и тангенса; другие гиперболические функции могут быть получены из них:

 #include <cmath>

double sech2(double x) {
    double sh = 1.0 / std::cosh(x);   // sech(x) == 1/cosh(x)
    return sh*sh;                     // sech^2(x)
}
  

Ответ №2:

Для тех, кого привел сюда Google… было бы безопаснее использовать tanh (x) вместо cosh(x), чтобы избежать переполнения.

 #include <cmath>
double sech2(const double x) {
    double th = tanh(x); // tanh(x) in (-1,1); cosh(x) in (1,inf)
    return 1.0 - th*th; // sech^2(x) = 1 - tanh^2(x)
}
  

Ответ №3:

 #include <cmath>
inline double sec_sq(double x) {
    double cosx = std::cos(x);
    return 1.0 / (cosx*cosx);
}