这些年,这些挖掘机算法,这些反思 - 推酷

body
{
font-family: Microsoft YaHei UI,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif;
font-size: 10.5pt;
line-height: 1.5;
}
html, body
{

}
h1 {
font-size:1.5em;
font-weight:bold;
}
h2 {
font-size:1.4em;
font-weight:bold;
}
h3 {
font-size:1.3em;
font-weight:bold;
}
h4 {
font-size:1.2em;
font-weight:bold;
}
h5 {
font-size:1.1em;
font-weight:bold;
}
h6 {
font-size:1.0em;
font-weight:bold;
}
img {
border:0;
max-width: 100%;
height: auto !important;
}
blockquote {
margin-top:0px;
margin-bottom:0px;
}
table {
border-collapse:collapse;
border:1px solid #bbbbbb;
}
td {
border-collapse:collapse;
border:1px solid #bbbbbb;
}

写这篇文章,缘自于前几天部门内部成员们进行了一次部门内部现有涉及的一些算法的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那样是批量的,它是实时的、流式的,也就是说你能动态的获取到当前变换的单词词频。

实时热点分析,如果我们把热点映射成单词,那我们是不是就可以实时的获取到当前Top N的热点了。这个方向可是有很大的研究价值的,实时地掌握了用户的热点导向,我们就可以动态的调整业务策略,从而衍生更大的数据价值。

不过,总体来说,这个数据模型更多依靠的是Storm这个实时工具的本身功能,模型设计上的东西反倒是少了。至于说算不算是算法模型,就跟前面所说的那样,看个人看法吧,你说是就是了~~

(4)国内很成熟的一种建模——推荐

就目前在国内做数据挖掘的来说,可能分类与推荐是做的最多的两种方向。分类就不多说了,就比如刚才所说的贝叶斯,简直就是分类中的鼻祖算法了。

可能一说到推荐算法,有人脑海里立马就闪现出关联规则、协同过滤、余弦相似性等这些词。这是没错的,但我要说的不是这个。其实个人想说的是推荐就两个方向:基于用户,基于内容。

我们需要注意两点,我们推荐的对象是用户,或者说是类似用户这种有动作行为的实体;而推荐的东西则就是内容,他没有动作行为,但是他有不同的属性,或者用更砖业说法描述就是他必然有知识点。

基于用户推荐,我们看重的不是内容这个实体,而是用户本身的行为,我们认为用户的行为必然隐含着一些信息,比如,人的兴趣导向,那么既然你有了相关的行为,那么我按照你的行为去给你推荐一些东西,这总是有一定道理的。

基于内容的推荐,我们的侧重点则是内容,这就跟用户的历史行为无关了。我们潜意识的认为,既然你会看这个内容,那么跟这个内容有关系的内容,你是不是也感兴趣呢?或许这样说有失偏颇,但是大体方向是对的。

至于之前说的那些关联规则也好,协同过滤也好,余弦相似性也好,其实就是研究知识点与知识点之间关系所建立的模型。

针对于基于内容推荐,其知识点就是内容之中的各种属性,比如影片推荐,其知识点可能就是各种评论数据、点播数据、顶踩数据、影片类型、演员、导演以及其中的一些情感分析等等;又比如博文,其知识点可能就是一个个带权的词,至于这个词就涉及到词的抽取了,再说到词的权重,可能就会涉及到TFIDF模型、LDA模型了。

而针对基于用户,其知识点最直接的体现就是用户的行为了,就是用户与内容之间的关系,不过深究下去,又会发现,其实跟内容的知识点也紧密联系,只不过这可能不止一个内容实体,而是多个内容实体的集合。

(5)文本单词的加权模型

前面正好提到了TFIDF以及LDA模型,所以顺带也就讲讲文本单词相关的加权模型吧。

说到文本挖掘,可能大部分人都熟悉TFIDF模型,既然涉及到了,那就简单的说一说。我们知道,文本的知识点就是一个个的单词,虽然都是单词,但也总有哪个词重要程度高一点,哪些词重要程度会低一点吧。

或许有人会说,出现多的词就重要。没错,那就是词频,简单的来想,这种思路并没有错,并且,早期的文本挖掘模型就是这么做的。当然,效果肯定是一般般的。因为那些经常出现的词往往都是一些没用的常用词,对文章的作用并不大。

直到TFIDF模型的出现,才根本性地解决了文本挖掘知识点建模的问题。如何判断一个词的重要程度,或者专业点的说法就是判断其对文章的贡献度?TFIDF通过词的词频来加大词在文章中的权重,然后通过其在多个文章中的文档频率来降低其在文章中的权重。说白了就是降低了那些公共词的权重,把真正贡献度大的词给暴露出来。这基本就是TFIDF的基本思路了,至于词频权重怎么加大,文档频的权重怎么降低,这就涉及到具体的模型公式了,根据不同的需求进行调整就OK了。

关于文章知识点主题建模的另外一种很重要的模型,那就是LDA模型了。它是一种比较通用的文章主题模型,它通过概率学原理,说白了就是贝叶斯,建立起知识点(也就是词),主题和文章的三层关系结构。词到主题有一个概率矩阵,主题到文章也有一个概率矩阵的映射关系。

好吧,LDA不能再说下去了,再说下去就露馅了。因为,俺也不是很懂啊。对于LDA,虽然部门内部有在使用,但是我没有做过具体的模型,只是和同事讨论过它,或者更确切的说向同事请教过它的一些原理以及一些设计思路。

(6)相似度计算

相似度计算,比如文本的相似度计算。它是一个很基础的建模,很多地方就用的到它,比如刚才我们说到的推荐,其内部关联的时候,有时候就会涉及到计算实体间的相似度。

关于文本的相似度,其实方法有很多。通常会涉及到TFIDF模型,拿到文本的知识点,也就是带权的词,然后通过这些带权的词去做一些相似度的计算。

比如,余弦相似模型,就是计算两个文本的余弦夹角,其向量自然就是那些带权的词了;又比如,各种算距离的方法,最著名的欧式距离,其向量也依然是这些词。还有很多诸如最长公共子串、最长公共子序列之类的模型,个人就不是很清楚了。

总之,方法很多,也都不是很复杂,原理都很像。至于哪个合适,就得看具体的业务场景了。

(7)文本主题程度——信息熵

曾经和同事尝试对数百万的博文进行领域划分,把技术博文划分成不同的领域,比如大数据领域、移动互联网领域、安全领域等等,其实说白了还是分类。

一开始我们使用贝叶斯进行分类,效果还行,不过最终还是使用SVM去建模了。这都不是重点,重点是我们想对划分到某一领域下的技术博文进行领域程度判断。

我们想了很多办法,尝试建立了数据模型,但效果都不是很理想,最终回归到了一个最本质的方法,那就是使用文本的信息熵去尝试描述程度,最终结果还是不错。这又让我再一次想到同事说过的那句话:简单的东西不一定不好用!

信息熵描述的是一个实体的信息量,通俗一点说就是它能够描述一个实体的信息混乱程度。在某一个领域内,知识点都是相似的,都是那些TFIDF权重的词,因此,是不是可以认为,一个文本其信息熵越小,其主题越集中越明显,信息的混乱度越低,反过来说,有些文本主题很杂乱,可能包含了多种领域的一些东西,其领域的程度就会降低。

最起码表面上,这种说法是行得通的,并且实际的效果还不错。

(8)用户画像

用户画像这个方向可能是近两年比较火的方向了。近年来,各大互联网公司,各大IT企业,都有意识的开始从传统的推荐到个性化推荐的道路衍变,有些可能做的深一些,有些可能浅一些。

商业价值的核心是用户,这自然不用多说。那么如何结合用户进行推荐呢,那就是用户的属性,那关键是用户的属性也不是一开始就有的,我们所有的只是少量用户的固有属性以及用户的各种行为记录。我们连用户是啥子里情况都不清楚,推个毛啊!

所以,我们需要了解用户,于是对用户进行用户画像分析就很有必要了,其实就是把用户标签化,把用户标记成一个个属性标签,这样,我们就知道每一个用户大概是什么情况了。一些商业行为,也就有了目的性。

至于说如何对用户的每一个画像属性进行填充,这就看具体的情况了。简单的,用几个简单模型抽取到一些信息填充进去;复杂的,使用复杂的算法,通过一些复杂的转换,给用户打上标签。

(9)文章热度计算

给你一大坨文章,你如何判断哪篇文章比较热,哪篇文章比较矬,换个说法就是,我进入一个文章列表页,你能给我提供一个热文章的排序列表吗?

可能大部分的思路都很直接,拿到文章能够体现热度的属性,比如点击率、评论情感分析、文章的顶踩情况,弄个简单加权计算模型,咔咔就出来了。

本质上这没错,简单的模型在实际的情况中不一定不好使,部分属性也的确能够体现出一篇文章的热度,通过加权计算的方式也是对的,具体的权重就需要看具体情况了。

但如果这么做的话,实际上会出现什么情况?今天我来了,看见了这个热度推荐列表,明天我来了,还是看到这个列表,后天我来了,依然是这个列表。

尼玛,这是啥情况,咋天天都是这个破列表,你要我看几遍?!不错,这就是现实情况,造成的结果就是,越热的文章越来越热,越冷的文章越冷,永远的沉底了,而热的文章永远在前头。

如何解决这个问题?我们把时间也加入参考,我们要把老文章通过降权的方式,把他人为的沉下去,让新文章有出头的机会。这就是说,需要我们把创建时间也加入权重中,并且随着时间推移,衰减其热度权重,这样,就不会出现热的一直热,冷的一直冷了。至于衰减的曲线,就需要看具体业务了。

这样就能解决根本问题了吗?如果文章本身信息量就不够呢,比如,本身大部分就是新文章,没有顶踩,没有评论,甚至连点击曝光都很少,那用之前的模型就行不通了。

那是不是就无解了呢?方法还是有的,比如,我们寻找到一个相似的站点,他也提供了类似最热文章推荐的功能,并且效果还很不错。那么,我们是不是就可以借助它的热度呢?我们通过计算文章相似度的方法,复刻出一个最热列表出来,如果站点性质相似,用户性质相似,文章质量不错,相似度计算够准确,相信这个热度列表的效果也是会不错滴(这方法太猥琐了~~)。

(10)Google的PageRank

首先,别误会,我真心没有写过这个模型,我也没有条件去写这个模型。

认识它了解它,缘自于跟几个老同学合伙搞网站(酷抉网)。既然搞网站吧,作为IT人猿,一些基本的SEO的技术还是需要了解的。于是,我了解到:想要增大网站的权重,外链是不可缺少的。

我跟我几个老同学说,你们去做外链吧,就是逮住网站就放咱网站的链接。他们问到:一个网站放的链接越多越好吗?放的网站越多越好吗?啥网站放比较好?这都不是重点,关键是他们问:为毛啊?

把我问的那个是哑口无言啊,于是我一怒之下就去研究PageRank了。PageRank具体的推演过程我就不说了(况且凭借我这半吊子的水平也不一定能说清楚),其核心思想有几个:当一个网页被引用的次数越多时,其权重越大;当一个网页的权重越大时,其引用的网页权重也随之增大;当一个网页引用的次数越多时,它引用的网页给它带来的权重越低。

当我们反复迭代路上过程时,我们会发现某个网页的的排名基本就固定了,这就是PageRank的基本思路。当然也有个问题需要解决,比如,初始网页如何给定其初始权重,高计算迭代过程如何简化其计算过程等等。这些问题,在Google的实际操作中,都做了比较好的优化。

(11)从互联网上定向抓取数据

其实我估摸着这跟算法没很大关系了,不过既然有数据的获取设计流程,也勉强算是吧。

之所以有这个需求,是那段时间搞网站搞嗨了,给自己整了个工作室网站,想给别人尤其是一些小企业搭建包括轻度定制企业网站(是不是挺瞎折腾的-_-),也确实是做了几个案例(我的工作室网站: www.mite8.com
,有兴趣去看看)。

于是乎,俺就想啊,如何给自己找客户?工作室的客户应该是那些小企业的老板,并且还必须是目前没有企业门户的。作为一个搞数据的程序猿,并且还是开挖掘机的,虽然是半路出身非蓝翔毕业且无证上岗,但好歹是挖过几座山头的呀。

如今是互联网横行的时代,他们总会在互联网上留下一些蛛丝马迹,我要把它给逮出来!我的目标很明确,我要拿到那些无企业网站的企业邮箱,然后做自己EDM营销(电子邮件营销)。

1)我先从智联检索页面,抓取了企业规模小于40人的企业名称,事实证明智联招聘的页面还是很好解析的,都是静态的,并且格式很规整,所以很容易就分析出一批小企业的企业名来了;

2)拿到了企业名,我如何判断这个企业已经有了独立的企业官网?通过分析,我发现通过搜索引擎检索这个企业名的时候,如果有企业官网的话,一定是在首页。并且其页面地址也是有一定规律的,那就是:独立官网的开头通常是www开头的,长度一般不会太长,收尾通常是index.html、index.php以及index.asp等等。

通过这些规则,我就可以将那些有企业官网的企业名给pass掉了。其中遇到了两个难点,一个就是搜索引擎的很多页面源码都是动态加载的,于是我模拟了浏览器访问的过程,把页面源码给抓取下来了,这也是爬虫的通用做法;第二个就是,一开始我尝试的是通过百度去获取,结果百度貌似是有放结果抓取的一些措施,导致结果不如人意,于是我换了目的,使用的是360的检索,问题就解决了(事实证明百度在搜索引擎方面比360还是强了不少的),并且效果也差不多。

3)解决了排除的问题,那根本的问题就来了,我如何拿到企业的企业邮箱?通过分析搜索引擎的返回结果,我发现很多小企业喜欢用第三方网站提供的一些公司黄页,里头包含了企业联系邮箱;还有部分公司发布的招聘信息上会带有企业邮箱。

通过数据解析,终于拿到了这部分数据,最后还做了一些类似邮箱是否有效的基本解析等等。最终拿到了大概3000多个企业邮箱,有效率达到了80%以上。

问题是解决了,但还是有些地方需要优化的:首先就是效率问题,我整整跑了近12个小时,才把这3000多个邮箱给跑出来,太多需要解析的地方,并且模拟的浏览器在效率上不高;其次就是对邮箱的有效不是很好判断,有些邮箱根本就是人为瞎写的;还有就是部分网站对邮箱进行了图片化混杂处理,即做成了类似的验证码的东西,防抓取,我没有对图片类的邮箱数据进行解析,其实这个问题也是有解决办法的,我们拿到一些样本图片,进行图片字母识别的训练,这样就能解析出其中的邮箱了。

总体来说,这次体验还是挺有成就感的,毕竟在业余的时间解决了自己实际中的一些痛点,熟练了一些所学到的东西,或者说实施的过程中学到了很多东西。

ps:github上检索webmite就是这个项目了,我把代码托管到了github上,或者从我的博客上进入。

二、对自己做一个总结吧

其实个人的缺点很明显,首先就是没有经过系统的数据挖掘学习(没去过蓝翔,挖掘机自学的),也就是野路子出身。因此对很多算法的原理不够清楚,这样的话,对于有些业务场景,可能就提不出有建设性的意见了。并且,对于很多算法库的使用,还是不够了解的。

其次就是在数学功底上有所欠缺。我们知道,一些复杂的算法,是需要有强大的数学基础的。算法模型,其本质就是数学模型。因此,这方面也是我的短板吧。

由于个人是由做大数据偏向挖掘的,基于大数据模式下的数据挖掘过程,可能跟传统的数据过程有很大的不一样。比如,数据的预处理过程,大数据挖掘的预处理很多依赖的是目前比较流行的分布式的一些开源系统,比如实时处理系统Storm、消息队列Kafka、分布式数据收集系统Flume、数据离线批处理Hadoop等等,在数据分析存储上可能依赖的Hive以及一些Nosql会多一些。反倒对于传统的一些挖掘工具,比如SAS、SPSS、Excel等工具,个人还是比较陌生的。不过这也说不上是缺点吧,侧重点不一样。总体而言,大规模数据的挖掘将会是趋势。

三、给小伙伴们的一些建议

说了这么多,前面的那些东西可能对大伙儿的用处并不是很大,当然对于开挖掘机的朋友还是有一定帮助的。现在我想表达的东西可能跟挖掘就没有直接的关系了,更多的给动物园动物(程序猿,攻城狮)的学习以及自我进化的建议。

(1)为了学到东西,脸皮是毛玩意儿?

对于这点,个人可是深有体会。想当年(好吧,这个词还是很蛋疼的),大学那会儿专业是信息安全,偏向于网络多一点,因此在语言方面更多的是c和c++,对于java可是连课都没有开的,说白了就是用java写个HelloWorld都不会。

刚毕业那会儿,兴冲冲地跑去公司写c,结果不到一个月,新项目来了,需求变了(尼玛,开发最怕的就是这句话),变了就变了吧,尼玛要研究大数据,用c能干毛啊!一些个开源系统工具,十个倒是有九个是java写的。当时我就哭了!

于是就纠缠着一个同组的伙伴,逮住时间就问他问题,有些问题在熟悉java的人看来,绝对是白痴又白痴的。但是对于初学者来说,绝对是金玉良言,人家一句话的事,如果自己去查找,可能是几个小时都搞不定。一个月之后,总算入门了,后面就轻松多了。

往后的一些日子里,遇到了一些问题,总是会厚着脸皮缠着交流群中的一些大拿们死问,慢慢地就进步了。近段时间,开始学习scala,幸好旁边有个scala小高手,哈哈,可苦了他了~~

所以,遇到自己不懂的东西,不要怕自己的问题简单不好意思问,一定要脸皮厚!你连这么简单的问题都不懂,你还有资格担心自己的脸皮?!

(2)交流与分享

对于交流与分享这点感想,缘自于2012年末研究Storm的那段时间。Storm在2012年那会儿,并不像今天这样火,研究的人也不多,无处交流,可用的资料就更少了,所以解决起问题来很费事。

当然其中有几个博客给我的帮助还是很大的,包括了“大园那些事儿”、“庄周梦蝶”等几个博客,都是早期研究Storm并且分享经验技术的博客。当时我就萌生了写博客的想法。

在往后的时间里,我花费了很大一部分精力,将我学到的Storm相关的东西整理了出来,并且由于当时感叹没有一个很好的交流平台,创建了“Storm-分布式-IT”技术群(群号191321336,主要搞Storm以及大数据方面的,有兴趣的可以进来),并把整理的资料、代码、经验分享到了平台以及博客中。

由于我一直主张“进步始于交流,收获源于分享”这个理念,不断有搞技术的朋友加入到这个大家庭中,并且不断的把一些经验技术反馈到群贡献中,达到了一个良性的循环。 短短不到两年的时间,群已经发展到了千人,并且无论是技术氛围还是群员素质,在IT技术群中绝对可以算的上名列前茅的。

就个人从中的收获来看,这种交流是能够学到很多的东西的,你要相信三人行必有我师,这句话是有道理的。而分享则是促进交流的基石,只有让大家意识到自己所收获的东西是源自于别人的分享,这样才能让更多的人参与进来。

其实说了这么多,想表达的意思就两点:多多与他人交流,听取他人的意见;至于分享自己的所得,这就是属于良心发现了。

(3)多看书,随时给自己大脑补充营养

其实这点也不止是给大伙儿的建议,也算是给自己的一个告诫吧。

个人在这方面做的也不是很好,很久之前给自己定了一个目标:一个月看完一本书。结果工作的问题,其他杂七杂八的事情很多,这个一直没有落实下来,至今买来的《我的互联网方法论》才看了前几章。最好的案例算是上上一个月,我花费了近一个月上下班等地铁、倒地铁的零碎时间,终于把《构建之法:现代软件工程》给看完了。

书中有没有颜如玉我不知道,但书中肯定有黄金屋。平时多看一些书,多学一些,跳槽时跟面试官总是能多唠一些的,哈哈,提薪酬的时候是不是底气就足了些?!

关于说看书的内容,工作中涉及的一些必须了解,必须看的我就不多说了。如果业余时间比较多,还是推荐多涉猎一些其他相关领域,毕竟,人不可能一辈子就只窝在自己那一亩三分地上的;就算你一直坚持某个技术方向,随着时间的推移,技术的升华也必然会涉及到其他很多的相关知识。

所以,多看书,多充实一下自己,这一定是对的!

(4)经常梳理一下自己,整理一下自己

经常给自己做一下梳理工作:自己目前掌握了哪些东西,目前自己缺乏什么东西,掌握的东西够不够,缺乏的东西如何去弥补。这些都是需要我们经常去反思的,只有整理清楚了自己,才知道自己要干什么,才有目标。

当然梳理完了,你还需要去实际操作,不然的话,你会发现,每一次梳理,结果都是一样的。我们需要在每一次梳理过后,进行对比,了解自己进步了多少。当然每一次梳理,都是为了给自己做一个计划,计划自己大概需要在哪些方向进行加强。

其实很多人一到了跳槽季就犹犹豫豫,其实他们对目前的工作已经是有所不满的了,但是总感觉自己能力不够,可能辞了也难找工作。这是因为他们对自己认识的不够,连他自己都不明白自己到底有多少料,那么,请问面试官会知道吗?

如果,你对自己掌握了多少东西都一清二楚,核心领域已经熟悉了,相关领域也有所涉猎,那么你还在担心什么呢?如果真有面试官对你说no,你可以说:hi,刚好我也没什么时间,我还回去挑选offer呢!

(5)善于在实际生活中寻找学习的动力

人是懒惰的,很多时候,有些事情可做可不做的,往往人都是不去做的,也不愿意去深根究底。

这个我很想学,那个我也很想了解,关键是一到大周末,我更想躺被窝!说到底,就是没有学习的动力!

也就是说,我们要善于在实际的生活中,寻找到推动我们取学习的理由。

举几个简单的栗子:

1)之前也说过,有段时间在研究网站。为了让网站推广出去,各种去研究SEO,现在来看,自己虽然远远达不到一个SEO专业人员的标准,但最起码是知道了为毛通过搜索引擎检索,有些网页就排在前面有些就排在后面(PageRank算法);也知道了怎么去编译一篇文章,更好的方便搜索引擎收录(等俺失业了,不搞挨踢了,去做网编估计也是行的,又多了一条活路,哈哈)等等。

2)为了给EDM寻找目标,我自己使用业余的时间去分析互联网上的数据,然后写代码,跑数据,测试数据等。其实,在那之前,我对爬虫的了解是不多的,对于网页数据的解析也不在行,这完全都是通过“从互联网抓取有用数据”的个人需求上去驱动的。还不止如此,拿到邮箱之后,为了让EDM邮件看起来更“砖业”一点,我开始自学如何使用html来制作好看的电子营销邮件页面。

3)曾经有一段时间,工作很是清闲,突发奇想的把大学时想写小说的梦给圆了。于是就开始在纵横小说网上写小说。不过,这都不是重点,重点是纵横要求每一个作者给自己的小说配小说封面。我去问了一下,尼玛一张破封面需要20多大洋。心想,一张破封面就要20大洋,自己都是搞IT的人,干脆不自己P一个呢。于是,我开始捡起了大学时期放弃的PS学习计划,只用了两个星期,PS基本功能就熟练了。后来的话,自己的封面当然是搞定了,并且还服务了至少数十位作者朋友们。当然,这都是题外话了。至于小说,哈哈,不但签约了,稿费还是挣了上千大洋,关键是过了一把写小说的瘾。在PS技术方面,虽然跟专业的前端人员比不得,但是改改图、修修照片还是木有问题滴。

4)远的太远,说一个近一点的事吧。前一段时间开始学习scala,其实就个人需求来说,写那个项目用java来写也完全能够搞定,但关键是我对我自己说,错过了这次机会,下次说不定啥时候才有决心去学习这个很有前途的语言了。于是,狠下心使用这个全新的语言去开发,过程虽然磕磕绊绊,毕竟马上使用一种陌生的语言去敲代码是很蛋疼的事,但一个星期来,结果还是不错的,最起码一些基本的用法是会了。完事开头难,熟悉了一些基本的东西,剩下的就是累积的过程了。

其实这些归结起来就一个观点:我们要适时的给自己找一些理由,逼着我们自己去学习,去获取新的东西,去提升自己。

或许有人会说,哥我天天加班,还有毛线时间去问问题、去交流、去看书,大周末的好不容易有假期了,吃饱了我不去睡觉去给自己找动力干不给钱的活,我脑抽啊?!好吧,如果你是这么想的,抱歉耽误了你这么多睡觉的时间。

其实上面说了这么多零碎的栗子,关键还是在于态度!你有没有想学习的欲望,有没有提升自己、升华自己的想法,有没有升职、加薪、当上UFO、迎娶白富美的念头。是的,这些东西都是自己去做的,没人逼你。如果你有这些想法的话,那么这些东西多多少少还是有一些帮助的。

除了对待事情的态度,我们的心态也很重要,看待事情要乐观一点。前几天,群里有个搞互联网招聘的朋友问我:你是搞技术的吧?我说是。他说我认识很多搞技术的都很闷,不像你这么开朗。我说我不想哪天死在了马桶上~~

搞IT的给大部分人的映象确实是闷骚、不善言谈、不善交际。其实也是,每天大量的工作,领导又开会训人了、产品这边需求又改了,确实让人疯狂。工作压力大是IT人的标准属性了。

我们需要调整好自己的心态,就像之前所说的,学习一个东西,虽然可能会占用本来就不多的业余时间,但是我们应该不是那种单纯为了解决问题而去学习,去获取,当成一种提升自己、升华自己的途径,而不是逼不得已的无奈之举。如果一份工作,你确认自己不喜欢,那就别犹豫,果断跳吧!脑中有货还怕找不到买家!

时刻警醒自己对待任何事情要有一个好的态度,认清自己,抓住一切机会提升自己、升华自我,保持一个良好的心态,这就是我想说的东西。

吭吭唧唧说了一大坨,其实我也知道很多是废话,但是我依然希望,我的这些废话能够帮助到你,做为同一个动物园里的人,一起努力吧!

来源:博客虫投稿, 原文链接
。作者公众微信号:博客虫(ID:blogchong)

来自为知笔记(Wiz)

时间: 2024-10-20 19:01:40

这些年,这些挖掘机算法,这些反思 - 推酷的相关文章

这些年,这些挖掘机算法,这些反思

原文:http://www.blogchong.com/post/111.html 写这篇文章,缘自于前几天部门内部成员们进行了一次部门内部现有涉及的一些算法的review以及整理.不过比较囧的就是,由于boss不在,我们讨论讨论着就成了吐槽大会,倒是有一半时间在吐槽产品以及业务部门了~~ 不过这也算是一件可喜可贺的事情了,这也可以看做是我们数据部门,已经由开轻型挖掘机向深挖阶段迈步了. 因此,借此机会,也对自己接触过的,了解过的,或者做过的一些勉强称得上算法的东西做一个梳理.其实,就个人来说,

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

滑动平均滤波算法(递推平均滤波法)(转帖)

//滑动平均滤波算法(递推平均滤波法)--C语言版 int FilterI=0; //ADNum为获得的AD数 //n为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 int GlideFilterAD(int value_buf[],int n,int ADNum) { int sum=0; value_buf[FilterI++]=ADNum; if(FilterI==n) FilterI=0; //先进先出,再求平均值 for(int count=0;count

Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷

有时需要获取直线与各种图形的交点,包括多边形和各种Qt图形框. 例如上图中,要想使连接线始终在多边形的边上,且能指向多边形中心,那么我们就要获取连线AB与多边形的交点. 1.多边形(QGraphicsPolygonItem)与直线(QLineF)的交点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //已知点和多边形//A.B点可通过多边形的boundingRect().width()/2获取; QPointF A; QPointF B; QGraphics

数据结构与算法之递推算法 C++与PHP实现

数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的.往往是在发展一种算法的时候,构建了适合于这种算法的数据结构.一种数据结构如果脱离了算法,也就没有存在的价值了. 算法的作用----解决任何一个实际问题,都不可避免地涉及到算法的问题,通过一定的算法,得到一个最优(或较优)的方案. 递推算法:递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法. 顺推法:从已知条件出发,逐步推算出要解决的问题的方法. 逆推法:从已知问题的结果出发,用迭代表达式逐步推算

从YouTube算法论文反推其推荐机制

去年,在波士顿举办的第10届ACM推荐系统大会(ACM's RecSys '16)上,来自Google的一个研究团队公布了YouTube推荐系统的深度学习论文:Deep Neural Networks for YouTube Recommendations 论文作者是Google的软件工程师 Jay Adams 与高级软件工程师 Paul Covington.Embre Sargin,他们向业界展示了YouTube在机器学习推荐算法上的深度神经网络使用情况.该论文涉及到一些非常技术.非常高级的细

算法入门——递推

主要思想: 通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解. 主要分为两种:顺推,从已知条件出发,直至推出解. 逆推,从已知结果出发,直至推出解. 需要注意的:每一递推结果,都是下一步递推的条件. 顺推: 斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 实例 兔子的总数有多少? 一对兔子,每月能生一对,而每对兔子3个月后可以生育.求12个月后共有多少兔子. #include<stdio.h> #define

算法学习——递推之超级素数

算法描述 超级素数定义: m位超级素数本身是素数 最高位开始,去掉一位为m-1位的素数-- 例: 103不是超级素数,去掉最高位的1之后为3,不是有个2位素数,137是一个三位超级素数,去掉最高位1之后为37,37是一个二位素数,去掉3之后为7,7也是一个素数 要求: 输入整数m(1 < m<=10),统计m位超级素数的个数,并输出其中最大的m位超级素数 算法思路 设置一个判断素数的方法 1位素数只有3个,3,5,7,我们可以推测,2位超级素数的个位数只能是3,5,7,没有其他的选择了,同理,

01python算法之递推

递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能繁殖多少兔子? def my1(max): a ,b,c ,i= 1,0,0 0 while i<max: c = c+b b = a a = c print a+b+c i+=1 方法:我们可以把兔子分为1个月大的,2个月大的,3个月大的