package mikera.vectorz.ops; import java.io.ObjectStreamException; import mikera.vectorz.AVector; public final class Logistic extends ABoundedOp { public static final Logistic INSTANCE=new Logistic(); public static double logisticFunction(double a) { double ea=Math.exp(-a); double df=(1/(1.0f+ea)); if (Double.isNaN(df)) return (a>0)?1:0; return df; } private static double inverseLogistic (double a) { if (a>=1) return 800; if (a<=0) return -800; double ea=a/(1.0-a); return Math.log(ea); } @Override public double apply(double x) { return logisticFunction(x); } @Override public double applyInverse(double y) { return inverseLogistic(y); } @Override public void applyTo(double[] data, int start,int length) { for (int i=0; i<length; i++) { data[i+start]=logisticFunction(data[i+start]); } } @Override public void applyTo(AVector v) { v.logistic(); } @Override public boolean hasDerivative() { return true; } @Override public double derivativeForOutput(double y) { return y*(1.0-y); } @Override public double derivative(double x) { double y=logisticFunction(x); return y*(1.0-y); } @Override public double minValue() { return 0.0; } @Override public double maxValue() { return 1.0; } @Override public double averageValue() { return 0.5; } private Object readResolve() throws ObjectStreamException { return INSTANCE; } }