在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习。 理解颇浅,还请大神指点!
http://blog.codinglabs.org/articles/algorithms-for-cardinality-estimation-part-ii.html
它的基本处理方法和上篇中用bitmap统计的方法类似,但是最后要用到一个公式:
说明:m为bitmap总位数,u为0的个数,最后的结果为n的一个估计,且为最大似然估计(MLE)。
那么问题来了,最大似然估计是什么东东?好像在学概率论的时候听说过,于是又去搜索了一下MLE的信息。
MLE:(此处不使用概率论中的各种符号及表示方法,按我自己的理解写)
以下内容参考链接:http://blog.csdn.net/yanqingan/article/details/6125812
假设进行一个实验,实验次数定为10次,每次实验成功率为0.2,那么不成功的概率为0.8,用n来表示成功的次数。
事件之间是相互独立的,于是可以得到成功次数的概率:
| 成功次数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 概率 | 0.107374 | 0.268435 | 0.301990 | 0.201327 | 0.088080 | 0.026424 | 0.005505 | 0.000786 | 0.000074 | 0.000004 | 0.000000 |
以上数据由下述程序计算:
1 #include <stdio.h> 2 #define N 10 3 #define G 0.2 4 5 int factorial(int n) 6 { 7 int i; 8 int ret = 1; 9 for(i = 1; i <= n; ++i) 10 { 11 ret *= i; 12 } 13 return ret; 14 } 15 16 double exponent(double m, int n) 17 { 18 int i; 19 double ret = 1; 20 for(i = 0; i < n; ++i) 21 { 22 ret *= m; 23 } 24 return ret; 25 } 26 27 double fun(int n) 28 { 29 return ((double)factorial(N) / factorial(n) / factorial(N - n) * exponent(G, n) * exponent(1 - G, N - n)); 30 } 31 32 int main() 33 { 34 int i; 35 for(i = 0; i <= N; ++i) 36 { 37 printf("%f\t", fun(i)); 38 } 39 printf("\n"); 40 }