package hex.genmodel.utils;
/**
* Used to be `hex.Distribution.Family`.
*/
public enum DistributionFamily {
AUTO, // model-specific behavior
bernoulli {
@Override public double link(double f) { return log(f/(1 - f)); }
@Override public double linkInv(double f) { return 1 / (1 + exp(-f)); }
@Override public String linkInvString(String f) { return "1./(1. + " + expString("-("+f+")") + ")"; }
},
modified_huber {
// FIXME
@Override public double link(double f) { return log(f/(1 - f)); }
@Override public double linkInv(double f) { return 1 / (1 + exp(-f)); }
@Override public String linkInvString(String f) { return "1./(1. + " + expString("-("+f+")") + ")"; }
},
multinomial {
@Override public double link(double f) { return log(f); }
@Override public double linkInv(double f) { return exp(f); }
@Override public String linkInvString(String f) { return expString(f); }
},
gaussian {
},
poisson {
@Override public double link(double f) { return log(f); }
@Override public double linkInv(double f) { return exp(f); }
@Override public String linkInvString(String f) { return expString(f); }
},
gamma {
@Override public double link(double f) { return log(f); }
@Override public double linkInv(double f) { return exp(f); }
@Override public String linkInvString(String f) { return expString(f); }
},
tweedie {
@Override public double link(double f) { return log(f); }
@Override public double linkInv(double f) { return exp(f); }
@Override public String linkInvString(String f) { return expString(f); }
},
huber,
laplace,
quantile;
/**
* Canonical link inverse
* @param f value in link space, to be transformed back to original space
* @return linkInv(f)
*/
public double linkInv(double f) {
return f;
}
/**
* Canonical link
* @param f value in original space, to be transformed to link space
* @return link(f)
*/
public double link(double f) {
return f;
}
/**
* String version of link inverse (for POJO scoring code generation)
* @param f value to be transformed by link inverse
* @return String that turns into compilable expression of linkInv(f)
*/
public String linkInvString(String f) {
return f;
}
public static double exp(double x) {
return Math.min(1e19, Math.exp(x));
}
public static String expString(String x) {
return "Math.min(1e19, Math.exp(" + x + "))";
}
public static double log(double x) {
return x <= 0 ? -19 : Math.max(-19, Math.log(x));
}
}