无来

不管你来还是不来
我都在这里,夜夜点亮
不是为了守候
只是为了做好我自己

0%

1
2
3
4
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH #返回到某个节点,不保留修改。
git reset --soft HASH #返回到某个节点。保留修改

git丢弃本地修改的所有文件(新增、删除、修改)

1
2
3
4
5
git clean -df #返回到某个节点
git clean 参数
-n 显示 将要 删除的 文件 和 目录
-f 删除 文件
-df 删除 文件 和 目录

也可以使用

1
git checkout . && git clean -xdf

如果在命终端中用svn命令操作文件名中有“@”符号的文件(ios开发的朋友应该很清楚),会遇到:

svn: E205000: Syntax error parsing peg revision ‘3x.png’

或者:

svn: E200009: ‘welcome1@3x.png': a peg revision is not allowed here

类似的错误提示,原因是因为svn命令把文件名中的@识别成有其它含义的特殊字符,导致操作失败。

解决办法:

在使用svn命令时在文件名尾部再添加一个@即可解决。
比如 要查看welcome1@3x.png文件信息:

svn info welcome1@3x.png@

站点远程同步脚本,实现数据库本地镜像。

如果源文件删除,目标文件夹也会删除。因此该脚本只能够作为镜像,不能作为备份

rsync.sh 执行脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/sh

path=$1

host=rsync@103.235.220.108
port=2222

dbuser=root
dbpwd=111111


#远程服务器运行dbdump.sh脚本dump数据库
echo "dump msyql"
ssh $host -p $port "~/dbdump.sh"

src=$host:/home/wwwroot/html
dst=/home/wwwroot/html
exculude=/home/wwwroot/rsync_exclude.list

echo "源:"$src/$path
echo "目标:"$dst/$path
rsync -avzO -e "ssh -p $port" --exclude-from=$exculude --delete $src/$path $dst/$path

echo ">>>更新数据库"
CurrentDate=$(date +%Y%m%d)
mysql -u$dbuser -p$dbpwd test < $dst/db/test.${CurrentDate}.sql

echo "同步完成"

rsync_exclude.list

忽略的文件,文件夹路径

1
2
3
.svn/
Upload/
logs/

dbdump.sh

1
2
3
4
5
6
#!/bin/sh
dbname=root
dbpwd=111111
CurrentDate=$(date +%Y%m%d)
dirPath=/home/wwwroot/html/db
mysqldump -u$dbname -pdbpwd test > $dirPath/test.${CurrentDate}.sql

demo

同步test文件夹

./rsync.sh test

显示进度条

添加参数--progress

rsync -av --progress  root@123.123.123.123:/root/mysql56.tar .

1、作者:谢科

链接:https://www.zhihu.com/question/21592677/answer/24663656
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

“Data Science = statistics who uses python and lives in San Francisco”

恰好我马上启程到Twitter的data science team,而且恰巧懂一点点统计和住在旧金山,所以冲动地没有邀请就厚脸回答了:D

我认为有几个大方面

1)学好python。
现在几乎所以公司的数据都可以api给你,而python的数据处理能力强大且方便。加之在machine learning的很多算法上,python也独俏一方。另外,它的简明方便迅速迭代开发,15分钟写完个算法就可以看效果了。

除此之外,py还有点酷酷的感觉。任何程序拿matlab和c++都是可以写的,不过我真没认识过哪个d愿意自己把自己扔那个不酷的框框里:D

对不规则输入的处理也给python一个巨大的优势。通常来说,在我现在日常的工作里,所有的数据都是以纯文本但是非格式的形式存储的(raw text, unstructured data)。问题在于,这些文本不可以直接当作各种算法的输入,你需要
分词,分句
提取特征
整理缺失数据
除掉异类(outlier)
在这些时候,python可谓是神器。这里做的1-4都可以直接在scikit-learn里面找到对应的工具,而且,即使是要自己写一个定制的算法处理某些特殊需求,也就是一百行代码的事情。

简而言之,对于数据科学面临的挑战,python可以让你短平快地解决手中的问题,而不是担心太多实现细节。

2)学好统计学习
略拗口。统计学习的概念就是“统计机器学习方法”。
统计和计算机科学前几十年互相平行着,互相造出了对方造出的一系列工具,算法。但是直到最近人们开始注意到,计算机科学家所谓的机器学习其实就是统计里面的prediction而已。因此这两个学科又开始重新融合。

为什么统计学习很重要?

因为,纯粹的机器学习讲究算法预测能力和实现,但是统计一直就强调“可解释性”。比如说,针对今天微博股票发行就上升20%,你把你的两个预测股票上涨还是下跌的model套在新浪的例子上,然后给你的上司看。
Model-1有99%的预测能力,也就是99%的情况下它预测对,但是Model-2有95%,不过它有例外的一个附加属性——可以告诉你为什么这个股票上涨或者下跌。

试问,你的上司会先哪个?问问你自己会选哪个?

显然是后者。因为前者虽然有很强的预测力(机器学习),但是没有解释能力(统计解释)。

而作为一个数据科学家,80%的时间你是需要跟客户,团队或者上司解释为什么A可行B不可行。如果你告诉他们,“我现在的神经网络就是能有那么好的预测力可是我根本就没法解释上来”,那么,没有人会愿意相信你。

具体一些,怎么样学习统计学习?
先学好基本的概率学。如果大学里的还给老师了(跟我一样),那么可以从MIT的概率论教材【1】入手。从第1章到第9章看完并做完所有的习题。(p.s.面试Twitter的时候被问到一个拿球后验概率的问题,从这本书上抓来的)。
了解基本的统计检验及它们的假设,什么时候可以用到它们。
快速了解统计学习有哪些术语,用来做什么目的,读这本【5】。
学习基本的统计思想。有frequentist的统计,也有bayesian的统计。前者的代表作有【2】,后者看【3】。前者是统计学习的圣书,偏frequentist,后者是pattern recognition的圣书,几乎从纯bayesian的角度来讲。注意,【2】有免费版,作者把它全放在了网上。而且有一个简易版,如果感觉力不从心直接看【2】,那么可以先从它的简易版开始看。简易版【4】是作者在coursera上开课用的大众教材,简单不少(不过仍然有很多闪光点,通俗易懂)。对于【3】,一开始很难直接啃下来,但是啃下来会受益匪浅。
注意,以上的书搜一下几乎全可以在网上搜到别人传的pdf。有条件的同学可以买一下纸制版来读,体验更好并且可以支持一下作者。所有的书我都买了纸制版,但是我知道在国内要买本书有多不方便(以及原版书多贵)。

读完以上的书是个长期过程。但是大概读了一遍之后,我个人觉得是非常值得的。如果你只是知道怎么用一些软件包,那么你一定成不了一个合格的data scientist。因为只要问题稍加变化,你就不知道怎么解决了。

如果你感觉自己是一个二吊子数据科学家(我也是)那么问一下下面几个问题,如果有2个答不上来,那么你就跟我一样,真的还是二吊子而已,继续学习吧。
为什么在神经网络里面feature需要standardize而不是直接扔进去
对Random Forest需要做Cross-Validatation来避免overfitting吗?
用naive-bayesian来做bagging,是不是一个不好的选择?为什么?
在用ensembe方法的时候,特别是Gradient Boosting Tree的时候,我需要把树的结构变得更复杂(high variance, low bias)还是更简单(low variance, high bias)呢?为什么?
如果你刚开始入门,没有关系,回答不出来这些问题很正常。如果你是一个二吊子,体会一下,为什么你跟一流的data scientist还有些差距——因为你不了解每个算法是怎么工作,当你想要把你的问题用那个算法解决的时候,面对无数的细节,你就无从下手了。

说个题外话,我很欣赏一个叫Jiro的寿司店,它的店长在(东京?)一个最不起眼的地铁站开了一家全世界最贵的餐馆,预订要提前3个月。怎么做到的?70年如一日练习如何做寿司。70年!除了丧娶之外的假期,店长每天必到,8个小时工作以外继续练习寿司做法。

其实学数据科学也一样,沉下心来,练习匠艺。

3)学习数据处理
这一步不必独立于2)来进行。显然,你在读这些书的时候会开始碰到各种算法,而且这里的书里也会提到各种数据。但是这个年代最不值钱的就是数据了(拜托,为什么还要用80年代的“加州房价数据”?),值钱的是数据分析过后提供给决策的价值。那么与其纠结在这么悲剧的80年代数据集上,为什么不自己搜集一些呢?

开始写一个小程序,用API爬下Twitter上随机的tweets(或者weibo吧。。。)
对这些tweets的text进行分词,处理噪音(比如广告)
用一些现成的label作为label,比如tweet里会有这条tweet被转发了几次
尝试写一个算法,来预测tweet会被转发几次
在未见的数据集上进行测试
如上的过程不是一日之功,尤其刚刚开始入门的时候。慢慢来,耐心大于进度。

4)变成全能工程师(full stack engineer)
在公司环境下,作为一个新入职的新手,你不可能有优待让你在需要写一个数据可视化的时候,找到一个同事来给你做。需要写把数据存到数据库的时候,找另一个同事来给你做。

况且即使你有这个条件,这样频繁切换上下文会浪费更多时间。比如你让同事早上给你塞一下数据到数据库,但是下午他才给你做好。或者你需要很长时间给他解释,逻辑是什么,存的方式是什么。

最好的变法,是把你自己武装成一个全能工作师。你不需要成为各方面的专家,但是你一定需要各方面都了解一点,查一下文档可以上手就用。

会使用NoSQL。尤其是MongoDB
学会基本的visualization,会用基础的html和javascript,知道d3【6】这个可视化库,以及highchart【7】
学习基本的算法和算法分析,知道如何分析算法复杂度。平均复杂度,最坏复杂度。每次写完一个程序,自己预计需要的时间(用算法分析来预测)。推荐普林斯顿的算法课【8】(注意,可以从算法1开始,它有两个版本)
写一个基础的服务器,用flask【9】的基本模板写一个可以让你做可视化分析的backbone。
学习使用一个顺手的IDE,VIM, pycharm都可以。

4)读,读,读!
除了闭门造车,你还需要知道其它数据科学家在做些啥。涌现的各种新的技术,新的想法和新的人,你都需要跟他们交流,扩大知识面,以便更好应对新的工作挑战。

通常,非常厉害的数据科学家都会把自己的blog放到网上供大家参观膜拜。我推荐一些我常看的。另外,学术圈里也有很多厉害的数据科学家,不必怕看论文,看了几篇之后,你就会觉得:哈!我也能想到这个!

读blog的一个好处是,如果你跟他们交流甚欢,甚至于你可以从他们那里要一个实习来做!

betaworks首席数据科学家,Gilad Lotan的博客,我从他这里要的intern :D Gilad Lotan
Ed Chi,六年本科硕士博士毕业的神人,google data science http://edchi.blogspot.com/
Hilary Mason,bitly首席科学家,纽约地区人尽皆知的数据科学家:hilarymason.com

在它们这里看够了之后,你会发现还有很多值得看的blog(他们会在文章里面引用其它文章的内容),这样滚雪球似的,你可以有够多的东西早上上班的路上读了:)

5)要不要上个研究生课程?
先说我上的网络课程:
Coursera.org
https://www.coursera.org/course/machlearning
前者就不说了,人人都知道。后者我则更喜欢,因为教得更广阔,上课的教授也是世界一流的机器学习学者,而且经常会有一些很妙的点出来,促进思考。

对于是不是非要去上个研究生(尤其要不要到美国上),我觉得不是特别有必要。如果你收到了几个著名大学数据科学方向的录取,那开开心心地来,你会学到不少东西。但是如果没有的话,也不必纠结。我曾有幸上过或者旁听过美国这里一些顶级名校的课程,我感觉它的作用仍然是把你领进门,以及给你一个能跟世界上最聪明的人一个交流机会(我指那些教授)。除此之外,修行都是回家在寝室进行的。然而现在世界上最好的课程都摆在你的面前,为什么还要舍近求远呢。

总结一下吧
我很幸运地跟一些最好的数据科学家交流共事过,从他们的经历看和做事风格来看,真正的共性是

他们都很聪明——你也可以
他们都很喜欢自己做的东西——如果你不喜欢应该也不会看这个问题
他们都很能静下心来学东西——如果足够努力你也可以

【1】Introduction to Probability and Statistics
【2】Hastie, Trevor, et al. The elements of statistical learning. Vol. 2. No. 1. New York: Springer, 2009. 免费版
【3】Bishop, Christopher M. Pattern recognition and machine learning. Vol. 1. New York: springer, 2006.
【4】Introduction to Statistical Learning 免费版
【5】Wasserman, Larry. All of statistics: a concise course in statistical inference. Springer, 2004.
【6】http://d3js.org/
【7】http://www.highcharts.com/
【8】Coursera.org
【9】http://flask.pocoo.org/

2、Han Hsiao

数据挖掘、数据分析话题优秀回答者一颗透明的心灵…

收录于 编辑推荐

2017 人赞同


-版本更新,2014年5月14日更新一些内容。-如果展开讲,这个问题可以写一篇综述了。最近刚好有空,打算认真写写。 仅仅在几年前,数据科学家还不是一个正式确定的职业,然而一眨眼的工夫,这个职业就已经被誉为“今后十年IT行业最重要的人才”了。 一、数据…

显示全部

-

版本更新,2014年5月14日更新一些内容。

-

如果展开讲,这个问题可以写一篇综述了。最近刚好有空,打算认真写写。
仅仅在几年前,数据科学家还不是一个正式确定的职业,然而一眨眼的工夫,这个职业就已经被誉为“今后十年IT行业最重要的人才”了。

一、数据科学家的起源

“数据科学”(DataScience)起初叫”datalogy “。最初在1966年由Peter Naur提出,用来代替”计算机科学”(丹麦人,2005年图灵奖得主,丹麦的计算机学会的正式名称就叫Danish Society of Datalogy,他是这个学会的第一任主席。Algol 60是许多后来的程序设计语言,包括今天那些必不可少的软件工程工具的原型。图灵奖被认为是“计算科学界的诺贝尔奖”。)

1996年,International Federation of Classification Societies (IFCS)国际会议召开。数据科学一词首次出现在会议(Data Science, classification, and related methods)标题里。

1998年,C.F. Jeff Wu做出题为“统计学=数据科学吗? 的演讲,建议统计改名数据的科学统计数据的科学家。 (吴教授于1987年获得COPSS奖,2000年在台湾被选为中研院院士,2004年作为第一位统计学者当选美国国家工程院院士,也是第一位华人统计学者获此殊荣。)

2002年,国际科学理事会:数据委员会科学和技术(CODATA)开始出版数据科学杂志。

2003年,美国哥伦比亚大学开始发布数据科学杂志,主要内容涵盖统计方法和定量研究中的应用。

2005年,美国国家科学委员会发表了”Long-lived Digital Data Collections: Enabling Research and Education in the 21st Century”,其中给出数据科学家的定义:

“the information and computer scientists, database and software and programmers, disciplinary experts, curators and expert annotators, librarians, archivists, and others, who are crucial to the successful management of a digital data collection”

信息科学与计算机科学家,数据库和软件工程师,领域专家,策展人和标注专家,图书管理员,档案员等数字数据管理收集者都以可成为数据科学家。它们主要任务是:”进行富有创造性的查询和分析。”
2012年,O’Reilly媒体的创始人 Tim O’Reilly __列出了世界上排名前7位的数据科学家。

  • Larry Page,谷歌CEO。
  • Jeff Hammerbacher,Cloudera的首席科学家和DJ Patil,Greylock风险投资公司企业家。
  • Sebastian Thrun,斯坦福大学教授和Peter Norvig,谷歌数据科学家。
  • Elizabeth Warren,Massachusetts州美国参议院候选人。
  • Todd Park,人类健康服务部门首席技术官。
  • Sandy Pentland,麻省理工学院教授。
  • Hod Lipson and Michael Schmidt,康奈尔大学计算机科学家。
    具体有时间再补充,感兴趣的朋友可以Google Scholar__一下他们的文献。

关于数据科学家的更多讨论:
你能列出十个著名的女性数据科学家吗?Can you name 10 famous data scientist women?__
谁是最富有的数据科学家?Who are the wealthiest data scientists?__
请列出对大数据最具有影响力的20个人?Who Are The Top 20 Influencers in Big Data?__

二、数据科学家的定义

数据科学(Data Science)是从数据中提取知识的研究,关键是科学。数据科学集成了多种领域的不同元素,包括信号处理,数学,概率模型技术和理论,机器学习,计算机编程,统计学,数据工程,模式识别和学习,可视化,不确定性建模,数据仓库,以及从数据中析取规律和产品的高性能计算。数据科学并不局限于大数据,但是数据量的扩大诚然使得数据科学的地位越发重要。

数据科学的从业者被称为数据科学家。数据科学家通过精深的专业知识在某些科学学科解决复杂的数据问题。不远的将来,数据科学家们需要精通一门、两门甚至多门学科,同时使用数学,统计学和计算机科学的生产要素展开工作。所以数据科学家就如同一个team。

曾经投资过Facebook,LinkedIn的格雷洛克风险投资公司把数据科学家描述成“能够管理和洞察数据的人”。在IBM的网站上,数据科学家的角色被形容成“一半分析师,一半艺术家”。他们代表了商业或数据分析这个角色的一个进化。

for example – a data scientist will most likely explore and examine data from multiple disparate sources. The data scientist will sift through all incoming data with the goal of discovering a previously hidden insight, which in turn can provide a competitive advantage or address a pressing business problem. A data scientist does not simply collect and report on data, but also looks at it from many angles, determines what it means, then recommends ways to apply the data.

  • Anjul Bhambhri,IBM的大数据产品副总裁。 数据科学家是一个好奇的,不断质疑现有假设,能盯着数据就能指出趋势的人。这就好像在文艺复兴时期,一个非常想为组织带来挑战并从挑战中学习的人一样。

  • Jonathan Goldman,LinkedIn数据科学家。

2006年的6月份进入商务社交网站LinkedIn,当时LinkedIn只有不到800万用户。高德曼在之后的研究中创造出新的模型,利用数据预测注册用户的人际网络。具体来讲,他以用户在LinkedIn的个人资料,来找到和这些信息最匹配的三个人,并以推荐的形式显示在用户的使用页面上——这也就是我们熟悉的”你可能认识的人(People you may know)”。这个小小的功能让LinkedIn增加了数百万的新的页面点击量(数据挖掘的应用典型之一推荐系统)。

  • John Rauser, 亚马逊大数据科学家。

数据科学家是工程师和统计学家的结合体。从事这个职位要求极强的驾驭和管理海量数据的能力;同时也需要有像统计学家一样萃取、分析数据价值的本事,二者缺一不可。

  • Steven Hillion, EMC Greenplum数据分析副总裁。

数据科学家是具有极强分析能力和对统计和数学有很深研究的数据工程师。他们能从商业信息等其他复杂且海量的数据库中洞察新趋势。

  • Monica Rogati, LinkedIn资深数据科学家。

所有的科学家都是数据学家,因为他们整天都在和海量数据打交道。在我眼中,数据学家是一半黑客加一半分析师。他们通过数据建立看待事物的新维度。数据学家必须能够用一只眼睛发现新世界,用另一只眼睛质疑自己的发现。

  • Daniel Tunkelang,LinkedIn首席数据科学家。

我是bitly 首席科学家Hilary Mason的忠实崇拜者。关于这个新概念的定义我也想引用她的说法:数据科学家是能够利用各种信息获取方式、统计学原理和机器的学习能力对其掌握的数据进行收集、去噪、分析并解读的角色。

  • Michael Rappa,北卡罗莱纳州立大学教授。

尽管数据科学家这个名称最近才开始在硅谷出现,但这个新职业的产生却是基于人类上百年对数据分析的不断积累和衍生。和数据科学家最接近的职业应该是统计学家,只不过统计学家是一个成熟的定义且服务领域基本局限于政府和学界。数据科学家把统计学的精髓带到了更多的行业和领域。

  • 林仕鼎,百度大数据首席架构师。

如果从广义的角度讲,从事数据处理、加工、分析等工作的数据科学家、数据架构师和数据工程师都可以笼统地称为数据科学家;而从狭义的角度讲,那些具有数据分析能力,精通各类算法,直接处理数据的人员才可以称为数据科学家。

最后引用Thomas H. Davenport(埃森哲战略变革研究院主任) 和 D.J. Patil(美国科学促进会科学与技术政策研究员,为美国国防部服务)的话来总结数据科学家需要具备的能力:

  • 数据科学家倾向于用探索数据的方式来看待周围的世界。(好奇心)
  • 把大量散乱的数据变成结构化的可供分析的数据,还要找出丰富的数据源,整合其他可能不完整的数据源,并清理成结果数据集。(问题分体整理能力)
  • 新的竞争环境中,挑战不断地变化,新数据不断地流入,数据科学家需要帮助决策者穿梭于各种分析,从临时数据分析到持续的数据交互分析。(快速学习能力)
  • 数据科学家会遇到技术瓶颈,但他们能够找到新颖的解决方案。(问题转化能力)
  • 当他们有所发现,便交流他们的发现,建议新的业务方向。(业务精通**)**
  • 他们很有创造力的展示视觉化的信息,也让找到的模式清晰而有说服力。(表现沟通能力)
  • 他们会把蕴含在数据中的规律建议给Boss,从而影响产品,流程和决策。(决策力)

三、数据科学家所需硬件技能

《数据之美 Beautiful Data》的作者Jeff Hammerbacher在书中提到,对于 Facebook 的数据科学家“我们发现传统的头衔如商业分析师、统计学家、工程师和研究科学家都不能确切地定义我们团队的角色。该角色的工作是变化多样的:

在任意给定的一天,团队的一个成员可以用 Python 实现一个多阶段的处理管道流、设计假设检验、用工具R在数据样本上执行回归测试、在 Hadoop 上为数据密集型产品或服务设计和实现算法,或者把我们分析的结果以清晰简洁的方式展示给企业的其他成员。为了掌握完成这多方面任务需要的技术,我们创造了数据科学家这个角色。”

(1) 计算机科学

一般来说,数据科学家大多要求具备编程、计算机科学相关的专业背景。简单来说,就是对处理大数据所必需的Hadoop、Mahout等大规模并行处理技术与机器学习相关的技能。

(2) 数学、统计、数据挖掘等

除了数学、统计方面的素养之外,还需要具备使用SPSS、SAS等主流统计分析软件的技能。其中,面向统计分析的开源编程语言及其运行环境“R”最近备受瞩目。R的强项不仅在于其包含了丰富的统计分析库,而且具备将结果进行可视化的高品质图表生成功能,并可以通过简单的命令来运行。此外,它还具备称为CRAN(The Comprehensive R Archive Network)的包扩展机制,通过导入扩展包就可以使用标准状态下所不支持的函数和数据集。R语言虽然功能强大,但是学习曲线较为陡峭,个人建议从python入手,拥有丰富的statistical libraries,NumPy __SciPy.org __Python Data Analysis Library__matplotlib: python plotting__

(3) 数据可视化(Visualization)

信息的质量很大程度上依赖于其表达方式。对数字罗列所组成的数据中所包含的意义进行分析,开发Web原型,使用外部API将图表、地图、Dashboard等其他服务统一起来,从而使分析结果可视化,这是对于数据科学家来说十分重要的技能之一。

(4) 跨界为王

麦肯锡认为未来需要更多的“translators”,能够在IT技术,数据分析和商业决策之间架起一座桥梁的复合型人才是最被人需要的。”translators“可以驱动整个数据分析战略的设计和执行,同时连接的IT ,数据分析和业务部门的团队。如果缺少“translators“,即使拥有高端的数据分析策略和工具方法也是于事无补的。

The data strategists’combination of IT knowledge and experience making business decisions makes them well suited to define the data requirements for high-value business analytics. Data scientists combine deep analytics expertise with IT know-how to develop sophisticated models and algorithms. Analytic consultants combine practical business knowledge with analytics experience to zero in on high-impact opportunities for analytics.

天才的”translators“非常罕见。但是大家可以各敬其职(三个臭皮匠臭死诸葛亮),数据战略家可以使用IT知识和经验来制定商业决策,数据科学家可以结合对专业知识的深入理解使用IT技术开发复杂的模型和算法,分析顾问可以结合实际的业务知识与分析经验聚焦下一个行业爆点。推荐关注:https://www.facebook.com/data__

四、数据科学家的培养

位于伊利诺伊州芝加哥郊外埃文斯顿市的美国名牌私立大学——西北大学(Northwestern University),就是其中之一。西北大学决定从2012年9月起在其工程学院下成立一个主攻大数据分析课程的分析学研究生院,并开始了招生工作。西北大学对于成立该研究生院是这样解释的:“虽然只要具备一些Hadoop和Cassandra的基本知识就很容易找到工作,但拥有深入知识的人才却是十分缺乏的。”

此外,该研究生院的课程计划以“传授和指导将业务引向成功的技能,培养能够领导项目团队的优秀分析师”为目标,授课内容在数学、统计学的基础上,融合了尖端计算机工程学和数据分析。课程预计将涵盖分析领域中主要的三种数据分析方法:预测分析、描述分析(商业智能和数据挖掘)和规范分析(优化和模拟),具体内容如下。

(1) 秋学期
* 数据挖掘相关的统计方法(多元Logistic回归分析、非线性回归分析、判别分析等)
* 定量方法(时间轴分析、概率模型、优化)
* 决策分析(多目的决策分析、决策树、影响图、敏感性分析)
* 树立竞争优势的分析(通过项目和成功案例学习基本的分析理念)

(2) 冬学期
* 数据库入门(数据模型、数据库设计)
* 预测分析(时间轴分析、主成分分析、非参数回归、统计流程控制)
* 数据管理(ETL(Extract、Transform、Load)、数据治理、管理责任、元数据)
* 优化与启发(整数计划法、非线性计划法、局部探索法、超启发(模拟退火、遗传算法))

(3) 春学期
* 大数据分析(非结构化数据概念的学习、MapReduce技术、大数据分析方法)
* 数据挖掘(聚类(k-means法、分割法)、关联性规则、因子分析、存活时间分析)
* 其他,以下任选两门(社交网络、文本分析、Web分析、财务分析、服务业中的分析、能源、健康医疗、供应链管理、综合营销沟通中的概率模型)

(4) 秋学期
* 风险分析与运营分析的计算机模拟
* 软件层面的分析学(组织层面的分析课题、IT与业务用户、变革管理、数据课题、结果的展现与传达方法)

(EMC的在线课程:Data Science and Big Data Analytics Training__,收费T_T,大家可以了解下学习路径)

(5)分享一些免费的课程
以下课程免费,讲师都是领域的专家,需要提前报名,请注意开班的时间。

五、数据科学家的前景

EMC - Leading Cloud Computing, Big Data, and Trusted IT Solutions__,关于数据科学家的研究)
Like the physical universe, the digital universe is large – by 2020 containing nearly as many digital bits as there are stars in the universe. It is doubling in size every two years, and by 2020 the digital universe – the data we create and copy annually – will reach 44 zettabytes, or 44 trillion gigabytes.

EMC预测,按照目前的情况数字宇宙以每两年一番的速度倍增,在2020年将到达44ZB(1ZB=1.1805916207174113e+21B)。EMC做出了5点比较大胆的预测。

  • In 2013, while about 40% of the information in the digital universe required some type of data protection, less than 20% of the digital universe actually had these protections.
  • Data from embedded systems, the signals from which are a major component of the Internet of Things, will grow from 2% of the digital universe in 2013 to 10% in 2020.
  • In 2013, less than 20% of the data in the digital universe is “touched” by the cloud, either stored, perhaps temporarily, or processed in some way. By 2020, that percentage will double to 40%.
  • Most of the digital universe is transient – unsaved Netflix or Hulu movie streams, or Xbox One gamer interactions, temporary routing information in networks, sensor signals discarded when no alarms go off, etc. – and it is getting more so. This is a good thing, because the world’s amount of available storage capacity (i.e., unused bytes) across all media types is growing slower than the digital universe. In 2013, the available storage capacity could hold just 33% of the digital universe. By 2020, it will be able to store less than 15%.
  • In 2014, the digital universe will equal 1.7 megabytes a minute for every person on Earth.
    Between 2013 and 2020 the division of the digital universe between mature and emerging markets (e.g., China) will switch – from 60% accounted for by mature markets to 60% of the data in the digital universe coming from emerging markets.

EMC预测在2017年左右新兴的市场将超越成熟市场,东亚国家是最具潜力的引爆点。(大家是不是有点小激动,前景一片光明)

六、结束语

推荐网站:

Data Science Central__ (数据科学中心,大牛云集,资源丰富,讨论者热情,各种课程)

祝每一个DMer都挖掘到金矿和快乐:)

参考文献:

[1].Data Scientists: The Definition of Sexy__

[2].《大数据的冲击》. 城田真琴. 野村综合研究所创新开发部高级研究员、IT分析师,日本政府“智能云计算研究会”智囊团成员

[3].麦肯锡. Big data: The next frontier for innovation, competition, and productivity__

[4].EMC. Executive Summary: Data Growth, Business Opportunities, and the IT Imperatives__

[5].EMC Greenplum’s Steven Hillion on What Is a Data Scientist?__

[6].LinkedIn’s Monica Rogati On “What Is A Data Scientist?”__

[7].IBM - What is a Data Scientist?__

[8].Data Science and Prediction__

[9].The key word in “Data Science” is not Data, it is Science__

[10].Data Science: How do I become a data scientist?__

[11].A Practical Intro to Data Science__

[12].解码数据科学家__

1、基础篇:

  1. 读书《Introduction to Data Mining》,这本书很浅显易懂,没有复杂高深的公式,很合适入门的人。另外可以用这本书做参考《Data Mining : Concepts and Techniques》。第二本比较厚,也多了一些数据仓库方面的知识。如果对算法比较喜欢,可以再阅读《Introduction to Machine Learning》。

  2. 实现经典算法。有几个部分:
    a. 关联规则挖掘 (Apriori, FPTree, etc.)
    b. 分类 (C4.5, KNN, Logistic Regression, SVM, etc.)
    c. 聚类 (Kmeans, DBScan, Spectral Clustering, etc.)
    d. 降维 (PCA, LDA, etc.)
    e. 推荐系统 (基于内容的推荐,协同过滤,如矩阵分解等)
    然后在公开数据集上测试,看实现的效果。可以在下面的网站找到大量的公开数据集:http://archive.ics.uci.edu/ml/

  3. 熟悉几个开源的工具: Weka (用于上手); LibSVM, scikit-learn, Shogun

  4. https://www.kaggle.com/ 上参加几个101的比赛,学会如何将一个问题抽象成模型,并从原始数据中构建有效的特征 (Feature Engineering).

到这一步的话基本几个国内的大公司都会给你面试的机会。

2、进阶篇:

  1. 读书,下面几部都是大部头,但学完进步非常大。
    a.《Pattern Recognition and Machine Learning》
    b.《The Elements of Statistical Learning》
    c.《Machine Learning: A Probabilistic Perspective》
    第一本比较偏Bayesian;第二本比较偏Frequentist;第三本在两者之间,但我觉得跟第一本差不多,不过加了不少新内容。当然除了这几本大而全的,还有很多介绍不同领域的书,例如《Boosting Foundations and Algorithms》,《Probabilistic Graphical Models Principles and Techniques》;以及理论一些的《Foundations of Machine Learning》,《Optimization for Machine Learning》等等。这些书的课后习题也非常有用,做了才会在自己写Paper的时候推公式。

  2. 读论文。包括几个相关会议:KDD,ICML,NIPS,IJCAI,AAAI,WWW,SIGIR,ICDM;以及几个相关的期刊:TKDD,TKDE,JMLR,PAMI等。跟踪新技术跟新的热点问题。当然,如果做相关research,这一步是必须的。例如我们组的风格就是上半年读Paper,暑假找问题,秋天做实验,春节左右写/投论文。

  3. 跟踪热点问题。例如最近几年的Recommendation System,Social Network,Behavior Targeting等等,很多公司的业务都会涉及这些方面。以及一些热点技术,例如现在很火的Deep Learning。

  4. 学习大规模并行计算的技术,例如MapReduce、MPI,GPU Computing。基本每个大公司都会用到这些技术,因为现实的数据量非常大,基本都是在计算集群上实现的。

  5. 参加实际的数据挖掘的竞赛,例如KDDCUP,或 https://www.kaggle.com/ 上面的竞赛。这个过程会训练你如何在一个短的时间内解决一个实际的问题,并熟悉整个数据挖掘项目的全过程。

  6. 参与一个开源项目,如上面提到的Shogun或scikit-learn还有Apache的Mahout,或为一些流行算法提供更加有效快速的实现,例如实现一个Map/Reduce平台下的SVM。这也是锻炼Coding的能力。

到这一步国内的大公司基本是想哪去哪,而且待遇也不差;如果英语好,去US那边的公司难度也不大了。

MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障。但是MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负载均衡,如果其中master宕掉的话需要手动切换到另外一个master,而不能自动进行切换。

这篇文章下面要介绍如何通过LVS+Keepalived的方式来是实现MySQL的高可用性,同时解决以上问题。

Keepalived和LVS介绍

Keepalived是一个基于VRRP(虚拟路由冗余协议)可用来实现服务高可用性的软件方案,避免出现单点故障。Keepalived一般用来实现轻量级高可用性,且不需要共享存储,一般用于两个节点之间,常见有LVS+Keepalived、Nginx+Keepalived组合。

LVS(Linux Virtual Server)是一个高可用性虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

LVS主要用于多服务器的负载均衡,作用于网络层。LVS构建的服务器集群系统中,前端的负载均衡层被称为Director Server;后端提供服务的服务器组层被称为Real Server。通过下图可以大致了解LVS的基础架构。

lvs结构

LVS有三种工作模式,分别是DR(Direct Routing 直接路由)、TUN(Tunneling IP隧道)、NAT(Network Address Translation 网络地址转换)。其中TUN模式能够支持更多的Real Server,但需要所有服务器支持IP隧道协议;DR也可以支持相当的Real Server,但需要保证Director Server虚拟网卡与物理网卡在同一网段;NAT扩展性有限,无法支持更多的Real Server,因为所有的请求包和应答包都需要Director Server进行解析再生,影响效率。 同时,LVS负载均衡有10中调度算法,分别是rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq

本文中将利用LVS实现MySQL的读写负载均衡,Keepalived避免节点出现单点故障。

LVS+Keepalived配置

环境准备

LVS1:192.168.1.2
LVS2:192.168.1.11
MySQL Server1:192.168.1.5
MySQL Server2:192.168.1.6
VIP:192.168.1.100
OS: CentOS 6.4

Keepalive安装

需要安装以下软件包

1
# yum install -y kernel-devel openssl openssl-devel

解压keepalived到/usr/local/并进入目录执行配置编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64/
Keepalived configuration
------------------------
Keepalived version : 1.2.13
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No

# make

默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件,将需要的配置文件拷贝到指定位置

1
2
3
4
5
6
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# chkconfig mysqld on
# chkconfig keepalived on

LVS安装

需要安装以下软件包

# yum install -y libnl* popt*

查看是否加载lvs模块

# modprobe -l |grep ipvs

解压安装

1
2
3
# ln -s /usr/src/kernels/2.6.32-431.5.1.el6.x86_64/ /usr/src/linux
# tar -zxvf ipvsadm-1.26.tar.gz
# make

LVS安装完成,查看当前LVS集群

1
2
3
4
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

LVS+Keepalived配置

** 搭建MySQL主主复制 **

这里不再赘述,请参考MySQL复制

** 配置Keepalived **

下面是LVS1节点(Keepalived主节点)上的Keepalived配置,LVS2类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# vim /etc/keepalived/keepalived.conf    

! Configuration File for keepalived

global_defs {
router_id LVS1
}

vrrp_instance VI_1 {
state MASTER #指定instance初始状态,实际根据优先级决定.backup节点不一样
interface eth0 #虚拟IP所在网
virtual_router_id 51 #VRID,相同VRID为一个组,决定多播MAC地址
priority 100 #优先级,另一台改为90.backup节点不一样
advert_int 1 #检查间隔
authentication {
auth_type PASS #认证方式,可以是pass或ha
auth_pass 1111 #认证密码
}
virtual_ipaddress {
192.168.1.100 #VIP
}
}

virtual_server 192.168.1.100 3306 {
delay_loop 6 #服务轮询的时间间隔
lb_algo wrr #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
lb_kind DR #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
#nat_mask 255.255.255.0
persistence_timeout 50 #会话保持时间
protocol TCP #健康检查协议

## Real Server设置,3306就是MySQL连接端口
real_server 192.168.1.5 3306 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 192.168.1.6 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}

配置LVS

编写LVS启动脚本/etc/init.d/realserver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/sh
VIP=192.168.1.100
. /etc/rc.d/init.d/functions

case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/sbin/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在回环地址上绑定VIP,设定掩码,与Direct Server(自身)上的IP保持通信
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0

将lvs脚本加入开机自启动

1
2
# chmod +x /etc/init.d/realserver
# echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local

分别启动LVS和keepalived

1
2
# service realserver start
# service keepalived start

注意此时网卡的变化,可以看到虚拟网卡已经分配到了realserver上。

此时查看LVS集群状态,可以看到集群下有两个Real Server,调度算法,权重等信息。ActiveConn代表当前Real Server的活跃连接数

1
2
3
4
5
6
7
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:3306 wrr persistent 50
-> 192.168.1.5:3306 Route 3 4 1
-> 192.168.1.6:3306 Route 3 0 2

此时LVS+Keepalived+MySQL主主复制已经搭建完成。

测试验证

** 功能性验证 **

关闭MySQL Server2

1
# service mysqld stop

在LVS1查看/var/log/messages中关于keepalived日志,LVS1检测到了MySQL Server2宕机,同时LVS集群自动剔除了故障节点

1
2
Sep  9 13:50:53 192.168.1.2 Keepalived_healthcheckers[18797]: TCP connection to [192.168.1.6]:3306 failed !!!
Sep 9 13:50:53 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.6]:3306 from VS [192.168.1.100]:3306

从新启动MySQL Server2后自动将故障节点自动加入LVS集群

1
2
Sep  9 13:51:41 192.168.1.2 Keepalived_healthcheckers[18797]: TCP connection to [192.168.1.6]:3306 success.
Sep 9 13:51:41 192.168.1.2 Keepalived_healthcheckers[18797]: Adding service [192.168.1.6]:3306 to VS [192.168.1.100]:3306

关闭LVS1上的Keepalived(模拟宕机操作),查看LVS1上的日志,可以看到Keepalived移出了LVS1上的VIP

1
2
3
4
5
Sep  9 14:01:27 192.168.1.2 Keepalived[18796]: Stopping Keepalived v1.2.13 (09/09,2014)
Sep 9 14:01:27 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.5]:3306 from VS [192.168.1.100]:3306
Sep 9 14:01:27 192.168.1.2 Keepalived_healthcheckers[18797]: Removing service [192.168.1.6]:3306 from VS [192.168.1.100]:3306
Sep 9 14:01:27 192.168.1.2 Keepalived_vrrp[18799]: VRRP_Instance(VI_1) sending 0 priority
Sep 9 14:01:27 192.168.1.2 Keepalived_vrrp[18799]: VRRP_Instance(VI_1) removing protocol VIPs.

同时查看LVS2上日志,可以看到LVS2成为了Master,并接管了VIP

1
2
3
4
5
6
7
Sep  9 14:11:24 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Transition to MASTER STATE
Sep 9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Entering MASTER STATE
Sep 9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) setting protocol VIPs.
Sep 9 14:11:25 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.100
Sep 9 14:11:25 192.168.1.11 Keepalived_healthcheckers[7456]: Netlink reflector reports IP 192.168.1.100 added
Sep 9 14:11:25 192.168.1.11 avahi-daemon[1407]: Registering new address record for 192.168.1.100 on eth0.IPv4.
Sep 9 14:11:30 192.168.1.11 Keepalived_vrrp[7457]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.1.100

在LVS2上查看LVS集群状态,一切正常。

1
2
3
4
5
6
7
# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.100:3306 wrr persistent 50
-> 192.168.1.5:3306 Route 3 2 0
-> 192.168.1.6:3306 Route 3 1 0

总结

MySQL主主复制是集群的基础,组成Server Array,其中每个节点作为Real Server。

LVS服务器提供了负载均衡的作用,将用户请求分发到Real Server,一台Real Server故障并不会影响整个集群。

Keepalived搭建主备LVS服务器,避免了LVS服务器的单点故障,出现故障时可以自动切换到正常的节点。

首图

作 者:韩 昊
知 乎:Heinrich
微 博:@花生油工人
知乎专栏:与时间无关的故事

谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。

转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。

——更新于2014.6.6,想直接看更新的同学可以直接跳到第四章————

我保证这篇文章和你以前看过的所有文章都不同,这是 12 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者……
  这篇文章的核心思想就是:

  要让读者在不看任何数学公式的情况下理解傅里叶分析。

  傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多大一新生上来就懵圈并从此对它深恶痛绝。老实说,这么有意思的东西居然成了大学里的杀手课程,不得不归咎于编教材的人实在是太严肃了。(您把教材写得好玩一点会死吗?会死吗?)所以我一直想写一个有意思的文章来解释傅里叶分析,有可能的话高中生都能看懂的那种。所以,不管读到这里的您从事何种工作,我保证您都能看懂,并且一定将体会到通过傅里叶分析看到世界另一个样子时的快感。至于对于已经有一定基础的朋友,也希望不要看到会的地方就急忙往后翻,仔细读一定会有新的发现。

  ————以上是定场诗————

下面进入正题:

  抱歉,还是要啰嗦一句:其实学习本来就不是易事,我写这篇文章的初衷也是希望大家学习起来更加轻松,充满乐趣。但是千万!千万不要把这篇文章收藏起来,或是存下地址,心里想着:以后有时间再看。这样的例子太多了,也许几年后你都没有再打开这个页面。无论如何,耐下心,读下去。这篇文章要比读课本要轻松、开心得多……

  p.s.本文无论是 cos 还是 sin,都统一用“正弦波”(Sine Wave)一词来代表简谐波。

一、什么是频域

  从我们出生,我们看到的世界都以时间贯穿,股票的走势、人的身高、汽车的轨迹都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析。而我们也想当然的认为,世间万物都在随着时间不停的改变,并且永远不会静止下来。但如果我告诉你,用另一种方法来观察世界的话,你会发现世界是永恒不变的,你会不会觉得我疯了?我没有疯,这个静止的世界就叫做频域。

  先举一个公式上并非很恰当,但意义上再贴切不过的例子:

  在你的理解中,一段音乐是什么呢?

音乐

 这是我们对音乐最普遍的理解,一个随着时间变化的震动。但我相信对于乐器小能手们来说,音乐更直观的理解是这样的:

五线谱

好的!下课,同学们再见。

  是的,其实这一段写到这里已经可以结束了。上图是音乐在时域的样子,而下图则是音乐在频域的样子。所以频域这一概念对大家都从不陌生,只是从来没意识到而已。
 现在我们可以回过头来重新看看一开始那句痴人说梦般的话:世界是永恒的。
将以上两图简化:

  时域:

时域

频率

频域

在时域,我们观察到钢琴的琴弦一会上一会下的摆动,就如同一支股票的走势;而在频域,只有那一个永恒的音符。

  所以

  你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。

  抱歉,这不是一句鸡汤文,而是黑板上确凿的公式:傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。在第一个例子里我们可以理解为,利用对不同琴键不同力度,不同时间点的敲击,可以组合出任何一首乐曲。

  而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation),我们从简单的开始谈起。

二、傅里叶级数(Fourier Series)的频谱

还是举个栗子并且有图有真相才好理解。

  如果我说我能用前面说的正弦曲线波叠加出一个带 90 度角的矩形波来,你会相信吗?你不会,就像当年的我一样。但是看看下图:

频域

第一幅图是一个郁闷的正弦波 cos(x)

  第二幅图是 2 个卖萌的正弦波的叠加 cos (x) +a.cos (3x)

  第三幅图是 4 个发春的正弦波的叠加

  第四幅图是 10 个便秘的正弦波的叠加

  随着正弦波数量逐渐的增长,他们最终会叠加成一个标准的矩形,大家从中体会到了什么道理?
(只要努力,弯的都能掰直!)

  随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又抵消了上升到最高处时继续上升的部分使其变为水平线。一个矩形就这么叠加而成了。但是要多少个正弦波叠加起来才能形成一个标准 90 度角的矩形波呢?不幸的告诉大家,答案是无穷多个。(上帝:我能让你们猜着我?)

  不仅仅是矩形,你能想到的任何波形都是可以如此方法用正弦波叠加起来的。这是没

  有接触过傅里叶分析的人在直觉上的第一个难点,但是一旦接受了这样的设定,游戏就开始有意思起来了。
 还是上图的正弦波累加成矩形波,我们换一个角度来看看:

频域2

在这几幅图中,最前面黑色的线就是所有正弦波叠加而成的总和,也就是越来越接近矩形波的那个图形。而后面依不同颜色排列而成的正弦波就是组合为矩形波的各个分量。这些正弦波按照频率从低到高从前向后排列开来,而每一个波的振幅都是不同的。一定有细心的读者发现了,每两个正弦波之间都还有一条直线,那并不是分割线,而是振幅为 0 的正弦波!也就是说,为了组成特殊的曲线,有些正弦波成分是不需要的。

  这里,不同频率的正弦波我们成为频率分量。

  好了,关键的地方来了!!

  如果我们把第一个频率最低的频率分量看作“1”,我们就有了构建频域的最基本单元。

  对于我们最常见的有理数轴,数字“1”就是有理数轴的基本单元。

  时域的基本单元就是“1 秒”,如果我们将一个角频率为的正弦波 cos(t)看作基础,那么频域的基本单元就是

  有了“1”,还要有“0”才能构成世界,那么频域的“0”是什么呢?cos(0t)就是一个周期无限长的正弦波,也就是一条直线!所以在频域,0 频率也被称为直流分量,在傅里叶级数的叠加中,它仅仅影响全部波形相对于数轴整体向上或是向下而不改变波的形状。

  接下来,让我们回到初中,回忆一下已经死去的八戒,啊不,已经死去的老师是怎么定义正弦波的吧。

频域

正弦波就是一个圆周运动在一条直线上的投影。所以频域的基本单元也可以理解为一个始终在旋转的圆

频域

想看动图的同学请戳这里:

  File:Fourier series square wave circles animation.gif

频域

以及这里:

  File:Fourier series sawtooth wave circles animation.gif

  点出去的朋友不要被 wiki 拐跑了,wiki 写的哪有这里的文章这么没节操是不是。

  介绍完了频域的基本组成单元,我们就可以看一看一个矩形波,在频域里的另一个模样了:

频域

这是什么奇怪的东西?

  这就是矩形波在频域的样子,是不是完全认不出来了?教科书一般就给到这里然后留给了读者无穷的遐想,以及无穷的吐槽,其实教科书只要补一张图就足够了:频域图像,也就是俗称的频谱,就是——

频域

 再清楚一点:

频域

可以发现,在频谱中,偶数项的振幅都是0,也就对应了图中的彩色直线。振幅为 0 的正弦波。

频域

动图请戳:

  File:Fourier series and transform.gif

  老实说,在我学傅里叶变换时,维基的这个图还没有出现,那时我就想到了这种表达方法,而且,后面还会加入维基没有表示出来的另一个谱——相位谱。

  但是在讲相位谱之前,我们先回顾一下刚刚的这个例子究竟意味着什么。记得前面说过的那句“世界是静止的”吗?估计好多人对这句话都已经吐槽半天了。想象一下,世界上每一个看似混乱的表象,实际都是一条时间轴上不规则的曲线,但实际这些曲线都是由这些无穷无尽的正弦波组成。我们看似不规律的事情反而是规律的正弦波在时域上的投影,而正弦波又是一个旋转的圆在直线上的投影。那么你的脑海中会产生一个什么画面呢?

  我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的。在最外面的小齿轮上有一个小人——那就是我们自己。我们只看到这个小人毫无规律的在幕布前表演,却无法预测他下一步会去哪。而幕布后面的齿轮却永远一直那样不停的旋转,永不停歇。这样说来有些宿命论的感觉。说实话,这种对人生的描绘是我一个朋友在我们都是高中生的时候感叹的,当时想想似懂非懂,直到有一天我学到了傅里叶级数……

三、傅里叶级数(Fourier Series)的相位谱

上一章的关键词是:从侧面看。这一章的关键词是:从下面看。

  在这一章最开始,我想先回答很多人的一个问题:傅里叶分析究竟是干什么用的?这段相对比较枯燥,已经知道了的同学可以直接跳到下一个分割线。

  先说一个最直接的用途。无论听广播还是看电视,我们一定对一个词不陌生——频道。频道频道,就是频率的通道,不同的频道就是将不同的频率作为一个通道来进行信息传输。下面大家尝试一件事:

  先在纸上画一个 sin(x),不一定标准,意思差不多就行。不是很难吧。

  好,接下去画一个 sin(3x)+sin(5x)的图形。

  别说标准不标准了,曲线什么时候上升什么时候下降你都不一定画的对吧?

  好,画不出来不要紧,我把 sin(3x)+sin(5x)的曲线给你,但是前提是你不知道这个曲线的方程式,现在需要你把 sin(5x)给我从图里拿出去,看看剩下的是什么。这基本是不可能做到的。

  但是在频域呢?则简单的很,无非就是几条竖线而已。

  所以很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。

  再说一个更重要,但是稍微复杂一点的用途——求解微分方程。(这段有点难度,看不懂的可以直接跳过这段)微分方程的重要性不用我过多介绍了。各行各业都用的到。但是求解微分方程却是一件相当麻烦的事情。因为除了要计算加减乘除,还要计算微分积分。而傅里叶变换则可以让微分和积分在频域中变为乘法和除法,大学数学瞬间变小学算术有没有。

  傅里叶分析当然还有其他更重要的用途,我们随着讲随着提。

  ————————————————————————————————————

下面我们继续说相位谱:

  通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每一个对应的正弦波的振幅是多少,而没有提到相位。基础的正弦波A.sin (wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。那么这个相位谱在哪呢?我们看下图,这次为了避免图片太混论,我们用 7 个波叠加的图。

频域

鉴于正弦波是周期的,我们需要设定一个用来标记正弦波位置的东西。在图中就是那些小红点。小红点是距离频率轴最近的波峰,而这个波峰所处的位置离频率轴有多远呢?为了看的更清楚,我们将红色的点投影到下平面,投影点我们用粉色点来表示。当然,这些粉色的点只标注了波峰距离频率轴的距离,并不是相位。

频域

这里需要纠正一个概念:时间差并不是相位差。如果将全部周期看作 2Pi 或者 360 度的话,相位差则是时间差在一个周期中所占的比例。我们将时间差除周期再乘 2Pi,就得到了相位差。

  在完整的立体图中,我们将投影得到的时间差依次除以所在频率的周期,就得到了最下面的相位谱。所以,频谱是从侧面看,相位谱是从下面看。下次偷看女生裙底被发现的话,可以告诉她:“对不起,我只是想看看你的相位谱。”

  注意到,相位谱中的相位除了0,就是 Pi。因为 cos(t+Pi)=-cos(t),所以实际上相位为 Pi 的波只是上下翻转了而已。对于周期方波的傅里叶级数,这样的相位谱已经是很简单的了。另外值得注意的是,由于 cos(t+2Pi)=cos(t),所以相位差是周期的,pi 和 3pi,5pi,7pi 都是相同的相位。人为定义相位谱的值域为(-pi,pi],所以图中的相位差均为 Pi。

  最后来一张大集合:

频域

四、傅里叶变换(Fourier Tranformation)

相信通过前面三章,大家对频域以及傅里叶级数都有了一个全新的认识。但是文章在一开始关于钢琴琴谱的例子我曾说过,这个栗子是一个公式错误,但是概念典型的例子。所谓的公式错误在哪里呢?

  傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,但是宇宙似乎并不是周期的。曾经在学数字信号处理的时候写过一首打油诗:

  往昔连续非周期,

  回忆周期不连续,

  任你 ZT、DFT,

  ** 还原不回去。**

  (请无视我渣一样的文学水平……)
在这个世界上,有的事情一期一会,永不再来,并且时间始终不曾停息地将那些刻骨铭心的往昔连续的标记在时间点上。但是这些事情往往又成为了我们格外宝贵的回忆,在我们大脑里隔一段时间就会周期性的蹦出来一下,可惜这些回忆都是零散的片段,往往只有最幸福的回忆,而平淡的回忆则逐渐被我们忘却。因为,往昔是一个连续的非周期信号,而回忆是一个周期离散信号。

  是否有一种数学工具将连续非周期信号变换为周期离散信号呢?抱歉,真没有。

  比如傅里叶级数,在时域是一个周期且连续的函数,而在频域是一个非周期离散的函数。这句话比较绕嘴,实在看着费事可以干脆回忆第一章的图片。

  而在我们接下去要讲的傅里叶变换,则是将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。

  算了,还是上一张图方便大家理解吧:

频域

或者我们也可以换一个角度理解:傅里叶变换实际上是对一个周期无限大的函数进行傅里叶变换。

  所以说,钢琴谱其实并非一个连续的频谱,而是很多在时间上离散的频率,但是这样的一个贴切的比喻真的是很难找出第二个来了。

  因此在傅里叶变换在频域上就从离散谱变成了连续谱。那么连续谱是什么样子呢?

  你见过大海么?

  为了方便大家对比,我们这次从另一个角度来看频谱,还是傅里叶级数中用到最多的那幅图,我们从频率较高的方向看。

频域

以上是离散谱,那么连续谱是什么样子呢?

  尽情的发挥你的想象,想象这些离散的正弦波离得越来越近,逐渐变得连续……

  直到变得像波涛起伏的大海:

频域

很抱歉,为了能让这些波浪更清晰的看到,我没有选用正确的计算参数,而是选择了一些让图片更美观的参数,不然这图看起来就像屎一样了。

  不过通过这样两幅图去比较,大家应该可以理解如何从离散谱变成了连续谱的了吧?原来离散谱的叠加,变成了连续谱的累积。所以在计算上也从求和符号变成了积分符号。

  不过,这个故事还没有讲完,接下去,我保证让你看到一幅比上图更美丽壮观的图片,但是这里需要介绍到一个数学工具才能然故事继续,这个工具就是——

 五、宇宙耍帅第一公式:欧拉公式

虚数i这个概念大家在高中就接触过,但那时我们只知道它是-1 的平方根,可是它真正的意义是什么呢?

频域

这里有一条数轴,在数轴上有一个红色的线段,它的长度是1。当它乘以 3 的时候,它的长度发生了变化,变成了蓝色的线段,而当它乘以-1 的时候,就变成了绿色的线段,或者说线段在数轴上围绕原点旋转了 180 度。

我们知道乘-1 其实就是乘了两次 i 使线段旋转了 180 度,那么乘一次 i 呢——答案很简单——旋转了 90 度。

频域

同时,我们获得了一个垂直的虚数轴。实数轴与虚数轴共同构成了一个复数的平面,也称复平面。这样我们就了解到,乘虚数i的一个功能——旋转。

  现在,就有请宇宙第一耍帅公式欧拉公式隆重登场——

频域

这个公式在数学领域的意义要远大于傅里叶分析,但是乘它为宇宙第一耍帅公式是因为它的特殊形式——当x等于 Pi 的时候。

频域

经常有理工科的学生为了跟妹子表现自己的学术功底,用这个公式来给妹子解释数学之美:”石榴姐你看,这个公式里既有自然底数e,自然数 1 和0,虚数i还有圆周率 pi,它是这么简洁,这么美丽啊!“但是姑娘们心里往往只有一句话:”臭屌丝……“

  这个公式关键的作用,是将正弦波统一成了简单的指数形式。我们来看看图像上的涵义:

频域

欧拉公式所描绘的,是一个随着时间变化,在复平面上做圆周运动的点,随着时间的改变,在时间轴上就成了一条螺旋线。如果只看它的实数部分,也就是螺旋线在左侧的投影,就是一个最基础的余弦函数。而右侧的投影则是一个正弦函数。

  关于复数更深的理解,大家可以参考:

  复数的物理意义是什么?

  这里不需要讲的太复杂,足够让大家理解后面的内容就可以了。

六、指数形式的傅里叶变换

有了欧拉公式的帮助,我们便知道:正弦波的叠加,也可以理解为螺旋线的叠加在实数空间的投影。而螺旋线的叠加如果用一个形象的栗子来理解是什么呢?

光波

  高中时我们就学过,自然光是由不同颜色的光叠加而成的,而最著名的实验就是牛顿师傅的三棱镜实验:

频域

所以其实我们在很早就接触到了光的频谱,只是并没有了解频谱更重要的意义。

  但不同的是,傅里叶变换出来的频谱不仅仅是可见光这样频率范围有限的叠加,而是频率从 0 到无穷所有频率的组合。

  这里,我们可以用两种方法来理解正弦波:

  第一种前面已经讲过了,就是螺旋线在实轴的投影。

  另一种需要借助欧拉公式的另一种形式去理解:

频域

将以上两式相加再除2,得到:

频域

这个式子可以怎么理解呢?

  我们刚才讲过,e^(it)可以理解为一条逆时针旋转的螺旋线,那么e^(-it)则可以理解为一条顺时针旋转的螺旋线。而 cos (t)则是这两条旋转方向不同的螺旋线叠加的一半,因为这两条螺旋线的虚数部分相互抵消掉了!

  举个例子的话,就是极化方向不同的两束光波,磁场抵消,电场加倍。

  这里,逆时针旋转的我们称为正频率,而顺时针旋转的我们称为负频率(注意不是复频率)。

  好了,刚才我们已经看到了大海——连续的傅里叶变换频谱,现在想一想,连续的螺旋线会是什么样子:

  想象一下再往下翻:

频域

是不是很漂亮?

  你猜猜,这个图形在时域是什么样子?

频域

哈哈,是不是觉得被狠狠扇了一个耳光。数学就是这么一个把简单的问题搞得很复杂的东西。

  顺便说一句,那个像大海螺一样的图,为了方便观看,我仅仅展示了其中正频率的部分,负频率的部分没有显示出来。

  如果你认真去看,海螺图上的每一条螺旋线都是可以清楚的看到的,每一条螺旋线都有着不同的振幅(旋转半径),频率(旋转周期)以及相位。而将所有螺旋线连成平面,就是这幅海螺图了。

  好了,讲到这里,相信大家对傅里叶变换以及傅里叶级数都有了一个形象的理解了,我们最后用一张图来总结一下:

频域

好了,傅里叶的故事终于讲完了,下面来讲讲我的故事:

  这篇文章第一次被卸下来的地方你们绝对猜不到在哪,是在一张高数考试的卷子上。当时为了刷分,我重修了高数(上),但是后来时间紧压根没复习,所以我就抱着裸考的心态去了考场。但是到了考场我突然意识到,无论如何我都不会比上次考的更好了,所以干脆写一些自己对于数学的想法吧。于是用了一个小时左右的时间在试卷上洋洋洒洒写了本文的第一草稿。

  你们猜我的了多少分?

6 分

  没错,就是这个数字。而这 6 分的成绩是因为最后我实在无聊,把选择题全部填上了C,应该是中了两道,得到了这宝贵的 6 分。说真的,我很希望那张卷子还在,但是应该不太可能了。

  那么你们猜猜我第一次信号与系统考了多少分呢?

  45 分

  没错,刚刚够参加补考的。但是我心一横没去考,决定重修。因为那个学期在忙其他事情,学习真的就抛在脑后了。但是我知道这是一门很重要的课,无论如何我要吃透它。说真的,信号与系统这门课几乎是大部分工科课程的基础,尤其是通信专业。

  在重修的过程中,我仔细分析了每一个公式,试图给这个公式以一个直观的理解。虽然我知道对于研究数学的人来说,这样的学习方法完全没有前途可言,因为随着概念愈加抽象,维度越来越高,这种图像或者模型理解法将完全丧失作用。但是对于一个工科生来说,足够了。

  后来来了德国,这边学校要求我重修信号与系统时,我彻底无语了。但是没办法,德国人有时对中国人就是有种藐视,觉得你的教育不靠谱。所以没办法,再来一遍吧。

  这次,我考了满分,而及格率只有一半。

  老实说,数学工具对于工科生和对于理科生来说,意义是完全不同的。工科生只要理解了,会用,会查,就足够了。但是很多高校却将这些重要的数学课程教给数学系的老师去教。这样就出现一个问题,数学老师讲得天花乱坠,又是推理又是证明,但是学生心里就只有一句话:学这货到底干嘛用的?

  缺少了目标的教育是彻底的失败。

  在开始学习一门数学工具的时候,学生完全不知道这个工具的作用,现实涵义。而教材上有只有晦涩难懂,定语就二十几个字的概念以及看了就眼晕的公式。能学出兴趣来就怪了!

  好在我很幸运,遇到了大连海事大学的吴楠老师。他的课全程来看是两条线索,一条从上而下,一条从下而上。先将本门课程的意义,然后指出这门课程中会遇到哪样的问题,让学生知道自己学习的某种知识在现实中扮演的角色。然后再从基础讲起,梳理知识树,直到延伸到另一条线索中提出的问题,完美的衔接在一起!

  这样的教学模式,我想才是大学里应该出现的。

  最后,写给所有给我点赞并留言的同学。真的谢谢大家的支持,也很抱歉不能一一回复。因为知乎专栏的留言要逐次加载,为了看到最后一条要点很多次加载。当然我都坚持看完了,只是没办法一一回复。

  本文只是介绍了一种对傅里叶分析新颖的理解方法,对于求学,还是要踏踏实实弄清楚公式和概念,学习,真的没有捷径。但至少通过本文,我希望可以让这条漫长的路变得有意思一些。

  最后,祝大家都能在学习中找到乐趣。

I was working on a legacy project recently and needed to import some data from MySQL 5.5. All the queries in the code worked perfectly in MySQL 5.5, so I assumed an upgrade to 5.7 would be seamless. Not so.

First I got errors due to DateTime columns being populated with zeros during import, then when running this query:

1
2
3
4
5
6
7
8
9
select *
from ebay_order_items
where
z_shipmentno is null
and ExternalTransactionID is not null
and orderstatus = 'Completed'
and timestamp > '2015-02-25'
group by ExternalTransactionID
order by timestamp desc

I got this:

1
2
3
4
5
Expression #1 of SELECT list is not in GROUP BY
clause and contains nonaggregated column
'1066export.ebay_order_items.TransactionID' which
is not functionally dependent on columns in GROUP BY
clause; this is incompatible with sql_mode=only_full_group_by

It turned out that the only_full_group_by mode was made default in version 5.7.5., which breaks many of such naïve queries. In fact, see here for more info.

I could rewrite all queries to be 5.7 compatible (hat tip to George Fekete for the solution) and do something as atrocious as this:

1
2
3
4
5
6
7
8
9
10
11
select extf.* from (
select ExternalTransactionID
from ebay_order_items
where ExternalTransactionID is not null
group by ExternalTransactionID
) extf JOIN ebay_order_items eoi
ON (eoi.ExternalTransactionID = extf.ExternalTransactionID)
where eoi.z_shipmentno is null
and eoi.orderstatus = 'Completed'
and eoi.timestamp > '2015-02-25'
order by eoi.timestamp desc

… but this would make the already complex refactoring much more difficult. It would be much better to temporarily disable these checks and force MySQL to act like it did in 5.6.

Permanently changing SQL mode

First, we find out which configuration file our MySQL installation prefers. For that, we need the binary’s location:

1
2
$ which mysqld
/usr/sbin/mysqld

Then, we use this path to execute the lookup:

1
2
3
4
$ /usr/sbin/mysqld --verbose --help | grep -A 1 "Default options"

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

We can see that the first favored configuration file is one in the root of the etc folder. That file, however, did not exist on my system so I opted for the second one.

First, we find out the current sql mode:

1
2
3
4
5
6
7
mysql -u homestead -psecret -e "select @@sql_mode"

+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

Then, we copy the current string this query produced and remove everything we don’t like. In my case, I needed to get rid of NO_ZERO_IN_DATE, NO_ZERO_DATE and of course ONLY_FULL_GROUP_BY. The newly formed string then looks like this:

1
2
STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

We open the configuration file we decided on before (/etc/mysql/my.cnf) and add the following line into the [mysqld] section:

1
2
3
4
[mysqld]
# ... other stuff will probably be here
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Save, exit, and restart MySQL:

1
sudo service mysql restart

Voilà, the SQL mode is permanently changed and I can continue developing the legacy project until I need some additional strictness.

1.创建不同的SSH密钥, -t指定加密方法,RSA或DSA;-C注释;-f指定文件名

ssh-keygen -t dsa -C "email.xxx" -f ~/.ssh/xxx

以上命令在~/.ssh/下生成xxx密钥对

2.编辑 ~/.ssh/config 文件,配置格式示例:

1
2
3
4
Host github.com www.github.com
IdentityFile ~/.ssh/code_github
Host bitbucket.org www.bitbucket.org
IdentityFile ~/.ssh/code_bitbucket

查看 man ssh_config 有更多参数说明

3.把xxx.pub公钥文件的内容加入到要自动登陆服务器指定用户下的~/.ssh/authorized_keys 文件中

4.使用ssh登陆网站时会自动判断使用哪一对密钥认证