当今社会数据量呈指数级增长,这些数据来自于用户行为监测系统、分布式系统、网络分析、
传感器等。移动互联网的迅速发展又带来移动数据的增长,此外,下一个大潮流——物联网
(Internet of Things,IoT)又会进一步提升数据增长速度。
挖掘大数据需要有新思路。运行时间很长的复杂算法要么改进要么抛弃,而能够处理更多数
据,复杂程度相对简单的算法正变得更加流行起来。例如,支持向量机是很好的分类器,但是它
的一些变种很难在大型数据集上使用。相反,逻辑回归等相对简单的算法处理大数据集更容易。
(1) 海量(Volume):我们产生和存储的数据量加速增长,未来势头看起来会更猛。现在常用
的硬盘容量单位为GB,再过几年就会变为EB 1 。同时网络吞吐量也会增长。信噪比不容乐观,
重要信息很可能被海量重要程度低的信息湮没。
(2) 高速(Velocity):数据量增长的同时,数据处理速度在加快。就拿现如今的汽车举例子,每辆车装有成百上千个传感器,这些传感器不停地向汽车内置的计算机传送数据,要完成操纵汽车的任务,数据的分析处理速度需要达到次秒级水准。这不仅要从大量数据中寻找答案,还得速度快。
(3) 多样(Variety):数据集有多种形式,各列清晰定义的规整数据集只占其中很少一部分。想想社交网站的一条消息吧,它可能包含文本、照片、提及其他用户、喜欢数、评论数、视频、地理位置信息等。简单地忽略掉这些难以整合进模型的数据势必会导致信息丢失。
(4) 准确(Veracity):随着数据量的增加,很难确定采集到的数据是否正确——是否过时、充满噪音,有没有包含异常数据,或者总体来说是否有用等。倘若人们无法对数据的准确性进行有效验证,要信赖数据很难。人们从外部得到的数据集被不停地整合到内部数据集中,使得数据的准确性这个问题更加突出。
通常情况下处理内存中的数据,要比从硬盘中处理数据快捷的多。对于大数据,我们无法将其加载到内存中。从很多方面来讲,可以用此来判断一个问题能不能称得上大数据问题——如果数据可以加载到你计算机内存中,那就算不上大数据。
大数据挖掘和计算有几个主要概念,其中最为流行的就是MapReduce模型,它可用于任意大数据集的一般性计算任务。
MapReduce主要分为两步:映射(Map)和规约(Reduce)。函数式程序设计中有把函数映射到列表和规约结果的概念,MapReduce以这两个概念为基础。MapReduce范式还包括排序(shuffle)和合并(combine)两步。
为了解释映射和规约,我们举个例子,编写代码遍历一串列表,计算所有列表中数字之和。
a = [[1,2,1], [3,2], [4,9,1,2,0]]
映射
建立 sum 函数和 a 之间的映射关系。这一步会用 sum 函数处理列表 a 的每一个元素。
sums = map(sum, a)
print(sums)
# 输出
>>>
上述 sums 为生成器(在我们调用它之前,不会进行计算),上面这行代码大体上等价于:
sums1 = []
for sublist in a:
results = sum(sublist)
sums1.append(results)
print(sums1)
输出结果为:[4, 5, 16]
规约
规约要求对返回的结果的每一个元素应用一个函数,从初值开始,对初值的第一个值应用指定函数,得到返回结果,然后再对所得到的结果和下一个值应用指定函数,以此类推……
我们这里对指定的函数为和函数,我们先来定义这个和函数。
之后进行规约。规约函数形式为 reduce(function, sequence, initial) ,参数分别表示用来进行规约的函数的名字、列表和初始值,函数即是对序列的每一步所应用的函数。在第一步,第一个值为初始值,而不是列表的第一个元素。
def add(a, b):
return a+b
from functools import reduce
print(reduce(add, sums, 0))
输出结果是:25
上面代码等价于如下代码:
initial = 0
current_result = initial
for element in sums:
current_result = add(current_result, element)
我们这里可以明白,对于映射而言,就是告诉每一个分布式的机器该做什么具体工作。规约就是将分布式机器做的具体工作结果汇总,然后把结果分布式机器提交的结果进行最终处理。
参考资料
《Python数据挖掘入门与实践》