This page (revision-9) was last changed on 21-May-2009 22:06 by Dieter Käppel

This page was created on 21-May-2009 16:36 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
9 21-May-2009 22:06 4 KB Dieter Käppel to previous
8 21-May-2009 22:06 4 KB Dieter Käppel to previous | to last
7 21-May-2009 21:51 4 KB Dieter Käppel to previous | to last
6 21-May-2009 16:58 3 KB Dieter Käppel to previous | to last
5 21-May-2009 16:49 3 KB Dieter Käppel to previous | to last
4 21-May-2009 16:48 3 KB Dieter Käppel to previous | to last
3 21-May-2009 16:47 2 KB Dieter Käppel to previous | to last
2 21-May-2009 16:39 1 KB Dieter Käppel to previous | to last
1 21-May-2009 16:36 637 bytes Dieter Käppel to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 9 changed one line
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). In der Praxis approximieren wir die hypergeometrische Verteilung durch die Gauß-Verteilung.
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;
}
}}}