文章目录
数据流挖掘的目的:如何从流中抽取有用的样本,过滤掉大部分“不想要”的元素。
1. 数据抽样
1.1 随机数为0则存储
对每一个查询产生一个随机数(比如0~9中的一个整数),并且当且仅当随机数为0时才存储该元素。这样就有1/10的查询会被存储。
但是:
上述抽样机制会带来错误的结果。概率并不是我们想象的那样。d / (s + d) ≠ d / (10s + 19d)
1.2 代表性样本的获取
挑选出1 / 10 的用户,并将他们的所有查询放入样本中,而不考虑其他用户的搜索查询。
1.3 一般的抽样问题
将一些字段组合成一个关键字段来进行查询样本
1.4 习题
关键字组合抽样
2. 流过滤
流数据量非常大,因此要基于磁盘访问来确定是否让任何给定的流元素通过,因此要设计一种办法:
- 过滤掉大部分不想要的硫元素
- 方法所需的内存大小低于可用内容容量
2.1 布隆过滤器
组成:
(1) n个位组成的数组,每个位的初始值都为0 。
(2) 一系列哈希函数hi, h2, …, hk组成的集合。每个哈希函数将”键"值映射到上述的n个桶(对应千位数组中n个位)中。
(3) m个键值组成的集合S。
当键值为K的流元素到达时,检查所有的h1(K), h2(K), …, hk(K)对应的位是否全部为1’ 如果是,则允许该流元素通过,如果有一位或多位为0, 则认为K不可能在S中,千是拒绝该流元素通过。
2.2 布隆过滤 false positive 概率
false positive(假阳)指的是所有真正的负例当中被判为正例的比例。这里就是,本来不能通过过滤的元素却能通过过滤的比例。
- m:集合 s 元素的个数
- n:位数组容量位 n,n > m
- k:哈希函数有 k 个
2.3 例题
3. 流中独立元素的数目统计
3.1 独立元素计数问题
一种明显的问题解决方法是在内存中保存当前已有的所有流元素列表。具体可以采用某种高效的搜索结构来保存这些元素,比如哈希表或搜索树,这样就可以快速增加新元素,并且当元素到达时检查它是否已到达流中。
3.2 FM 算法
基本思想是:如果流中看到的不同元素越多,那么我们看到的不同哈希值也会越多。在看到的不同哈希值越多的同时,也越可能看到其中有一个值变得“异常"。
3.3 组合估计
我们可能会认为使用的哈希函数越多,近似值与真实值也越接近。然而,情况并非如此,原因与平均值的过高估计造成的影响有关。
具体办法有:
- 分组
- 取中位数
最好的办法是将上述两种方法结合集来。有一个方法可以解决上述问题。我们可以将两种策略组合起来。首先将哈希函数分成小组,每个组内取平均值。然后在所有平均值中取中位数。
4. 矩估计
4.1 0阶矩(不为0的个数
流的0阶矩是所有元素中不为0的元素m;的数目(即 m > 0;则加 1,否则加 0)。
4.2 1阶矩(长度
流的一阶矩是所有元素m;之和,也必须是整个流的长度。
4.3 2阶矩(元素出现次数的平方和
二阶矩是所有元素出现次数的平方和,它有时也称为奇异数(surprise number)。
4.4 高阶矩
- 三阶矩公式:
- k 阶矩公式:
其中: - n 为元素的总个数
- v 为某个元素出现的次数
最后算出来的值,还要取平均
例如:
4.4 例题
5. 窗口内计数问题
5.1 DGIM算法
将整个窗口划分为多个桶,每个桶包含:
(1)最右部的时间戳(即最近的时间戳);
(2)桶中1 的数目,该数目必须是2的幕,我们将该数称为桶的大小。
桶必须遵循以下 6 条规则:
- 桶最右部的位置上总是为1;
- 每个1 的位置都在某个桶中;
- 一个位置只能属于一个桶;
- 桶的大小从最小一直变化到某个最大值,相同大小的桶只可能有一到两个;
- 所有桶的大小必须都是2 的幕;
- 从右到左扫描(即从远到近扫描),桶的大小不会减小。
桶之间存在一些 0 是允许的
6. 衰减窗口
可以用于:寻找近期的最常见的元素
设计思路:元素在流中出现的越早,其权重也越小