下面这个类采用了什么数学模型?谁能看出来
static final class SmoothedStats {
private static final double NORM_CUMULATIVE[] = { 0.0013498980320000001D,
0.0018658133009999999D, 0.0025551303310000001D,
0.0034669738040000002D, 0.0046611880249999996D,
0.0062096653260000001D, 0.0081975359259999995D,
0.010724110021000001D, 0.013903447512999999D,
0.017864420562000001D, 0.022750131948000001D,
0.028716559815000001D, 0.035930319112000002D,
0.044565462761999998D, 0.054799291698999997D,
0.066807201270000005D, 0.080756659236000006D,
0.096800484586000005D, 0.11506967022300001D, 0.13566606094799999D,
0.158655253932D, 0.184060125347D, 0.21185539858300001D,
0.24196365222399999D, 0.27425311775099998D, 0.30853753872599998D,
0.34457825839D, 0.38208857781099997D, 0.42074029056200002D,
0.46017216272299999D, 0.5D, 0.53982783727700001D,
0.57925970943899996D, 0.61791142218899997D, 0.65542174161D,
0.69146246127400002D, 0.72574688224899997D, 0.75803634777600004D,
0.78814460141700005D, 0.815939874653D, 0.84134474606800003D,
0.86433393905199996D, 0.88493032977700004D, 0.90319951541400001D,
0.91924334076400005D, 0.93319279873000005D, 0.945200708301D,
0.95543453723799998D, 0.96406968088800005D, 0.97128344018500001D,
0.97724986805199998D, 0.98213557943800001D, 0.98609655248700001D,
0.98927588997899996D, 0.99180246407399997D, 0.99379033467400002D,
0.99533881197499996D, 0.99653302619600004D, 0.99744486966900003D,
0.998134186699D, 0.99865010196799997D };
private double sum; private double squaresSum; private double n;
int HORIZON = 50; void add(double d) {
double d1 = 1.0D - 1.0D / HORIZON;
n = d1 * n + 1.0D;
sum = d1 * sum + d;
squaresSum = d1 * squaresSum + d * d;
} double getAvg() {
return sum / n;
} boolean exceedsZ(double d, double d1) {
double d2 = sum - n * d;
return n > 1.0D && d2 * d2 > (n * squaresSum - sum * sum) * d1 * d1;
} double zScore(double d) {
double d1 = sum / n;
return (d - d1) / Math.sqrt(squaresSum / n - d1 * d1);
} double pLessThan(SmoothedStats smoothedstats) {
double d = smoothedstats.sum / smoothedstats.n - sum / n;
double d1 = (((squaresSum - (sum * sum) / n) + smoothedstats.squaresSum) - (smoothedstats.sum * smoothedstats.sum)
/ smoothedstats.n)
/ (n + smoothedstats.n);
double d2 = d1 * (1.0D / n + 1.0D / smoothedstats.n);
return d2 != 0.0D ? normCumulative(d / Math.sqrt(d2))
: d <= 0.0D ? 0 : 1;
}
private static double normCumulative(double d) {
if (d < -3D)
d = -3D;
if (d > 3D)
d = 3D;
return NORM_CUMULATIVE[(int) (10D * (d + 3D))];
} SmoothedStats(double d) {
n = 1.0D;
sum = d;
squaresSum = d * d;
}
}
static final class SmoothedStats {
private static final double NORM_CUMULATIVE[] = { 0.0013498980320000001D,
0.0018658133009999999D, 0.0025551303310000001D,
0.0034669738040000002D, 0.0046611880249999996D,
0.0062096653260000001D, 0.0081975359259999995D,
0.010724110021000001D, 0.013903447512999999D,
0.017864420562000001D, 0.022750131948000001D,
0.028716559815000001D, 0.035930319112000002D,
0.044565462761999998D, 0.054799291698999997D,
0.066807201270000005D, 0.080756659236000006D,
0.096800484586000005D, 0.11506967022300001D, 0.13566606094799999D,
0.158655253932D, 0.184060125347D, 0.21185539858300001D,
0.24196365222399999D, 0.27425311775099998D, 0.30853753872599998D,
0.34457825839D, 0.38208857781099997D, 0.42074029056200002D,
0.46017216272299999D, 0.5D, 0.53982783727700001D,
0.57925970943899996D, 0.61791142218899997D, 0.65542174161D,
0.69146246127400002D, 0.72574688224899997D, 0.75803634777600004D,
0.78814460141700005D, 0.815939874653D, 0.84134474606800003D,
0.86433393905199996D, 0.88493032977700004D, 0.90319951541400001D,
0.91924334076400005D, 0.93319279873000005D, 0.945200708301D,
0.95543453723799998D, 0.96406968088800005D, 0.97128344018500001D,
0.97724986805199998D, 0.98213557943800001D, 0.98609655248700001D,
0.98927588997899996D, 0.99180246407399997D, 0.99379033467400002D,
0.99533881197499996D, 0.99653302619600004D, 0.99744486966900003D,
0.998134186699D, 0.99865010196799997D };
private double sum; private double squaresSum; private double n;
int HORIZON = 50; void add(double d) {
double d1 = 1.0D - 1.0D / HORIZON;
n = d1 * n + 1.0D;
sum = d1 * sum + d;
squaresSum = d1 * squaresSum + d * d;
} double getAvg() {
return sum / n;
} boolean exceedsZ(double d, double d1) {
double d2 = sum - n * d;
return n > 1.0D && d2 * d2 > (n * squaresSum - sum * sum) * d1 * d1;
} double zScore(double d) {
double d1 = sum / n;
return (d - d1) / Math.sqrt(squaresSum / n - d1 * d1);
} double pLessThan(SmoothedStats smoothedstats) {
double d = smoothedstats.sum / smoothedstats.n - sum / n;
double d1 = (((squaresSum - (sum * sum) / n) + smoothedstats.squaresSum) - (smoothedstats.sum * smoothedstats.sum)
/ smoothedstats.n)
/ (n + smoothedstats.n);
double d2 = d1 * (1.0D / n + 1.0D / smoothedstats.n);
return d2 != 0.0D ? normCumulative(d / Math.sqrt(d2))
: d <= 0.0D ? 0 : 1;
}
private static double normCumulative(double d) {
if (d < -3D)
d = -3D;
if (d > 3D)
d = 3D;
return NORM_CUMULATIVE[(int) (10D * (d + 3D))];
} SmoothedStats(double d) {
n = 1.0D;
sum = d;
squaresSum = d * d;
}
}
NORM_CUMULATIVE[]:正态分布曲线上的数据
n: 样品个数
sum:Σx
squaresSum: 平方和 Σ(x*x)
能大致解释一下吗?
getAvg 是计算样品的平均值别的不知道
我觉得NORM_CUMULATIVE[]应该是概率,因为它的最大值为1,最小值为0。
而下标才是横坐标。换到数学说,NORM_CUMULATIVE[i]是从0到i的积分。是不是这样?
呵呵 谢谢你。搞定以后我再开个帖给你分。我在搜索的过程中看到了这个:----------------别人的问题---------------------------
QUOTE (roverlag @ Sep 4 2003, 09:23 AM)
感谢 ontime_99 兄的热情帮助,现在我发现真正需要的是去计算F的分布函数,即 F(x,m,n),应该是对密度函数积分,除去阶乘部分,剩下的需要积分,积分该怎样编程去计算呢?
--------------------------------------------------------------一个人给出的答案-------------------------
随机模拟,就是mc方法不过那样的话还不如我说的通过随机数产生均匀分布->加和产生正态->平方产生chi-square->相除得到F
-------------------------------------------这个的描述觉得和我的问题比较象,答案里的那个mc方法,知道是怎么个路子吗?