如何快速获取输入文件或标准输出数据流的行数近似计数?请注意,这是一种概率算法,网上很难找到许多示例。
数据可能只是来自 awk 脚本或 csv 文件中的一列或两列!假设我想对其中一列进行近似分组。我会使用数据库 group by,但行数超过 60-70 亿。我希望在 3 到 4 秒内获得第一个近似结果。然后,在进行先验决策之后运行贝叶斯或其他算法。有没有关于初始分组计数的粗略想法?
如果您可以提供 Python 或 Java 中的算法示例,那将非常有帮助。
如何快速获取输入文件或标准输出数据流的行数近似计数?请注意,这是一种概率算法,网上很难找到许多示例。
数据可能只是来自 awk 脚本或 csv 文件中的一列或两列!假设我想对其中一列进行近似分组。我会使用数据库 group by,但行数超过 60-70 亿。我希望在 3 到 4 秒内获得第一个近似结果。然后,在进行先验决策之后运行贝叶斯或其他算法。有没有关于初始分组计数的粗略想法?
如果您可以提供 Python 或 Java 中的算法示例,那将非常有帮助。
@Ben Allison的回答是计算总行数的好方法。既然你提到了贝叶斯和先验,我将添加一个方向的答案来计算不同组的百分比。(请参见您问题上的评论。我猜如果您已经知道总数并且想要进行groupby
,那么估计不同组的百分比更有意义)。
我将首先假设您只有两个组(可以进行扩展以使其适用于多个组,请参见后面的解释),group1
和group2
。
对于您处理的前n
行中的m
个group1
,我们将该事件表示为M(m,n)
。显然,您将看到n-m
个group2
,因为我们假设它们是唯一可能的两个组。因此,您知道在给定group1
(s
)的百分比的条件下,事件M(m,n)
的条件概率由具有n
次试验的二项分布给出。我们正在以贝叶斯方式估计s
。
Beta(1,1)
作为先验(当然,您可以为 alpha
和 beta
选择自己的参数),这是一个在 (0,1) 上的均匀分布。因此,对于这个贝塔分布,alpha=1
和 beta=1
。if group == 'group1':
alpha = alpha + 1
else:
beta = beta + 1
< p > s的后验分布实际上也是一个贝塔分布:< /p >
s^(m+alpha-1) (1-s)^(n-m+beta-1)
p(s| M(m,n)) = ----------------------------------- = Beta (m+alpha, n-m+beta)
B(m+alpha, n-m+beta)
其中B
是beta函数。为了报告估计结果,您可以依靠Beta
分布的均值和方差,其中:
mean = alpha/(alpha+beta)
var = alpha*beta/((alpha+beta)**2 * (alpha+beta+1))
groupby.py
以下是几行Python代码,用于处理来自stdin
的数据,并估算group1
的百分比:
import sys
alpha = 1.
beta = 1.
for line in sys.stdin:
data = line.strip()
if data == 'group1':
alpha += 1.
elif data == 'group2':
beta += 1.
else:
continue
mean = alpha/(alpha+beta)
var = alpha*beta/((alpha+beta)**2 * (alpha+beta+1))
print 'mean = %.3f, var = %.3f' % (mean, var)
我向代码输入了几行数据:
group1
group1
group1
group1
group2
group2
group2
group1
group1
group1
group2
group1
group1
group1
group2
以下是我得到的结果:
mean = 0.667, var = 0.056
mean = 0.750, var = 0.037
mean = 0.800, var = 0.027
mean = 0.833, var = 0.020
mean = 0.714, var = 0.026
mean = 0.625, var = 0.026
mean = 0.556, var = 0.025
mean = 0.600, var = 0.022
mean = 0.636, var = 0.019
mean = 0.667, var = 0.017
mean = 0.615, var = 0.017
mean = 0.643, var = 0.015
mean = 0.667, var = 0.014
mean = 0.688, var = 0.013
mean = 0.647, var = 0.013
head -n100000 YOURDATA.txt | python groupby.py
就是这样。希望有所帮助。