现在的位置: 首页 > 综合 > 正文

时间序列理论专题之一 前言

2012年11月13日 ⁄ 综合 ⁄ 共 2547字 ⁄ 字号 评论关闭

       时间序列方面的知识,在宏观经济分析、气象预报、DNA分析、金融分析、营销数据、语音分析、搜索引擎等领域,大有用武之地。具体来说,你会碰到下面的这些情形:

         1、你怎样找出和用户浏览的文章相关的文章?

         2、你怎么判断搜索到的两篇文章是同一篇文章?

         3、你怎样找出网站用户不同的浏览爱好,将这些用户作为一组互相推荐给对方?

         4、你怎样判断最近一个月每天的销售量走势,和历史上哪些月份比较相似,后续的走势可能怎样?

         5、你怎样在股票的行情中,找出符合某种条件的所有历史走势?

         6、你怎样从最近十年白菜的价格走势中找出规律,并即时为各个城市提供预警?

         7、你怎样从城市里每个企业的税收记录中,找出有可能逃税的企业?

          ……

 

          很多很多,当然,这些都属于数据挖掘的范围,局限一点,多数问题可以使用时间序列理论解决,既直观也比较好向用户解释清楚。

       不过多数程序员,并没有接触这方面的东西,目前也不存在一本通俗的教材,能够一次性解决问题。所以,当我在实际的项目中,遇到这类问题的时候,为掌握相关知识,在两周内查阅了大量的教材、介绍文章、论文,晕头转向的情形下,总算正常完成任务。这个过程非常辛苦,估计至少消耗了60个小时的有效工作时间。

       所以辛苦,是因为这个领域的研究者们,基本上是书呆子,实在太过变态。你可以看到那些金融计量专业的学生津津乐道的教材,满是水分,该有的没有,不该有的全有。相关的论文则满纸公式,讲理论很少涉及到具体的应用,讲原理则往往让你云山雾罩。项目完毕后,一声叹息,这些弄算法的简直变态到我们程序员这种级别了,共同的特点是,不会说人话。

        有鉴于此,决定将时间序列方面相关的知识,归纳一下,算是为“程序员数学”奉献一份特定领域的入门资料。从这个角度来说,这也为其他有需要的程序员节省一点时间,以突显我本人在特定的时段,还算是半个好人。作为前言,下面回答几个简单的问题:

        我们需要掌握哪些技能?在实际应用中,我们常常需要实现时间序列的搜索、对搜索结果集合聚类、检测异常。同时,由于时间序列往往处理的是海量数据,为提高性能,将其分段线性表示是必要的。为了实现搜索功能,当然需要了解相似性度量的方法。

        学习的方法是什么?从我个人角度来说是“始终把握自己的目的”、“理解”和“选择”。一篇线性分段算法的论文,用不超过半小时的时间看完,你需要理解他这样分段的物理概念是什么、数学依据在哪里、适合哪些情形、问题在哪里、与其他算法的区别在哪里。如果超过了半小时,对不起,仅仅线性分段的算法方面的论文,大致上你能找到几百篇,每篇都有号称独创的算法,你用哪一个、你为什么用这一个、哪一篇论文完全可以看看简介就忽略掉?理解的基础上,选择就相对简单些,从你的目的出发:我希望如此如此,嗯,这六七种算法中,这一种最为接近,应该怎样改进一下?比如在相关的项目中,我面临的选择是:使用什么方式进行分段、使用什么方式调节分段的压缩比例获得关键点序列、使用什么方式处理相似性度量的序列选取问题、使用什么方式判断两个序列是否相似、使用什么方式在长序列中搜索短序列,这些选择每一个环节都比较了十种以上不同算法之后,才得定论。

        为什么每个环节都有很多不同种类的算法?三个原因:首先,各类时间序列的特征不同,比如有的是平稳的曲线、有的则是不停上下突变的曲线,有的需要考虑尖峰(比如心电图),有的需要去除噪声(比如股票的日线图),因此,分段、搜索、搜索结果分析的方法也就不同。其次,我们对各类时间序列分析的目的也不相同,比如心电图的分析,正常人的序列是平稳波动、有规律的,由此能够计算心率之类的指标,但突然的、零星的出现的尖峰,则是我们关注的重点,这个很显然是心脏疾病的特征。而在股票日线的分析中,我们需要找到符合某种模式的走势、或者对大幅上涨或者大幅下跌的情形之前的走势进行聚类,寻找规律,因此我们更关注的是正常的搜索而不是异常的检测。最后,是我们这个国度令人烦恼的论文制度,我看到的很多论文都属于某个科技基金赞助的项目,事实上多半的论文毫无价值,但无论是教授也好、硕士博士生也好,他们总得写一点,要写论文,至少就要从自己的脑袋中生造一种略有不同的算法,或者照抄国外已有的国内没人注意到的算法,我甚至看到,某篇论文讲解了一种使用角度描述分段序列的方法,另外一篇论文号称是改进这个算法,认为前篇论文没有考虑分段的长度问题,加入了一个长度权重,但实际上那篇论文在存储数据的时候已经保存并处理了各片段的时间,这种所谓改进实际上完全是无的放矢。

        需要哪些数学基础?真正的理解这个领域的所有东西,需要空间几何、动态规划、概率统计、神经网络、遗传算法、等等很多的数学基础知识,害怕吧?不过,接下来我会尽量的控制,让这个范围尽量局限在高中数学的范畴里。没有那么复杂,所谓数学,无非是每提高一个层次,就多一些术语的问题,去掉这些术语,很多知识可以简单的实用化的去理解。我非常非常的同情包括我本人在内的大部分的程序员,因为大学毕业多年后,他们早已经遗忘了极限、导数甚至三角函数这些基本的知识,基于这种同情,完全有必要用最粗浅的数学基础来讲清楚这所谓高深的时间序列理论。

        我会怎样的讲解?将分成如下的专题分别描述: 1、时间序列的表达;2、时间序列分段线性表示(让序列变短,但保留基本形状);3、时间序列的相似性度量(两个序列怎样叫相似?);4、时间序列搜索(怎样在长序列中找到短序列?);5、时间序列搜索结果的聚类(哪个区间的价格结果最多,占多大比例?);6、时间序列的异常检测(哪里的数据发生了突变?)。第6项可能会忽略,因为我在项目中并没有碰到这个问题。这个过程中,我会尽量使用人类的语言描述,以避免读者遇到我所经历过的半个月的煎熬。  

        当然,本系列的文字版权所有,仅供阅读,拒绝转载,拒绝程度万分强烈。本系列从2011年1月11日开始撰写,目的是为了内部开发团队的专题培训,预期在1月31日以前完成。

抱歉!评论已关闭.