Ein in der Künstlichen Intelligenz lange verfolgtes Ziel ist die natürlichsprachliche Kommunikation zwischen Mensch und Maschine. Bislang ist kein Computer-Programm bekannt, mit dem eine Kommunikation auf höherem Niveau durchgeführt werden könnte.
Gegeben sei eine Sequenz von n Symbolen vor, in der Symbol A mit der Zahl nA und Symbol B mit der Zahl nB und die Kombination AB mit der Zahl nAB auftritt. Die Wahrscheinlichkeit, dass dies zufällig passiert ist genau hypergeom(n, nA, nB, nAB).
public static double hypergeometricF(int n, int nA, int nB, int nAB) { double p = 0; for (int i = 0; i <= nAB; ++i) { p += hypergeometric(n, nA, nB, i); } return p; } public static double hypergeometric(int n, int nA, int nB, int nAB) { return binomial(nA, nAB) * binomial(n - nA, nB - nAB) / (double)binomial(n, nB); } public static long binomial(int n, int k) { return factorial(n) / (factorial(k) * factorial(n - k)); } public static long factorial(int n) { long z = 1; for (int i = 2; i <= n; ++i) z *= i; return z; }
Die hier gezeigte Implementierung der hypergeometrischen Verteilungsfunktion haben wir nicht besonders optimiert, da wir diese durch die Gauß-Verteilung approximieren:
public static double normalF(int n, int nA, int nB, int nAB) { double pA = (double)nA / n; double mu = nB * pA; double c = (n - nB) / (double)(n - 1); double sigma = Math.sqrt(mu * (1 - pA) * c); return normalF(mu, sigma, nAB + 0.5 /* avg */); } public static double normalF(double mu, double sigma, double x) { return normalF((x - mu) / sigma); } public static double normalF(double x) { double t = 1.0 / (1.0 + 0.33267 * Math.abs(x)); double u = t * (0.3480242 + t * (-0.0958798 + t * 0.7478556)); double z = 0.5 * u * Math.exp(-0.5 * x * x); return x < 0 ? z : 1 - z; }