数据流挖掘有两种模型,一种是保存流的某个概要信息,使之足够回答某种期望的查询,另一种是维持一个滑动窗口。几个例子:
- 数据抽样
比如过去一个月中典型用户所提交的重复 查询的数目。在用户规模较大的时候,将用户hash到不同的桶中,当空间不足时,则丢弃一部分桶。
- 流过滤
比如垃圾邮件的过滤,采用布隆过滤的方法,创建一个位数组,初始化所有值为0,将合法的邮件映射到位数组上,并设置值为1,用不同的hash函数检查邮件,如果有一个值为0,则拒绝
- 独立元素统计
比如统计web查询的数目,可以应用FM算法,将所有的査询hash到一个位串中,检查其末尾最大0的数目,设为R,则总数可以估计为2^R。
- 元素分布
一般用二阶矩估计,即每个元素出现数目的平方和来判断流元素分布的均匀性。可以采用AMS算法来近似计算二阶矩:在流中随机选取多个位置,并统计每个位置上的元素出现的次数,设为c,用n表示总的元素数目,则二阶矩为n*(2*c-1)的均值
- 计数
为了能够查询窗口内任意数目的元素中1的个数,采用DGIM算法,每出现元素1,则创建一个新的桶,并递归地尝试合并之前的桶,使得每个桶的大小为2的幂,且相同大小的桶最多为2个。每个桶只用保存最近的时间戳和桶的大小,有效避免了精确计数带来的空间开销。为了减小估计结果的误差,可以增加所允许出现的相同大小的桶的数目。
- 流行元素
比如最近流行的电影,可以定义一个衰减窗口,独立计算每一部电影流,对每张新的电影票,首先将所有的电影乘以一个衰减值,然后检查电影票对应的电影得分是否已存在,如果不存在,则创建新的电影流并设置得分为1,否则将该电影的得分加1。为了减少需要统计的数目,可以设置一个阀值,将低于阀值的得分丢掉。