大数据处理系统:Hadoop源代码情景分析
上QQ阅读APP看书,第一时间看更新

1.2 大数据的用途

有了大数据之后,我们能对这些数据做些什么,能拿它来做什么用,又为什么重要呢?概言之,大数据可以帮助我们更好地了解和认识客观世界,从而使我们可以更好地适应、利用和改造客观世界。

我们对客观世界的认识来自对客观存在的反映,是对来自客观世界的各种刺激的反应。客观存在不仅是自然的、物质的,也是社会的、精神的,别人的主观感受(如时尚)对我们来说也是一种客观存在。而数据,就是对客观存在的记录和反映。除亲身感受之外最好的办法就是通过数据了解世界。但是单项的数据只能是片面的、表面的、个别的,这就需要我们把数据关联和整合起来。

在某种意义上,人类对于客观世界的认知是一个自觉或不自觉、精确或模糊、彻底或不彻底地运用贝叶斯方法求解逆向概率的过程。贝叶斯是18世纪的一个英国业余数学家。所谓贝叶斯方法,一言以概之就是从某种认知(人的认知一定带有主观性)开始,不断根据新的观察所得更新我们的认知,以逼近客观真实并减小不确定性。显然,这是一种反映论的认知过程。后来法国数学家拉普拉斯将其叙述为求逆向概率的过程,并提出了“贝叶斯公式”(其实应该称为“贝叶斯—拉普拉斯公式”)。什么叫逆向概率呢?我们举个例子:假定一个袋子里有100个小球,其中70个是白的、30个是黑的,现在随机从袋子里摸取,问摸得白球的概率是多少?这是正向的概率问题。现在把问题变一下。我们不知道袋子里那些球的颜色,但是摸了5次是3白2黑,于是我们就猜只有这么两种颜色,而且白和黑的比例是3∶2,可是这个猜测正确的概率有多大呢?然后再摸两次都是白的,那么原先猜测的比例即3∶2(仍有可能)正确的概率是多少?而5∶2的概率又是多少?这就是逆向概率的问题。联想一下市场调查、精准营销,我们不就是在根据销售数据来推断顾客对某些商品或服务的喜好程度吗?不仅如此,我们在科学研究中采用的归纳法,其实也是这么个过程。当然,这些过程中也要用到正向概率,贝叶斯公式本身就是建立在正向概率和条件概率基础上的。

但是我们不可能把所有的数据都拿来用于某种特定逆向概率的计算,而只能采用那些相关的数据;不相关的数据就只能暂时留作别用,也许某一天会用于别的逆向概率的计算,或发现其实存在着某种相关。而且,我们也不一定是先有了计算某个概率的明确目标而去筛选相关的数据;有时候倒是反过来,先发现某些数据之间有关联,才想到这里面存在着某种可能性、某种逆向概率。所以首先我们得知道哪些数据是互相关联的。所谓数据间的相关性(correlation),就是数据之间有什么内在联系(linkage)、有什么关系(relationship)的意思。从数据中寻找、发现、验证、利用(尤其是用于逆向概率的计算)相关性,就称为“数据挖掘”。实际上,逆向概率本身就代表着一种相关性,而不是因果性。人们在决策的时候当然最好是根据因果性,就像我们运用物理定律一样,然而有很多现象我们一时还不知道因果,可是却知道某些现象之间相关,在这样的情况下就只能退而求其次地根据相关性决策,而且这往往也确实有效。比方说有许多民间验方,我们并不知道其所以能治病的原因,但是很多人试过了,证明这个方子与某种疾病之间确实相关,按这个方子服药病就好了,那么我们就根据这个相关性决策服药。尽管此时我们并不知道这里面的原因,但却知道情况确实如此。

Jeffrey Ullman教授(他在编译原理、计算理论、数据库方面的著作都已成为经典)在Mining of Massive Datasets一书中说,对于“数据挖掘”最广泛接受的定义是:在数据中发现模型(the discovery of“models”for data)。我们不妨把这句话改成更容易理解的“在数据中发现规律”。但是一下子就要“发现规律”似乎要求太高了,“发现相关性”应该更实际一些。

既然我们人的认知及其与数据的关系是这样的,那么实现“人工智能”的机器也大体如此,因为现在的人工智能都是对人的模仿。而“机器学习”,则是对人的认知过程的模仿。拿大量数据样本来“训练”机器,就是在模仿人从小接收大量外界刺激以获得知识的过程。可以推测,机器学习的过程一定隐含着某种形式的数据挖掘。试想我们拿1亿个样本来训练一个神经元网络,如果这1亿个样本都是随机生成的,互相之间毫不相关,就像“白噪声”一样,那这个机器能学到什么?机器之所以可训练,根本的原因就是用于训练的样本之间存在相关性。其实人也一样,如果我们在训练(教育)一个小孩时,今天这样说,明天又那样说,前言不搭后语,也没有个一以贯之的逻辑,那么这个孩子非被训练傻了不可。

由此可见,从数据里面寻找、发现、验证相关性,并加以利用,是人们处理和利用大数据的核心所在。

人们对于大数据的处理大体上可以分成四个方面:业务处理、常规统计分析、数据挖掘和机器学习。

1.业务处理

业务处理一般是实时的OLTP,即“在线事务处理(online transaction processing)”。比方说,一个计算机集群与证券交易所连线,实时对发生的证券交易记录进行分析,立即自动做出买进或卖出的决策和操作,这样的处理就是OLTP。

2.常规统计分析

常规统计分析一般是指那些事先(数据产生和采集之前)就有计划要进行的、设计意图之内的统计分析。正因为是事先计划好的,所以采集的数据通常是有结构、有格式的,相应的数据库也有事先设计好的“模式(schema)”,并且一般都采用关系式数据库。至于具体的统计项目,则大多是些常规的内容,包括,比方说,中值、均值、分布、标准差等。对于这些事先计划好的常规统计分析,(相同性质、相同结构的)数据量增大的意义在于样本数的增大,而样本数增大则更能满足“大数定理”的条件,使统计结果更加精确和可信。但是,单纯的常规统计分析一般不大会使人有意外的发现。

3.数据挖掘

数据挖掘(data mining)也是一种统计分析,或者依赖于统计分析。但是,与常规统计分析不同,数据挖掘的目标常常是“计划外”的,而挖掘的目的是想要在数据中寻找和发现(原先不确切知道的)相关性,所以最感兴趣的统计项目往往就是相关系数。当然,具体的计算可能也会包括均值、分布、标准差等,但那都是为发现相关性和逆向概率服务的。不过也有些时候相关性本身是明白无误的,而目的则变成了依此将不同来源的数据整合在一起,相当于关系数据库中的j oin操作,用碎片拼凑全貌。可以说,想要从大数据获益,在很大程度上要靠意外发现,而意外发现主要来自数据挖掘。数据挖掘可以是在线的,但一般都不是实时的,往往跟具体业务的进行没有直接的关系,目的只在于对已有数据的分析,所以称为OLAP,即“在线分析处理(online analytical processing)”。其实,数据挖掘也常常是离线(offline)的,或者说是关起门来进行的。不过“数据挖掘”这个词的使用也并非很严格,例如人们常常把从大量数据中过滤出所需数据也看成挖掘。

4.机器学习

如前所述,机器学习(machine learning)是一种人工智能方法,目的是通过使用大量数据的“训练”使机器(计算机)形成智能,用于计算机辅助或自动判断决策。人工智能的形成有两大种方法,或者说两种流派。一种是对人类大脑的模仿,这种方法着重于推理,在学习的过程中从训练数据中抽取特征以形成基础事实和推理规则。有了推理规则之后,遇到有数据输入就运用这些规则进行推理,以得出判断和决策,同时也使推理规则进一步完善和准确。具体采用的是知识库、规则库、推理引擎之类的传统技术。另一种是对人类小脑的模仿,这种方法着重于使机器通过训练形成类似于“条件反射”和直觉那样的机制,而并不依赖于显式的推理。这就好像人类产生条件反射时对外界刺激的反应是“下意识”的,并不经过大脑思考推理,所以反应速度很快。具体采用的技术则是神经元网络,特别是“深度学习”的深层神经元网络。其实,对神经元网络的训练相当程度上就是个隐性的发现相关性的过程。

本书主要针对大数据处理平台Hadoop,虽然在这个平台上也能做一些机器学习的处理,但Hadoop主要并不是用来做机器学习的,也不是用于实时业务处理OLTP的,而是一个用于OLAP的平台。所以我们更关注的是数据挖掘。不过常规统计分析、数据挖掘、机器学习这三者之间并无明确的边界划分,许多计算既可以归入数据挖掘,也可以归入机器学习。其实,从本质上说,Hadoop就是一个批处理式的并行计算平台,只要是这样的计算都可以在Hadoop上进行。所以在Hadoop的代码中就有采用蒙特卡洛方法计算圆周率的示例。

如前所述,数据挖掘的核心是发现数据之间,从而客观事物之间的相关性,而且目标常常是不确定的,带有尝试性质的。这一点可以说再怎么强调也不为过。

数据是对于客观世界的反映,是对客观事物的描述和记录。可是没有一种描述和记录能够做到完全和准确,任何一种描述和记录都难免是片面的和失真的。许多本来是互相关联、有很高相关性的信息,到了不同角度、不同视野、不同粒度、不同主观感受的记录中,可能就变成孤立而片面,甚至是扭曲的了。而实际存在的相关性,则就隐藏在这些数据之间。我们在做研究的时候常常要拿不同来源的数据加以参照和引证,就是这个道理。所以,数据间的相关性来源于客观事物本身之间的相关性,而数据挖掘则是企图在尽可能大量、尽可能广泛和多元的数据中发现客观事物之间的联系(如果存在的话),以便尽可能真实地还原客观事物的本来面目,帮助决策和判断。

相比之下,在单一来源的、预先设计好的数据中,就难有互相参照引证的作用,不太容易发现预期之外的相关性了。当然这也不是绝对的,在单一来源的数据中有意外的发现也是有可能的。我们不妨假定有这样一种情景:数据库中有1000万人的登记表,其中每个人都有出生年份,还有好多方面的信息,其中有个人的业余爱好。这样的登记表当然是预先设计好的,然而经过一些分析和整理之后我们也许发现这些人的业余爱好随出生年份呈现明显的周期性,比方说哪几年出生的人中喜欢数理的比例偏高,而且以多少年的周期起伏变化,而哪几年出生的人中则喜欢艺术的比例偏高,而且以另一种周期起伏变化。于是我们可能就发现了一种原先不知道的相关性,而且早先设计这种登记表的人也绝没有想到居然会有这样的相关性。至于为什么有这样的相关性,那是另一个有待进一步研究的问题了。同一个数据库中的数据,当然有相关性,但是这里我们却发现了原来不知道的、隐藏着的相关性,所以这也属于数据挖掘。但尽管如此,更多的机会还是发生在多元的数据之间。

“挖掘”这个词,在英文中是mining,这个词翻译得很传神。本来,mining就是采矿的意思,矿产不是人类有预谋地埋在那里的,人们只是根据各种迹象猜想或怀疑某处的地下有矿,就来钻探一下试试,发现有戏才大规模加以开采。“挖掘”并不是拿着祖先留下的“藏宝图”去挖宝,而是带有试试看的意味,难免会是东挖挖、西挖挖,这样挖过来、那样挖过去。所以,数据挖掘的过程常常是对同一批数据反复进行不同处理的过程。

作者有个同学从维基百科下载了整个数据库,从中挖掘有记载的上百万人的专业/职业、成就、性格、地位与其星座即出生月日的相关性,并不无幽默地称之为“计算星座学”。初听之下这似乎“无厘头”,但是其实未必,这里面也可能真有点关系,结论只能产生于调查研究之后。按常理说,人的这些性状与出生月日应该是无关的,因而对于出生月日应该是均匀分布的,但是如果挖掘统计的结果表明确实不均匀,那就只好承认这里面很可能真的相关。当然,这里也许还有样本的数量多少,样本对于其他因素(例如地理因素、当时的社会政治因素等)分布的问题,需要做进一步的挖掘调查。但是如果数据表明真的相关,尽管暂时还不知道原因,那就得承认,进一步还可以根据这些相关性做出某些方面的预测并在实践中加以检验。事实上,后来有哥伦比亚大学医学中心的Tatonetti博士整理了100年中175万人的医疗记录,分析出生月份与1000多种疾病的关联,据称发现有五十几种疾病似乎是与出生月份有些关联的。不过,就目前而言,断言这些疾病确实与出生月份相关也还为时尚早。

还有个朋友在做的研究就更不一般了,他收集了大量的基因信息,试图从中挖掘基因排列的规律。基因的编码就像字符串一样,一个基因就类似于一个字符,然而这些“字符”的排列并非随机,那么这里面有些什么样的“词汇”?这些词汇的排列是否存在某种“语法”?这实际上也可以归结到相关性的问题。“词汇”取决于各种组合的出现频率,“语法”则取决于词汇之间的相关性。所以,这其实也是数据挖掘。

其实,从数据中特别是文字记载中发现相关性的思路和方法早已有之,并非现在才有。以历史研究为例,所谓考证、考据,其实就是在文字记载和历史遗迹中发现相关性的过程。但是从前的数据量太小,手段和设备太原始,跟现在的数据挖掘显然没法比。