⑴ 给师弟师妹们学习数据挖掘的一些建议
给师弟师妹们学习数据挖掘的一些建议
看着刚进实验室的师弟师妹们的迷茫,虽然也与他们进行过一些零散的交谈,但是都不够系统。因此,根据自己的经历给出学习数据挖掘的一些建议,大家可以根据自身的情况,具体问题具体分析,作为参考。希望在上一届的基础上,走的更深,走的更远。
一. 读研与数据挖掘基础
首先介绍一下大家都比较关心的几个问题,包括我们组的研究方向是什么,论文相关问题,大数据与工作相关问题,上海户口问题几个方面。
1. 我们组的研究方向是什么
我们组大的研究方向是数据挖掘,论文的研究方向是推荐算法。要注意大的研究方向,论文的研究方向与工作方向的区别和联系。
2. 论文相关问题
读研究生免不了会思考一个问题,读研的意义是什么?我自己认为读研的最大意义是训练自己系统化的严谨的分析思维能力。在导师给定论文研究方向后,如何确立更细的研究方向,如何检索资料,如何阅读英文论文,如何提出自己的创新点,如何做实验,如何写论文,如何修改论文,如何投稿,如何退修,如果是国际会议,还要去做英文口头报告,与同行交流等,这些问题都是需要自己去思考的。
3. 大数据与工作相关问题
数据挖掘属于大数据专业吗?当然属于。现在大数据找工作相对还是比较理想的。关键是要学习哪些课程呢?以前给大家推荐了很多的书籍,但是效果却恰恰相反,因为实在太多了根本看不完,更不知阅读书籍的顺序,浅尝辄止,最后一本书也没有看完,研究生就结束了。
(1)最低保障书籍
无论将来做什么,熟练掌握一门编程语言,一个数据库,数据结构,算法都是必备的。
《高性能MySQL》
《数据结构与算法分析:java语言描述》
《算法》:http://book.douban.com/subject/19952400/
(2)Python与机器学习
《集体智慧编程》
《社交网站的数据挖掘与分析》
《数据挖掘:概念与技术》
Python官方文档:https://www.python.org/
Scikit-Learn官方文档:http://scikit-learn.org/stable/
(3)Java相关书籍
《Java开发实战经典》
《Java Web开发实战经典》
《Java虚拟机规范》
Java SE:http://docs.oracle.com/javase/8/docs/api/
Java EE:http://docs.oracle.com/javaee/6/api/
(4)Hadoop与Spark书籍
《大数据日知录:架构与算法》
《Hadoop权威指南》
《大数据Spark企业级实战》
《Scala编程》
Hadoop官方网站:http://spark.apache.org/
Spark官方网站:http://spark.apache.org/
Scala官方网站:http://www.scala-lang.org/
说明:认准目标,耐住性子,一步一步往前走。要把上面推荐的书籍硬着头皮读完,数据挖掘基本也就算是入门了。
4. 上海户口问题
上海户口属于积分制,如果想要在校期间就拿到,那么唯一的方式就是参数每年的研究生数据建模比赛,并且获奖。获奖比例还是很高的。其实,好好学习Python,买本数学建模的书籍看完,看几篇近些年来的获奖论文,比赛时硬着头皮钻研一道题目并且写好论文,基本上都可以获奖。
二. 数据挖掘进阶
数据挖掘涉及多个方向,但是通常从数学统计,数据库和数据仓库,机器学习三个方向来进行研究。当我想学习一个方向的时候,最希望做的事情就是让别人给我列出一个书单。因为我也会给你们列出一个书单,让你们慢慢研究吧。
1. 数学统计
(1)理论数学:复变函数,实变函数,泛函分析,拓扑学,积分变换,微分流形,常微分方程,偏微分方程等。
(2)应用数学:离散数学(集合,逻辑,组合,代数,图论,数论),具体数学,张量分析,数值计算,矩阵论,逼近论,运筹学,凸优化,小波变换,时间序列分析等。
(3)概率:概率论,测度论,随机过程等。
(4)统计:统计学,多元统计,贝叶斯统计,统计模拟,非参数统计,参数统计等。
2. 数据库和数据仓库
《数据库系统概念》
《数据库系统实现》
《数据仓库》
《分布式系统:概念与设计》
3. 机器学习
通信原理;数据挖掘;机器学习;统计学习;自然语言处理;信息检索;模式识别;人工智能;图形图像;机器视觉;语音识别;机器人学等。(这方面的经典书籍都可以看看,后面慢慢补充)
4. 其它书籍
(1)Linux
(2)网络原理,编译原理,组成原理,
(3)JVM
(4)UML
(5)软件工程
(6)设计模式
(7)云计算与Docker
(8)并行计算
(9)需求分析
三. 学习与方法
作为一名软件工程师,需要熟练掌握的工具,如下所示:
(1)博客
除了学习之外,更要思考和总结,把还没有忘却的记忆缓存序列化成为文字,记录在博客中。
(2)语言
大数据常用的语言包括Java,Scala,Python。如果一定要选择精通一门语言,自己选择Scala,同时深度学习JVM。(3)开发工具
自己选择IntelliJ IDEA用于Java和Scala的开发,Eclipse用于Python的开发。
(4)GitHub
每天都要坚持编程,主动参与开源项目。
(5)Linux
工作常用的是Ubuntu 12.04 LTS。
由于时间原因,上面总结的还比较粗糙,算是第一个版本吧,后面还会继续深度总结和完善。
⑵ 数据挖掘方向,Python中还需要学习哪些内容
就题论题,还包括:
1. Python 数据库连接库,例如MySQL 连接库的应用,这决定你的数据从哪里来。这里面涉及到sql语法和数据库基本知识,是你在学习的时候必须一起学会的。
2. Python 做基本数据计算和预处理的库,包括numpy ,scipy,pandas 这三个用得最多。
3. 数据分析和挖掘库,主要是sklearn,Statsmodels。前者是最广泛的机器学习库,后者是侧重于统计分析的库。(要知道统计分析大多时候和数据挖掘都错不能分开使用)
4. 图形展示库。matpotlib,这是用的最多的了。
说完题主本身 要求,楼上几位说的对,你还需要一些关于数据挖掘算法的基本知识和认知,否则即使你调用相关库得到结果,很可能你都不知道怎么解读,如何优化,甚至在什么场景下还如何选择算法等。因此基本知识你得了解。主要包括:
1.统计学相关,看看深入浅出数据分析和漫画统计学吧,虽然是入门的书籍,但很容易懂。
2.数据挖掘相关,看看数据挖掘导论吧,这是讲算法本身得书。
剩下的就是去实践了。有项目就多参与下项目,看看真正的数据挖掘项目是怎么开展的,流程怎样等。没有项目可以去参加一些数据挖掘或机器学习方面的大赛,也是增加经验得好方法。
⑶ 二维小波变换怎样用矩阵来实现
先对来行进行一维的变换,自得到高频H,低频L两部分,然后再对高频H部分做两次滤波,有得到另一组高低频(h1,l1),再对L部分与滤波器卷积,得到一组高低频(h2,l2),这样,二维矩阵就被分解为四个部分了。。。
⑷ java 实现人脸的动漫化 照片用数组存还是image对象提取人脸的什么特征人脸处理常用哪些特征
YOGUAI为保险柜,自动门,考勤等行业提供人脸识别方案。
随着计算机网络和通信技术的发展,信息安全、知识产权保护和身份认证等问题成了一个重要而紧迫的研究课题。身份认证是保证系统安全的必要前提,在多种不同的安全领域都需要准确的身份认证。传统的身份证、智能卡、密码等身份认证方法存在携带不便、容易遗失、不可读或密码易被破解等诸多问题。基于人脸识别技术的身份认证方法与传统的方法相比,具有更好的安全性、可靠性和有效性,因此正越来越受到人们的重视,并逐渐进入社会生活的各个领域。
人脸识别技术具有广泛的应用前景,可以应用到多种不同的安全领域,因其识别特征的独特性、惟一性和相对稳定性,逐渐成为一非常热门的研究课题。许多典型的人脸识别算法和应用系统都是针对标准或特定的人脸数据库,利用库内人脸进行训练,并在相同的库中实现人脸识别。但在软件保护、计算机安全等特殊应用中,身份认证仅针对单个对象进行人脸识别,现有的人脸识别方法并不能胜任这样的识别任务。为此,本文针对单对象人脸识别的特点,讨论了单对象人脸检测和识别的关键技术,在此基础上提出了一种单对象人脸识别算法,实验结果证明了该方法的有效性。
2单对象人脸识别的特点
与典型的人脸识别相比,单对象人脸识别有以下4个方面的特点:
应用领域人脸识别的应用领域很广,如刑侦破案、证件核对、保安监控等,而单对象人脸识别主要应用在软件保护、计算机安全锁、特定对象追踪等领域。
识别系统的目标单对象人脸识别的最终目标是系统必须具有高度的安全性和可靠性,即识别错误率趋于0。虽然降低识别错误率的同时识别率也会降低,但可以通过提示用户调整姿态(如注视摄像头等)加以改善。
肤色模型由于单对象人脸识别仅针对特定的对象,所以人脸检测的肤色模型可采用自适应的方法调整肤色范围。
分类方法单对象人脸识别不存在人脸数据库,常用的最小距离分类法不能够正确识别特定的对象,只能用阈值作为判据。因此,阈值的选取十分重要,阈值过大则容易出现错判,存在安全隐患;而阈值过小又会影响识别效率。
3人脸的检测和归一化
人脸检测是人脸识别的前提。对于给定的图像,人脸检测的目的在于判断图像中是否存在人脸,如果存在,则返回其位置和空间分布。利用人脸肤色和面部特征,将人脸检测分为两个阶段:外脸检测和内脸定位。外脸检测主要利用人脸肤色进行初步的脸区检测,分割出肤色区域;内脸检测是在外脸区域中利用面部几何特征进行验证和定位。
3.1外脸检测
外脸检测的任务是将待检图像中可能的人脸区域找出来并加以标记,其步骤如下:
(1)根据人类肤色在色彩空间中存在区域性的特点,将可能为人脸的像素检测出来。为更好地利用肤色特征,同时选用HSI和YcbCr两种色彩空间对图像进行二值化处理,肤色范围限定在H∈[0,46],S∈[0.10,0.72],Cb∈[98,130],Cr∈[128,170]内。将满足条件的像素标记为肤色像素,其余的均为非肤色像素。
(2)去噪处理。在以每一个肤色点为中心的5×5邻域内统计肤色像素的个数,超过半数时中心点保留为肤色,否则认为是非肤色。
(3)将二值图像中的肤色块作区域归并,并对目标区域进行比例、结构分析,过滤掉不可能的人脸区域。目标区域的高度/宽度比例限定在0.8~2.0。
3.2内脸检测和定位
将包含眼、眉、鼻和嘴的区域称为内脸区域。内脸区域能够很好地表达人脸特征,且不易受背景、头发等因素的干扰,因此内脸区域的检测和定位对后续的特征提取和识别至关重要。
在外脸区域的上半部,对二值图像进行水平方向和垂直方向的投影,确定两个包含黑点的矩形区域作为双眼的大致区域。在确定的两个区域中,对黑点进行区域膨胀,可以得到眼睛的基本轮廓和左石眼角,黑点坐标的平均值作为瞳孔的位置。
设左右瞳孔的坐标分别为(Lx,Ly)和(Rx,Ry),两个瞳孔之间的距离为d,根据人脸的几何特征,我们将内脸区域定义为:宽度=-d×1.6,高度=-d×1.8,左上角坐标为(Lx-d×0.3,(Ly Ry)/2-(-d)×0.3)。实验表明,该区域能够很好地表达人脸特征。
3.3内脸区域的归一化
由于各待测图像中的人脸大小具有很大的随机性,因此,有必要对内脸区域进行归一化操作。人脸归一化是指对内脸区域的图像进行缩放变换,得到统一大小的标准图像,实验中,我们规定标准图像的大小为128×128。归一化处理,保证了人脸大小的一致性,体现了人脸在图像平面内的尺寸不变性。
对归一化的人脸图像,采用小波变换与DCT相结合的方法提取人脸特征。首先对人脸图像进行3层小波分解,取低频子图像LL3作为人脸特征提取的对象,从而获得每幅训练样本或测试样本的低频子图像;然后对低频子图像进行离散余弦变换(DCT),DCT系数个数与子图像的大小相等(即256),由于图像DCT变换,能量集中在低频部分,因此只取其中的136个低频系数作为特征向量。
5人脸的识别
完成训练过程并获得待测样本的特征后,即可进行人脸识别,本文采用欧氏距离进行分类。
5.1计算样本与平均脸的欧氏距离
用m和x表示平均脸和样本的特征向量,则样本与平均脸的欧氏距离为:
其中mk表示平均脸的第k个特征向量,xk表示待测样本的第k个特征向量。身份认证时,计算待测样本与平均脸的欧氏距离,并与特定对象的自适应阈值进行比较,将小于阈值的样本判为该对象的人脸,即认证通过。
5.2自适应阈值的选取
与典型的人脸识别方法不同,单对象人脸认识没有人脸数据库,不能用距离最小作为判据,只能用阈值作为判别依据。阈值的选取应兼顾识别率和识别的准确性,实验中我们取训练样本与平均脸的欧氏距离平均值作为分类阈值,即:
其中,N为训练样本数,此值不宜太小;di为第i个样本与平均脸之间的欧氏距离。
莫士特科技有限公司提供模式识别主板及解决方案。
希望采纳
⑸ 数据流详细资料大全
数据流(data stream)是一组有序,有起点和终点的位元组的数据序列。包括输入流和输出流。
数据流最初是通信领域使用的概念,代表传输中所使用的信息的数字编码信号序列。这个概念最初在1998年由Henzinger在文献87中提出,他将数据流定义为“只能以事先规定好的顺序被读取一次的数据的一个序列”。
基本介绍
- 中文名 :数据流
- 外文名 :data stream
- 概念提出人 :Henzinger
- 提出时间 :1998年
- 释义 :以规定顺序被读取一次的数据序列
- 发展原因 :2个
- 数据模式 :4个
- 计算类型 :可分为两类:基本计算和复杂计算
产生背景,细节数据,复杂分析,区别特征,分类,输入流与输出流,缓冲流,模型描述,形式化,数据集合,数据属性,计算类型,相关思路,简介,随机采样,构造略图,直方图,小波变换,新动向,小说流派,
产生背景
数据流套用的产生的发展是以下两个因素的结果:
细节数据
已经能够持续自动产生大量的细节数据。这类数据最早出现于传统的银行和股票交易领域,后来则也出现为地质测量、气象首悉尺、天文观测等方面。尤其是网际网路(网路流量监控,点击流)和无线通信网(通话记录)的出现,产生了大量的数据流类型的数据。我们注意到这类数据大都与地理信息有一定关联,这主要是因为地理信息的维度较大,容易产生这类大量的细节数据。
复杂分析
需要以近实时的方式对更新流进行复杂分析。对以上领域的数据进行复杂分析(如趋势分析,预测)以前往往是(在数据仓库中)脱机进行的,然而一些新的套用(尤其是在网路安全和国家安全领域)对时间都非常敏感,如检测网际网路上的极端事件、欺诈、入侵、异常,复杂人群监控,趋势监控(track trend),探查性分析(exploratory *** yses),和谐度分析(harmonic *** ysis)等,都需要进行在线上的分析。 在此之后,学术界基本认可了这个定义,有的文章也在此基础上对定义稍微进行了修改。例如,S. Guha等[88]认为,数据流是“只能被读取一次或少数几次的点的有序序列”,这里放宽了前述定义中的“一遍”限制。 为什么在数据流的处理中,强调对数据读取次数的限制呢?S. Muthukrishnan[89]指出数据流是指“以非常高的速者高度到来的输入数据”,因此对数据流数据的传输、计算和存储都将变得很困难。在这种情况下,只有在数据最初到达时有机会对其进行一次处理,其他时候很难再存取到这些数据(因为没有也无法保存这些数据)。
区别特征
与传统的关系数据模式区别 B.Babcock等[90]认为数据流模式在以下几个方面不同于传统的关系数据模式: 1. 数据在线上到达; 2. 处理系统无法控制所处理的数据的到达顺序; 3. 数据可能是无限多的; 4. 由于数据量的庞大,数据流中的元素被处理后将被抛弃或存档(archive)。以后再想获取这些数据将会很困难,除非将数据存储在记忆体中,但由于记忆体大小通常远远小于数据流数据的数量,因此实际上通常只能在数据第一次到达时获取数据。
三个 特点 我们认为,当前所研究的数据流计算之所以不同于传统的计算模式,关键在于这些数据流数据本身具有如下三个陆袭特点:
数据的到达—快速 这意味着短时间内可能会有大量的输入数据需要处理。这对处理器和输入输出设备来说都是一个较大的负担,因此对数据流的处理应尽可能简单。
酷睿2处理器 数据的范围—广域 这是指数据属性(维)的取值范围非常大,可能取的值非常多,如地域、手机号码、人、网路节点等。这才是导致数据流无法在记忆体或硬碟中存储的主要原因。如果维度小,即使到来的数据量很大,也可以在较小的存储器中保存这些数据。例如,对于无线通信网来说,同样的100万条通话记录,如果只有1000个用户,那么使用1000个存储单位就可以保存足够多和足够精确的数据来回答“某一用户的累计通话时间有多长”的问题;而如果共有100000个用户,要保存这些信息,就需要100000个存储单位。数据流数据的属性大多与地理信息、IP位址、手机号码等有关,而且往往与时间联系在一起。这时,数据的维度远远超过了记忆体和硬碟容量,这意味着系统无法完整保存这些信息,通常只能在数据到达的时候存取数据一次。
数据到达的时间—持续 数据的持续到达意味着数据量可能是无限的。而且,对数据进行处理的结果不会是最终的结果,因为数据还会不断地到达。因此,对数据流的查询的结果往往不是一次性而是持续的,即随着底层数据的到达而不断返回最新的结果。 以上数据流的特点决定了数据流处理的特点一次存取,持续处理,有限存储, 近似结果,快速回响。 近似结果是在前三个条件限制下产生的必然结果。由于只能存取数据一次,而且只有相对较小的有限空间存储数据,因此产生精确的计算结果通常是不可能的。而将对结果的要求从过去的“精确”改为“近似”后,实现数据流查询的快速回响也就成为了可能。
分类
数据的性质、格式不同,则对流的处理方法也不同,因此,在Java的输入/输出类库中,有不同的流类来对应不同性质的输入/输出流。在java.io包中,基本输入/输出流类可按其读写数据的类型之不同分为两种:位元组流和字元流。
输入流与输出流
数据流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只能读不能写,而输出流只能写不能读。通常程式中使用输入流读出数据,输出流写入数据,就好像数据流入到程式并从程式中流出。采用数据流使程式的输入输出操作独立与相关设备。 输入流可从键盘或档案中获得数据,输出流可向显示器、印表机或档案中传输数据。
缓冲流
为了提高数据的传输效率,通常使用缓冲流(Buffered Stream),即为一个流配有一个缓冲区(buffer),一个缓冲区就是专门用于传输数据的记忆体块。当向一个缓冲流写入数据时,系统不直接传送到外部设备,而是将数据传送到缓冲区。缓冲区自动记录数据,当缓冲区满时,系统将数据全部传送到相应的设备。 当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据。当缓冲区空时,系统就会从相关设备自动读取数据,并读取尽可能多的数据充满缓冲区。
模型描述
我们试图从数据集合、数据属性和计算类型三个不同方面对数据流的模型进行归纳和描述。实际上,很多文章提出了各种各样的数据流模型,我们并没有包括所有这些模型,只是将其中比较重要的和常见的进行了归纳和分类。
形式化
以下是对数据流的一个形式化描述。 考虑向量α,其属性的域为[1..n](秩为n),而且向量α在时间t的状态 α(t)=<α1(t), ...αi(t), ...αn(t) > 在时刻s,α是0向量,即对于所有i,αi(s)=0。对向量的各个分量的更新是以二元组流的形式出现的。即,第t个更新为(i, ct),意味着αi(t)= αi(t . 1) + ct,且对于i. =.i,αi. (t)= αi. (t . 1)。在时刻t发生的查询是针对α(t)的。
数据集合
我们首先考虑在进行数据流计算时,有哪些数据被包含在计算范围之内。关于这个问题,主要有三种不同的模型:分别是数据流模型(data stream model)、滑动视窗模型(sliding window model)和n-of-N模型。 数据流模型(data stream model)在数据流模型中,从某个特定时间开始的所有数据都要被纳入计算范围。此时,s=0,即在时刻0,α是0向量。即这是数据流最初和最普遍的模型。 滑动视窗模型(sliding window model ,计算最近的N个数据)滑动视窗模型是指,从计算时算起,向前追溯的N个数据要被纳入计算范围。此时,s = t . N,即在时刻t . N,α是0向量。换句话说,要计算最近的N个数据。由于数据流的数据是不断涌现的,所以直观的看,这种模式就像用一个不变的视窗,数据随时间的推移经过视窗,出现视窗内的数据就是被计算的数据集合。M. Datar等[91]首先提出这一模式,随后得到了广泛回响[92]。 n-of-N模型(计算最近的n个数据,其中0 <n ≤ N) 文献[93] 提出的这种模型建立在滑动视窗模型的基础之上,比滑动视窗模型更为灵活:被纳入计算范围的是从计算时算起,向前追溯的n个数据。此时,s = t . n,即在时刻t . n,α是0向量。注意,其中n ≤ N,而且是可以随查询要求变化的。而在滑动视窗模型中,n = N而且是固定不变的。对于数据流处理系统来说,要能够回答所有长度小于等于N的滑动视窗问题。
数据属性
数据本身的特征: 时间序列(time series model) 数据按照其属性(实际上就是时间)的顺序前来。在这种情况下,i = t,即一个t时刻的更新为(t, ct)。此时对α的更新操作为αt(t)= ct, 且对于i. =.t,αi. (t)= αi. (t . 1)。这种模型适用于时序数据,如某特定IP的传出的数据,或股票的定期更新数据等。 收款机模型(cash register model) 同一属性的数据相加,数据为正。在这种模型中,ct >=0。这意味着对于所有的i和t来说,αi(t)总是不小于零,而且是递增的。实际上,这种模型被认为是最常用的,例如可以用于对收款机(收款机模型由此得名),各个IP的网路传输量,手机用户的通话时长的监控等等。 十字转门模型(turnstile model) 同一属性的数据相加,数据为正或负。在这种模型中,ct可以大于0也可以小于0。这是最通用的模型。S. Muthukrishnan[89]称其为十字转门模型起因于这种模型的功能就象捷运站的十字转门,可以用来计算有多少人到达和离开,从而得出捷运中的人数。
计算类型
对数据流数据的计算可以分为两类:基本计算和复杂计算。基本计算主要包括对点查询、范围查询和内积查询这三种查询的计算。复杂计算包括对分位数的计算、频繁项的计算以及数据挖掘等。 点查询(Point query) 返回αi(t)的值。 范围查询(Range query) 对于范围查询Q(f, t),返回 t . αi(t) i=f 内积(Inner proct) 对于向量β,α与β的内积 α . β =Σni=1αi(t)βi 分位数(Quantile) 给定一个序号r,返回值v,并确保v在α中的真实排序r.符合以下要求: r . εN ≤ r. ≤ r + εN 其中,ε是精度,N =Σni=1αi(t)。 G. S. Manku等[94]提供了对分位数进行一遍扫描进行近似估计的框架结构,将数据集合看成树的节点,这些节点拥有不同的权重(如节点中包含的数据个数)。认为所有的分位数的估计算法都可以被认为由三个对节点的操作组成产生新节点(NEW) 、合并(COLLAPSE)和输出(OUTPUT)。不同的策略构成了不同类型的树。这个框架结构成为后来很多分位数估计算法的基础。 频繁项(Frequent items)有时也称Heavy hitters,即找出在数据流中频繁出现的项。在这种计算中,实际上令ct =1。这样,αi(t)中保存了截至t时刻,维值等于i的数据到达的频率。对这些数据的查询又可分为两种: 找出头k个最频繁出现的项 找出所有出现频率大于1/k的项 对频率项的研究主要集中在后一种计算[95]。 挖掘对数据流数据进行挖掘涉及更复杂的计算。对这方面的研究包括:多维分析[96],分类分析[97, 98],聚类分析[99–102],以及其他one-pass算法[103]。
相关思路
简介
数据流处理过程中的主要难点在于如何将存储数据所花费的空间控制在一定范围之内。查询回响时间问题虽然也很重要,但相对容易解决。作为研究领域的一个热点,数据流处理问题得到了广泛的研究,出现了很多算法。 解决数据流庞大的数据量与有限的存储空间之间的矛盾的一个思路是使用采样,另一个思路是,构造一个小的、能提供近似结果的数据结构存放压缩的数据流数据,这个结构能存放在存储器中。略图(Sketch)、直方图(histogram)和小波(wavelet)实际上就都是这样的数据结构中最重要的三种。 以上方法实际上大都已用于传统资料库领域,问题在于如何将它们套用于数据流的特殊环境。
随机采样
随机采样(Random sampling)可以通过抽取少量样本来捕捉数据集合的基本特性。一个很常见的简单方法就是一致性采样(uniform sample)。作为一个备选的采样方法分层采样(strati.ed sampling)可以减少数据的不均匀分布所带来的误差。不过,对于复杂的分析,普通的采样算法还是需要太大的空间。 对于数据流的一些特殊计算,已经出现了一些有趣的采样算法。粘采样(Sticky sampling)[95]用于频繁项(frequent items)的计算。粘采样使用的方法是,在记忆体中存放二元组(i,f)所构成的集合S,对于每到来的一个数据,如果其键i已经存在于S,则对应的f加1;否则,以1 r 的机率进行采样,如果该项被选中,在S中增加一组(i,1);每过一段时间,对S中的组进行一遍扫描,对其中的值进行更新。然后增加r的值;结束(或用户要求结果)时,输出所有f.(s-e)N的组。 P. Gibbons提出的distinct sampling[104]用于distinct counting ,即找出数据流中不同值的个数。它使用哈希(hash )函式对每一个到来的不同值以2.(i+1)的机率映射到级别i上;如果i ≥记忆体级别L(L的初始值为0),将其加入记忆体,否则抛弃;记忆体满时,将记忆体中级别为L的值删除,并将L加1;最终对distinct count的估计为记忆体中不同的值乘以2L。distinct counting是资料库处理中的一个老问题,这种算法的优点是,通过设定合适的参数,可套用于带谓词的查询(即对数据流的一个子集进行distinct counting)。 采样算法的缺点是:它们对异常数据不够敏感。而且,即使它们可以很好的套用于普通的数据流模型,但如果要用于滑动视窗模型(sliding window model)[91] 或n-of-N模型[93],还需要进行较大的修改。
构造略图
构造略图(sketching)是指使用随机映射(Random projections)将数据流投射在一个小的存储空间内作为整个数据流的概要,这个小空间存储的概要数据称为略图,可用于近似回答特定的查询。不同的略图可用于对数据流的不同Lp范数的估算,进而这些Lp范数可用于回答其它类型的查询。如L0范数可用于估算数据流的不同值(distinct count);L1范数可用于计算分位数(quantile)和频繁项(frequent items);L2范数可用于估算自连线的长度等等。 略图的概念最早由N. Alon在[105]中提出,从此不断涌现出各种略图及其构造算法。 N. Alon 在[105]中提出的随机略图构造(randomized steching)可以用于对不同Lp范数的估算,最多需要O(n 1. lg n)的空间。该文更重要的贡献在于,它还可以以O(log n + log t)的空间需求估算L2。它的主要思路是,使用哈希函式,将数据属性的域D中的每一个元素一致地随机映射到zi ∈ {.1+ 1}上,令随机变数X = .i αizi,X2就可作为对L2范数的估计。 p1 S. Guha 等[88]提出的分位数略图(quantile sketch) 保持一组形如(vi,gi, Δi)的数据结构,rmax(vi) 和rmin(vi)分别是vi可能的排位的最大和最小值。对于i>j 满足: vi >vj gi = rmin(vi) . rmin(vi . 1) Δi = rmax(vi) . rmin(vi) 随着数据的到来,对此略图进行相应的更新操作,使估算保持在一定的精度之内。X. Lin等[93]对于这个问题做出了更形式化的描述。 若令AS为一个从[1..n]中提取的随机集合,每一个元素被提取的机率为1/2。A. Gilbert 等[106]构造若干个AS,将每个集合中元素值的和称为随机和(random sum)。多个随机和构成一个略图。对αi的估算为 2E(||AS|| |αi ∈ AS) . ||A||, 其中||A||为数据流中所有数的和。因此,这种略图可用于估算点查询的结果。使用多个这样的略图,可用于估算范围查询、分位数查询等。略图技术实际上是空间和精度相权衡的结果。为保证点查询结果的误差小于εN, 上述略图需要的空间通常是以ε.2作为系数的。与此相比较,G. Cormode 等提出的计数-最小略图(Count-Min Sketch )[19]只需要ε.1系数的空间。其思路也比较简单,使用若干个哈希函式将分别数据流投射到多个小的略图上,回答点查询时,每个略图分别作答,并选择值最小的作为答案。以点查询为基础,计数-最小略图可以用于其它各种查询和复杂计算。计数-最小略图并不计算Lp范数,而是直接计算出点查询的结果,这是它的时空效率比其它略图高的原因之一。
直方图
直方图(histogram)有两个含义:一个是普通意义上的直方图,是一种用于显示近似统计的视觉手段;另外,它还是一种捕捉数据的近似分布的数据结构/方法。作为后者出现时时,直方图是这样构造的:将数据按其属性分到多个不相交的子集(称为桶)并用某种统一的方式近似表示桶中的值[107]。
直方图 直方图方法主要用于信号处理、统计、图像处理、计算机视觉和资料库。在资料库领域,直方图原先主要用于选择性估计(selectivity estimation),用于选择查询最佳化和近似查询处理。直方图是一种最简单、最灵活的近似处理方法,同时也是最有效的一种。只要解决好数据更新问题,就可以将原有的直方图运用到数据流处理中。这类根据新的数据自动调节的直方图被称为动态(或自适应/自调节)直方图。 L. Fu等[108]提出的直方图主要用于中值函式(Median )和其他分位数函式的计算,可用于近似计算,也可用于精确查询。它通过确定性分桶(Deterministic Bucketing )和随机分桶(Randomized Bucketing )技术,构造多个不同精度的桶(buckets),然后将输入数据逐级分到这些桶中,从而完成了动态直方图的构造。 由于将静态直方图直接套用到数据流处理比较困难。S. Guha等[88]虽然可以动态地构造近最优的V-optimal 直方图,但只能套用于时间序列模型(time series model) 下的数据流。 一个常采用的方法是将整个算法分为两步:首先构造一个数据流数据的略图;然后从这个略图中构造合适的直方图。这种方法可以利用略图数据易于更新的特点,又能实现直方图的动态化。N. Thaper等[109]首先是构造一个近似反映数据流数据的略图,利用略图的优良的更新性能来实现数据的更新,然后从这个略图中导出一个直方图来实现对数据流数据的近似。由于从略图中导出最佳的直方图是一个NP-hard问题,作者提供了一个启发式算法(贪婪算法)来搜寻一个较佳的直方图。 A. Gilbert等[110]构造了一个概要的数据结构,该结构使用一组与文献[106]中类似的随机和结构来保存不同粒度级别的dyadic interval的值。随后,将不同粒度级别的dyadic interval([111])从大到小地加入所要构造的直方图中,这样就将近似误差降到最低(求精)。 A. Gilbert等在文献[112]中主要考虑的是如何降低对数据流中每个输入数据的处理复杂度。他们先将输入数据转化为小波系数(利用小波系数是信号与基向量的内积),然后采用了与文献[110]类似的dyadic interval处理方法。略图与直方图有很密切的联系,从某种方面来说,可以认为直方图是略图的一种特殊情况。
小波变换
小波变换(wavelet transformation)常用于生成数据的概要信息。这是因为通常小波系数只有很少一部分是重要的,大部分系数或者值很小,或者本身不重要。所以,如果忽略数据经过小波变换后生成的不重要系数,就可以使用很少的空间完成对原数据的近似。 Y. Matias等首先针对数据流数据构造一个直方图,使用小波对其进行模拟。随后保留若干最重要的小波系数实现对直方图的模拟。当新的数据出现时,通过对这些小波系数进行更新以实现直方图的更新。 文献提出的实际上是一种直方图方法,只不过使用了小波变换。A. Gilbert等指出小波变换可以认为是信号与一组正交的长度为N的向量集合所作的内积,因此构造一组数据流数据的略图,由于略图可以相当容易和准确地计算信号与一组向量的内积,则可以从略图计算出小波系数,从而用于点查询和范围查询的估计。
新动向
研究人员对数据流处理的研究不断深入,我们认为出现了以下新的动向:
未来略图 引入更多多的的统计 计技技术来构造略图 G. Cormode等主要处理对频繁项的计算。它以前人的主项(majority item ) 算法([116, 117])为基础,使用了error-correcting codes来处理问题。如数据的每一位设立一个计数器,再根据这些计数器的计数结果来推断频繁项集合。 Y. Tao等[118]实质上是对Probabilistic counting (已经广泛地用于资料库领域的distinct counting)在数据流处理的一种套用。
扩展略图 对略图进行扩展,以处理更更复复杂的查询询需需求 Lin等在文献[93]中构造了一个复杂的略图体系,可用于滑动视窗模型(sliding window model )和n-of-N模型的分位数估计,这是简单略图难以做到的。 在滑动视窗模型下,文献[93]将数据按时间顺序分为多个桶,在每个桶中建立略图(精度比要求的高),然后查询时再将这些略图合并(merge),其中对最后一个桶可能需要进行提升(lift )操作。维护时只删除过期的桶,增加新的桶。 在n-of-N model中,文献[93]将数据按EH Partitioning技术分为多个大小不同的桶,在每个桶中建立略图(精度比要求的高),然后查询时再将其中一部分略图合并,可以保证要求的精度,其中对最后一个同可能需要进行提升。
结合时空数据 与时空数据处理的进一步结合: J. Sun等在文献[120]中虽然主要针对时空数据的历史查询和预测处理。然而,文章却强调时空数据是以数据流的形式出现的,处理中也更着重于时空数据的更新性能。 Y. Tao等[118]使用数据流的方法处理时空数据,通过对动态的时空数据构造略图,用于分辨物体是否在多个区域间运动或静止的状态,并估算其数量。而这种问题在原先的时空处理中是很难解决的。
小说流派
网路小说数据流是新兴流派,意思是小说主角实力数据化,和网游属性栏一样的数据显示。