我正在尝试预先计算几个随机变量的分布。特别地,这些随机变量是在基因组中的位置处评估的函数的结果,因此每个的值将为10 ^ 8或10 ^ 9。功能非常流畅,所以我不认为我只会在每2/10/100评估时失去很多准确性吗?基数左右,但不管是否会有大量的样本。我的计划是为每个函数预先计算分位数表(可能是百分位数),并在执行主程序时引用它们,以避免在每次运行中计算这些分布统计数据。
但我真的不明白我怎么能轻易做到这一点:存储,排序和减少10 ^ 9浮点数组并不是真的可行,但是我想不出另一种不丢失的方法有关分发的信息。有没有办法测量样本分布的分位数,而不需要将整个事物存储在内存中?
答案 0 :(得分:2)
我同意@ katriealex的评论:问一个具有强大统计背景的人。
您可以轻松评估最小/最大/平均值/标准偏差,而无需存储任何大量内存。 (注意平均值+标准偏差:使用Knuth的技术:
delta = x - m[n-1]
m[n] = m[n-1] + 1/n * delta
S[n] = S[n-1] + (x[n] - m[n])*delta
mean = m[n]
std dev = sqrt(S[n]/n)
这可以防止您在std dev的天真计算中遇到浮点溢出/下溢问题,例如: taking S1 = the sum of x[k] and S2 = the sum of x[k]^2 and trying to calculate std deviation = sqrt(S2/N - S1^2/N^2)。另请参阅Wikipedia。)
可能还有其他面向流的算法用于计算分布的更高特征时刻,但我不知道它们是什么。
或者,您也可以使用histogramming技术和足够的分档来表征分布。