《大数据时代》读后感

前言

这本书去年(农历年)年底的时候读完了,翻译的还行,关键译者还有自己的观点。之前(2011年)知道译者周涛老师是在杭州一个大数据的分享会议上,冒出来一个新公司叫百分点的公司做推荐算法的,当时不是觉得这个公司牛,而是这个人牛。因为但是他年龄也就二十五六岁吧,已经是电子科技大学的教授了(主任级),这点是很难的。买这本书其实也是关联推荐买的,本来我是买一本大数据决策,然后推荐的列表里面看到了这本,也就顺手买了。

说大数据时代,那么什么是大数据?

1T数据够大吗?1P呢?1Z呢?No No No! 大数据其实跟数据量的大小没有确定性的关系,大数据其实是相对小数据而言的。什么是小数据?其实小数据跟数据量也无关,根计算方式有关。小数据是基于总体数据下面的抽样分析,得到精确的结果。抽样分析的准确性是跟数据的随机性相关的,随机性越高,抽样的结果越能准确的反应总体的数据。小数据时代下的抽样统计方式之所以流行是因为那个时代的计算能力不够强大。与之相对的,大数据时代下,数据是更全面的,计算资源也丰富,足以让我们对数据做全盘的分析,从而直接得到总体的结果。这里的样本就是总体。当然大数据也有不足的地方,就是他的精确度不够(但是往往是可以容忍这种不精确的)

大数据时代有什么变革?

首先人们的思维方式会受到挑战。考虑需要更全面,不再由抽样来反应总体。需要各种各样不同的数据源,但同时也会引入一些噪音,要容忍这些噪音。要明白数据反馈的是事件之间的相关性,而不是因果性。从数据推倒出来某个因果关系基本上都是加上了主观意识的干涉的,不够理性。不要刻意通过数据去追求因果关系,因为最终的结论其实都是主观的。

相关性如何理解?

其实就是概率论中的条件概率(贝叶斯定理)。 比如一个山脚的别墅,里面养了一条狗,根据主人统计,狗叫的时候,刚好遇到有盗贼的情况的概率为 80%,也就是平日里,10天狗叫有8天是因为有盗贼来了。然后突然有一天,又听到了狗叫,这时你会认为有没有盗贼呢?你不知道,你知道说很可能是来盗贼的,概率大约80%。因为狗叫和盗贼之间不存在因果关系,而只是存在相关性。哪一天来了个主人的远房亲戚,狗也是会叫的,但亲戚并不是贼。贝叶斯公式展开讲就比较复杂了,这里不深入。

相关性很重要,忘掉因果性,这点很重要。

商业模式上,大数据也带来了变革。

比如有提供基础数据的大数据公司,像twitter,facebook,微信,微博这种大规模用户下信息流为主的公司。像twitter,他自己虽然也分析数据,但是他还会把数据授权给第三方公司去做分析,然后得到商业价值。还有一种是数据技术公司,比如google,通过大数据不断地训练自己的神经网络,提供各种牛逼的功能。比如google翻译,google翻译的开发者其实没有一个人懂全世界那么多种语言,但是他们可以互转就是用了大数据,把大量的数据信息录入到数据库,然后以英语为中间语言,互相转换。还有一种公司是大数据思维公司,也就是第一个例子中twitter授权给分析的公司,这种公司主要是做数据分析,自己不产生源数据。

大数据也带来一些问题和挑战

隐私问题。

在大数据下面,每个人几乎都是"裸体"的,只要有耐性,你在网络上的信息都可以分析到,甚至可以精确到你的住址,家人,朋友,以及朋友的朋友,家人的朋友。

数据结果滥用。

比如错把相关性当初因果性,狗叫时你就拿了个武器去把对方放到了,结果一看是亲戚艾玛。另外是大数据往往是反映了群体性的结果,而不是单个人的结果。通过主观意识,把总体的行为反馈到个人行为身上,产生数据保证。比如种族歧视就是最好的例子。

大数据神棍。

没错,就是通过数据分析,得出一些结果,就依次推导未来的发展。再次声明,数据只能提供相关性,不提供因果性,数据只能说明有点关系,不能推导出什么玩意。最好的预测未来就是去创造未来。 如果一切都按数据说了算,福特就不会发明汽车了。苹果手机,You think too beatiful !

本书最重要的一个理念就是:在大数据时代,相关性比因果性更重要,同时不要把相关性错当为因果性

Bloomfilter 原理与应用

前言: 本文只讲解原理, 不讲解BloomFilter中各项指标的公式的推算, 能让你知道有这么一个东西(what), 他能达到什么效果(why), 是如何做到的(how).
(What)

Bloom Filter 是用一个 位数组(数组的每个元素不是1就是0) 来表示一个大的元素集合, 而且通过这个数组就可以判断某个元素是不是属于这个集合

大大节省了空间, 但是有代价的, 就是有一定的错误率(为什么会有, 后面举个例说明一下)
假定我们有一个已知的集合,  S = {a1, a2, ... , an} (这里的元素不仅仅是数字, 而是泛指所有对象), 我们要判断一个元素 x 是否属于这个集合, 普通的做法有两种形式:
     1. 遍历 比较,  性能和S的大小成反比     (时间问题)
     2. hash+链表(传说中的hashMap), 速度较快, 但是要把集合的所有数据都存进内存   (空间问题)
在性能要求高, 而且空间不足的情况下, BloomFilter就派上用场了
(Why)
BloomFilter能解决什么问题?
     以少量的内存空间判断一个 元素 是否属于这个集合, 代价是有一定的错误率
(How)
工作原理
     1. 初始化一个数组, 所有位标为0,  A={x1, x2, x3,...,xm}  (x1, x2, x3,...,xm 初始为0)
     2. 将已知集合S中的每一个数组, 按以下方式映射到A中
          2.0  选取n个互相独立的hash函数 h1, h2, ... hk
          2.1  将元素通过以上hash函数得到一组索引值 h1(xi), h2(xi),...,hk(xi)
          2.2  将集合A中的上述索引值标记为1(如果不同元素有重复, 则重复覆盖为1, 这是一个觅等操作)
     3.  对于一个元素x, 将其根据2.0中选取的hash函数, 进行hash, 得到一组索引值 h1(x), h2(x), ...,hk(x)
          如果集合A中的这些索引位置上的值都是1, 表示这个元素属于集合S, 否则则不属于S
几个前提
     1. hash函数的计算不能性能太差, 否则得不偿失
     2. 任意两个hash函数之间必须是独立的.
          即任意两个hash函数不存在单一相关性, 否则hash到其中一个索引上的元素也必定会hash到另一个相关的索引上, 这样多个hash没有意义
错误率
     工作原理的第3步, 的出来的结论, 一个是绝对靠谱的, 一个是不能100%靠谱的.
     如果集合A中的这些索引位置上的值都是1, 表示这个元素属于集合S, 否则则不属于S     标红的这句话是绝对靠谱的.
     至于错误率有多大, 我这里不想去推算, 后面会给出参考文章, 不在本文的讨论范围, 很简单就能举个例子说明错误率是存在的
         当A长度不是很大时, 很容易出现一种情况, 使得A上的元素全部被标记为1了, 这时所有的元素都会被认为是S里的元素, 所以, 错误率是存在的!
          (可以看出, 错误的大小跟A的长度以及hash函数的个数有关)
(In Action)
应用
1. 假如你有一个很大的商品库(亿级别), 然后你要做一个浏览型的网站, 这时候, 你不可能把所有的商品都丢给用户去浏览, 而是从商品中挑选出部分属于
     "精品"的商品来给用户浏览, 提高用户体验和转化率, 你对你的精品库建立一套搜索引擎
2. 由于互动需要, 你需要对你维护的精品库的商品数据实时更新动态, 比如XXX在某时间给了一个"好评",  "购买了一笔", "赞","喜欢"等等
3. 为了实现这种实时更新, 你通过MQ订阅了商品相关的消息(notify)(交易, 评价, SNS), 只要商品发生动态就会发送给你的系统.
4. 这时候, 由于全网的商品很多, 发生动态的消息很多情况下是跟你的精品库没有关系的, 这时候你需要挡掉这些消息, 不进行处理.
5. 此时, 不可能每来一个商品数据你先通过搜索引擎判断一下商品不是在你的精品库内(效率问题, 压力问题), 这时候, bloomFilter派送用场了.
6. 从上面错误率的点, 我们可以看到, 如果一个元素被BloomFilter判断为不属于原有的集合, 那么这个元素是肯定不属于这个集合的(被排除的准确率是100%的)
     通过bloomfilter的几项指标, 就可以挡掉大多数没有相关的数据, 而只处理有关系(虽然有部分无关)的数据了.
(Graphics)附图一张
参考文章:
     http://blog.csdn.net/jiaomeng/article/details/1495500
     http://en.wikipedia.org/wiki/Bloom_filter