写这篇文章,缘自于前几天部门内部成员们进行了一次部门内部现有涉及的一些算法的review以及整理。不过比较囧的就是,由于boss不在,我们讨论讨论着就成了吐槽大会,倒是有一半时间在吐槽产品以及业务部门了~~不过这也算是一件可喜可贺的事情了,这也可以看做是我们数据部门,已经由开轻型挖掘机向深挖阶段迈步了。
因此,借此机会,也对自己接触过的,了解过的,或者做过的一些勉强称得上算法的东西做一个梳理。其实,就个人来说,本身就不是做算法出身的,在大学时代,学习的反倒是网络方面多一些,更不知数据挖掘算法为何物。 其实,就所谓算法而言,个人认为,我有个同事说的很对:所谓算法,并不是说那些复杂的数学模型才是算法,哪怕是你写的一个简单的计算公式,只要能够解决现有业务的痛点,有了自己的模型思路,它就是一个算法,只是它可能不够通用,只能解决特定业务需求而已。 在大规模的数据前提下,其实很多复杂的算法过程,反而效果没有这么好,或者说,我们会想方设法去简化其过程。 举个简单栗子:假设有一批大规模数据集,就以近千万篇博文为例。如果提供一篇博文,让你去查询与其相似度最高的top N,那我们的通常思路是什么?通常的做法是计算这篇博文与其他博文的相似度,至于相似度的计算方法就很多了,最简单的就是计算其向量夹角,根据向量夹角判定相似程度。OK,就算你用最简单的计算过程,你试想一下,运算近千万次需要多久?或许,有的人说,俺使用hadoop,利用分布式的计算能力来完成这个任务,但如果实际操作起来,你就会发现这是一个多么蛋疼的事情。 再举一个简单栗子(好吧,多吃点栗子):比如SVM,这是一种难以收敛的算法,在大数据的前提下,有些人希望使用它,但又希望使用更多的数据来训练模型,毕竟手里数据量太大,很多人还是希望使用尽量多的数据训练的,以达到模型更准确的目的。但是,随着训练数据量的增大,像SVM这种难以收敛的算法,其耗费的计算资源还是很巨大的。 东拉西扯说了这么多,自个的梳理工作还没有完成呢! 一、这些年,我开过的挖掘机 (1)最早接触的应该是贝叶斯的分类了 贝叶斯算是分类算法中最简单的算法了,初学挖掘机算法的人十有八九第一个爱上的绝对是它。其实,贝叶斯的原理真的很简单,就是依据统计学的最大概率原理。这么简单,但是就是尼玛这么好用,多年依然屹立不倒。 训练过程就缺乏可陈了,基本上贝叶斯的都这样,由于是文本,所以一套流程下来,分词,去停词,作为最基本的知识点向量,然后就计算模型概率了。不过比较有趣的是,分类过程是放在Storm里头做的,相当于这是一个实时的分类业务。 (2)说到了文本,自然少不了分词算法了 其实说到分词算法,反倒没啥可说的。如今互联网上各种开源的分词工具,都已经做的很好了,效果也差不了多少,想进一步改进的话也够呛。至于说深入到分词算法的内部,涉及上下文法分析,隐含马尔科夫模型等东西,如果是个人出于兴趣去研究,那我没话说;如果是小公司,花费人力物力去优化分词效果,我只能说他们闲着蛋疼;如果是大公司,人家金多任性也是可以理解的。 所以,至今来说,个人对于分词方面的东西,也仅限于初步了解分词算法的衍变,内部大概涉及的算法,以及几种分词工具的使用。 其实,在文本挖掘方面,仅仅针对于文本的分词是不够的,因为我们使用分词拆分出来的单词,往往很多跟业务都是没有关系的,通常做法是,建立对应业务字典,至于字典的建立,当然也是需要分词的,再进行进一步的加工,甚至可能会加上一些人工的工作。 (3)下一个就是实时热点分析了 我也不知道这算不算是算法,说到实时,自然跟Storm又有关系了(好吧,我承认我是搞这个之后开始接触数据的)。说到实时热点,可能大伙儿都摸不着头脑,举个简单栗子就明了了。 玩hadoop的童鞋都知道WordCount这个经典栗子,MapReduce在Map到Reduce的过程中,自动将相同的Key通过类似hash的方法聚合到一起了,所以,统计单词这个需求通过MR来做是辣么的简单。 那Storm的实时WordCount呢?好吧,这也是一个能够记录到实时技术领域史书上的经典案例(好吧,其实它就是一个Storm的HelloWorld)。Storm虽然没有类似MR那种自动Hash的功能,不过它也提供了一种数据分组流策略,也能达到类似的效果,并且它不像MR那样是批量的,它是实时的、流式的,也就是说你能动态的获取到当前变换的单词词频。 (责任编辑:admin) |