【重磅】Google开源全球最精准自然语言解析器SyntaxNet

来源:Google Research

编译:胡祥杰  朱焕

 

【新智元导读】Google Research今天宣布,世界准确度最高的自然语言解析器SyntaxNet开源。谷歌开源再进一步。据介绍,谷歌在该平台上训练的模型的语言理解准确率超过90%。近日,众多科技巨头人工智能相关平台开源步伐明显加快:谷歌和Facebook一直在领跑,马斯克的OpenAI欲打造一个完全公开的AI模型训练营,就连一直被批评“保守”的亚马逊也在尝试开源。这一股开源热潮背后,是人工智能研究者的福利,但同时也是一场激烈的数据和平台争夺战。

Google环境计算( Ambient  computing) 架构师Yonatan Zunger说:事实上,语言理解被我们认为是“AI的终极任务”,要解决这一难题,前提是要能解决全部人类水平人工智能的问题。

机 器对语言的理解过程,可以分为几个步骤,其中很多的不确定性是逐渐明晰的(语音识别的不确定性更多,因为还要解决从声音到词的转换)。第一步是要把词分 开,放到依存树上,看哪一个词是动词,对名词有哪些影响等等。随后,要理解每一个名字的含义。再次,再加入许多先验知识,即对这个世界的理解,因为很多句 子只有使用了这些信息才能真正理解。如果足够幸运的话,到这就能得到清晰的理解了。

谷歌资深研究科学家Slav Petrov在Google Research的博客上写到:在谷歌,我们花费了大量的时间在思考,计算机系统如何才能阅读和理解人类语言,以一种更加智能的方式处理这些语言?今天,我们激动地跟大家分享我们的研究,向更广阔的人群发布SyntaxNet。这是一个在TensoFlow中运行的开源神经网络框架,提供自然语言理解系统基础。我们所公开的包含了所有用你自己的数据训练新的SyntaxNet模型所需要的代码,以及Paesey  McParseface——我们已经训练好的,可用于分析英语文本的模型。

Paesey  McParseface 建立于强大的机器学习算法,可以学会分析句子的语言结构,能解释特定句子中每一个词的功能。此类模型中,Paesey  McParseface是世界上最精确的,我们希望他能帮助对自动提取信息、翻译和其它自然语言理解(NLU)中的应用感兴趣的研究者和开放者。

SyntaxNet是怎么工作的?

SyntaxNet是一个框架,即学术圈所指的SyntacticParser,他是许多NLU系统中的关键组件。在这个系统中输入一个句子,他会自动给句子中的每一个单词打上POS(part-of-Speech)标签,用来描述这些词的句法功能,并在依存句法树中呈现。这些句法关系直接涉及句子的潜在含义。

举一个很简单的例子,看下面这个句子“Alice saw Bob”的依存句法树:

在这个结构中,Alice和Bob被编码为名词,Saw是动词。只要的动词saw 是句子的根,Alice是saw的主语,Bob是直接宾语(dobj)。和期待的一样,Paesey  McParseface能正确地分析这一句子,也能理解下面这个更加复杂的例子:

句子:Alice, who had been reading about SynataxNet, saw Bob in the hallwayyesterday

在这个句子的编码中,Alice 和 Bob的分别是saw的主语和宾语,Alice由一个带动词“reading”的关系从句来修饰,而saw则由时态“yesterday”来修饰。依存句法树中的语法关系让我们可以轻易地找到不同问题的答案,比如,Alice看见了谁?谁看到了Bob?Alice正在读的是什么?或者Alice是在什么时候看到Bob的。

为什么让计算机正确处理句法分析如此困难?

 

句法分析如此困难的一个主要问题是,人类语言具有显著的歧义性。包含 20 到 30 个单词的中等长度的句子会具有数百、数千甚至数万种可能的句法结构,这样的情况并不少见。一个自然语言句法分析器必须能够搜索所有这些结构选择,并找到给定语境下最合理的那个结构。作为一个非常简单的例子,“Alice drove down the streetin her car”这个句子就具有至少两种可能的依存分析:

第一种分析是对应这句话的(正确)解释,按照这种解释,爱丽丝在汽车里进行驾驶,而汽车位于街道上;第二种分析对应于一种对这句话的(荒诞但仍然可能的)解释,按照这种解释,爱丽丝在街道上驾驶,而街道位于汽车之内。之所以会产生这种歧义,是因为“in”这个介词既可以用来修饰“drove(驾驶)”也可以用来修饰“street(街道)”。上面这个例子是所谓的“介词短语附着歧义”的一个实例。

 

人类在处理歧义方面有超强的能力,以至于人们甚至注意不到句子有歧义。而这里的挑战是,如何能让计算机做到同样好。长句中的多重歧义会共同造成句子的可能结构数量的组合爆炸。通常,这些结构中的绝大多数都极其不合理,但它们仍然是可能的,句法分析器必须以某种方式来丢弃它们。

 

SyntaxNet 将神经网络运用于歧义问题。一个输入句子被从左到右地处理。当句子中的每个词被处理时,词与词之间的依存关系也会被逐步地添加进来。由于歧义的存在,在处理过程的每个时间点上都存在多种可能的决策,而神经网络会基于这些决策的合理性向这些彼此竞争的决策分配分数。出于这一原因,在该模型中使用 Beam Search (集束搜索)就变得十分重要。不是直接取每个时间点上的最优决定,而是在每一步都保留多个部分性假设。只有当存在多个得分更高的假设的时候,一个假设才会被抛弃。下图将展示的,是“I booked a ticket to Google”这句话经过从左到右的决策过程而产生的简单句法分析。

而且,正如我们在论文中所描述的,十分重要的一点是,要把学习和搜索紧密整合起来才能取得最高的预测准确度。Parsey McParseface 和其他 SyntaxNet 模型是我们用谷歌的 TensorFlow 框架训练过的最复杂的网络结构。通过利用谷歌支持的 Universal Treebanks 项目中的数据,你也可以在自己的机器上训练句法分析模型。

 

 Parsey McParseface 的准确度到底有多高?

 

在(从具有二十年历史的宾大树库Penn Treebank中)随机抽取的英语新闻句子构成的标准测试中,Parsey McParseface 在提取词之间的个体依存关系时的准确率超过 94%,这打败了我们自己先前的最高水平,也超过了任何以前的方法。尽管在文献中并没有关于人类的句法分析成绩的明确研究,我们从我们内部的句法标注项目中了解到,那些在该任务上受过训练的语言学家在 96-97% 的情况下能达成一致。这说明,我们正在接近人类的水平——不过这仍然限于那些格式良好的文本。按照我们从 Google WebTreebank (谷歌网络树库,发布于 2011 年)中所学到的,那些从互联网上获得的句子要远远更难分析。在该网络数据集上,Parsey McParseface 只取得了略高于 90% 的句法分析准确率。

 

尽管准确率还不够完美,它已经足够高,能够用于许多应用程序了。目前,错误的主要来源是像上面描述过的介词短语附着歧义这样的情况,对这些情况的处理要求对现实世界的知识(例如,“街道不太可能位于汽车之内”)和深度语境推理。机器学习(特别是神经网络)已在解决这些歧义方面取得了显著的进展。不过我们仍想做进一步的工作:我们想要发展出一些方法,这些方法能够学习现实世界知识,也能够在所有语言和语境中都取得同样好的自然语言理解。

 

想试试吗,请阅读 SyntaxNet 的代码。并下载 Parsey McParseface 句法分析模型。主要研发者Chris Alberti, David Weiss, Daniel Andor, Michael Collins 和 Slav Petrov 祝你成功。

数据狂人必备的10本全球畅销书

2016-05-13 丑灿 大数据技术

来自:化学数据联盟

对于一位数据科学的狂热粉丝而言,可供选择阅读的书籍内容很多,包括大数据、机器学习、数据科学以及数据挖掘等等。除了这些技术范围内的书籍之外,也有很多工具类和语言类的书籍,比如Hadoop、Spark、Python和R语言等。关于数据的书籍和专题时常更新,所以只有你掌握了最新的信息才可以让你掌握这个领域内最先进的技术和技能。幸运的是(或者也可以称之为不幸?)关于数据科学与技术领域的各种专题从来不会缺少响应的书籍,所以你大可放心随便选取。

和数据有关的数据有很多具体的类目,而且每种类目都有很多畅销书列表可供你参考。实际上我们最近为读者列举了很多书籍列表,比如关于数据挖掘、数据库与大数据、统计学、AI和机器学习以及神经网络。但是以上这些枚举的列表都是根据Amazon书籍畅销榜的比较狭隘的分类得出的推荐结论,而且没有这些书籍缺少编辑决定权或者没有考虑到内容是否可以免费获取以及是否有电子书的格式。

首先,让我们把一个问题弄清楚:本文的标题有些误导性。为数据狂人(或者专业人员)推荐的必备书籍列表中的内容比较泛泛,我们向读者推荐的这10种类别的书籍当中,每一种类别的书籍内容都是与付费资源和免费资源有关的畅销书籍。尽管我们的工作内容涉及到的数据通道数量有限,但是我们通常情况下会想主动去了解比现有数据通道更加庞大的数量,你的初衷可能是为了工作的实践操作也可能是出于兴趣的目的。

所以,一位Hadoop专业人士可能不会对深度学习进行更加专业水准的洞察,他们只不过是对某些专题感兴趣。这篇文章可以让读者巩固自己的兴趣,并为那些想拓宽个人知识层面的数据狂人提供具体的建议。

需要大家注意的是,这些数据类目所涉及的内容有所重叠,这种情况无法避免。通常情况下书籍内容所专注的领域决定了他属于哪个类目。

01.数据科学DISCOVERY

畅销付费书籍推荐:

Data Science for Business

《商业数据科学-关于数据挖掘和数据分析思维你需要知道的一切》

当你尝试学习新的领域的时候,最常见的难题就是找到一本内容深度正合适的书籍。读者要么因为内容过于简单或者内容过于说教的学术性质而对买到的书籍“始乱终弃”,尽管书籍内容具有权威性和综合性,但是最终还是被读者放置于书架之上与尘埃为伴。但是《商业数据科学》这本书却一针见血,恰到好处。

——来自Amazon用户m I的读后感


畅销免费书籍推荐:

The Art of Data Science

《数据科学的艺术之美》

这本书用通俗易懂的词汇向读者描述了分析数据的具体过程。本书的作者不仅在管理数据分析方面拥有丰富经验,并且还能够指导团队进行数据分析。这本书集成了他们所有关于数据分析经验的精华,并通过较强的可应用性向数据科学的专业人士和管理者介绍了他们的经验。

——来自官方网站的书评


02.大数据DISCOVERY

畅销付费书籍推荐:

《大数据:可扩展的实时数据系统的原则和最佳实践》

Big Data:Principles and Best Practices of Scalable Realtime Data Systems

我几乎很少能有幸遇见这样一本优质的书籍。这本书对于数据建模、数据分析、数据处理需求分析以及数据架构和储存实施问题(还同时稍带了传动的数据库概念的介绍)的重要性进行了详尽而周全的讨论。这本书向广大读者传递了新鲜的整体解决方案。

——来自Amazon用户Kirk D. Borne的读后感


畅销免费书籍:

《大数据即刻出发:2015版》

 Big Data Now: 2015 Edition

在O’Reilly发布一年一度的《大数据即刻出发》年度报告的四年时间内,大数据领域已经从呱呱坠地的婴儿成长为年轻气盛的青少年。数据已经成为一些行业的领军人,而在其他行里中数据已经成为创新的驱动力。那些使用数据极其分析来制定决策的公司正在突飞猛进的超越同行的竞争对手。

——来自官方网站的书评


03.Apache HadoopDISCOVERY

畅销付费书籍推荐:

《Hadoop:通用指南》

Hadoop: The Definitive Guide

我很欣赏的一点就是这本书对你所需要了解的Hadoop设计、执行以及日常运行以及与之相关的各种技术,不仅涵盖了高层次的概念并且对技术细节的解释也非常接地气。

——来自Amazon用户AI Gordon的读后感


畅销免费书籍推荐:

Hadoop Explained

Hadoop对于那些建造在数据基础上的世界而言是至关重要的一种技术工具。在这本书中你可以发现很多有用的指导性意见,你可以发现他处理大数据挑战的手段的发展和进步。

——来自官方网站的书评


04.Apache SparkDISCOVERY

畅销付费书籍推荐:

《学习Spark》

 Learning Spark

互联网上可以获取的信息非常棒,但是这本书把大部分这些信息整合到了一处。如果你想学着像一名Spark编程人员一样思考问题,而不是单纯的像程序员一样思考问题,那么从这本书开始,作为Spark用户的你,你的思维方式即将开始发生改变。

——来自Amazon用户BrianCastelli的读后感


畅销免费书籍推荐:

《掌握Apache Spark》

Mastering Apache Spark

这本书是我们收集关于使用Apache Spark的各种具体细节的最后一块终极瑰宝。

­——来自官方网站的书评


05.机器学习理论DISCOVERY

畅销付费书籍推荐:

《模式识别与机器学习》

Pattern Recognition and MachineLearning (Information Science and Statistics)

该书的作者为一名专家,因为它可以通过机器学习算法背后隐含的复杂数学体系向读者提供独一无二的见解和领悟。我本人已经从事神经元网络方面的工作很长时间了,并且发表过线性代数、概率和回归分析方面的论文,我发现这本书中的确可以为你找到更多的启发。

——来自Amazon用户Sidhant的读后感


畅销免费书籍推荐:

《统计学习基础》

Elements of Statistical Learning

好消息来了,这将是全世界你读到的一本最重要的书籍。这本书将每一件重要的内容绑定在一起。只在此书,别无它有。

——来自Amazon用户Enceladus Transit的读后感


06.实用机器学习技术DISCOVERY

畅销付费书籍推荐:

《Python机器学习技术》

Python MachineLearning

即使对于像我这样一个机器学习技术新手来说,这本书也相当了不起。在第一次读这本书的时候,我的第一感觉就是无论从广度还是从深度,这本书将理论和实践完整的融合到了一起。

——来自Amazon用户Brian M. Thomas的读后感


畅销免费书籍推荐:

《统计学习在R语言中的应用介绍》

An Introduction to StatisticalLearning with Applications in R

这本书介绍了统计学习的基本方法。这本书主要为非数学科学专业的本科生、研究生以及博士生准备。这本书还包含大量的R实验研究,并详细的解释如何执行各种方法。对于有实践需求的数据科学家而言,这本书的确很有价值。

——来自官网的书评


07.深度学习DISCOVERY

由于目前关于深度学习优质的付费书籍资源非常少,所以这里向大家推荐两本畅销的免费书籍:

畅销免费书籍推荐第一名:

《神经网络与深度学习》

Neural Networks and Deep Learning

这是一本在线免费书籍,这本书可以教会你:

  • 一个绚烂的受生物学启发得到的程序设计范例,可以让计算机从所观察到的数据进行相应内容的学习
  • 深度学习,神经网络中强大的学习技术

——来自官网的书评


畅销免费书籍推荐第二名:

《深度学习》

Deep Learning

这本由Ian Goodfellow,、Yoshua Bengio和Aaron Courville合著的书籍正在筹备阶段,有可能是未来最佳的关于深度学习的书籍。这本书的开发版每月都在更新,在最终出版的时候读者可以免费获取。


08.数据挖掘DISCOVERY

畅销付费书籍推荐:

《据挖掘:概念与技术,第三版(摩根考夫曼数据管理系统系列)》

Data Mining:Concepts and Techniques, Third Edition

数据挖掘是对这个领域的综合性概览,我认为这本书是数据挖掘专业毕业生的绝佳之选,或者也可以做为一本参考书来使用。该书以技术为焦点(比如如何分析数据,包括准备),而且这本书包括了该领域内涉及数据存储和预处理在内的所有主要专题。然而这本书真的是非常好的方法分类资源,在第二章你可以发现非常强大的聚合分析的方法。

——来自Amazon用户SusanKatz的读后感


畅销免费书籍这本书推荐:

《巨型数据库的挖掘》

Mining of Massive Datasets

这本书的设计是在没有正式先决条件的本科计算机科学水平基础上进行。为了满足读者的进一步学习,很多章节都从读者参考的方式进行补充。

——来自官网的书评


09.SQLDISCOVERY

畅销付费书籍推荐:

《SQL 第二版》

Learning SQL,Second Edition

如果你正在编写任何种类的数据库驱动代码并且你认为你不需要懂SQL,你需要读这本书。之后你会发现你需要懂得SQL并且这本书可以很好地辅导你。

——来自Amazon用户Jack D. Herrington的读后感


畅销免费书籍推荐:

《SQL的艰难学习之旅》

Learn SQL The Hard Way

这本书可以教会你80%你所需要使用的SQL语言,同时会将数据建模的理论混杂在其中进行讲解。如果你还在因为无法了解SQL而摸索如何建立网站。桌面系统或者移动应用的话,那么这本书就是为你准备的。这本对那些之前不懂数据库和编程,但是知道至少一种计算机编程语言的人有很大的帮助。

——来自官网的书评

10.数据科学统计学DISCOVERY

畅销付费书籍推荐:

《用白话文解释何为统计学,第三版》

Statistics inPlain English, Third Edition

作为一名数据分析师并且日常工作就是处理统计学数据,我很期待知道更多的算法和模型。尽管统计软件可以我们完成每件事,但是识别出软件咀嚼后得到的结果的确是这个工作最难以拿捏的部分。我主修生物技术专业并且对这些我生命中遇到的大部分的统计学像白痴一样。长话短说,我真的需要这本书帮助我理解更多的统计学概念。

——来自Amazon用户Shyam Goli的读后感


畅销免费书籍推荐:

《Think Stats:程序员需要的概率论统计学,第二版》

Think Stats:Probability and Statistics for Programmers, Second Edition

Think Stats强调了让你使用简单的技术进行数据和有趣问题答案的开发。这本书介绍了美国国家卫生研究院使用数据进行的案例的研究。

——来自官网的书评

一位数据分析师的职业规划

2016-05-12 大数据技术

来自网络

2012年就在网络上传,原作者不详

我小时候的理想是将来做一名数学家,可惜长大了发现自己天赋不够,理想渐

行渐远,于是开始考虑现实,开始做一些人生规划,我一直在思考将来从事何种职业,专注什么样的领域,重新定义着自己的职业理想。我现在的职业理想,比较简单,就是做一名数据分析师。

为什么要做数据分析师?

在通信、互联网、金融等这些行业每天产生巨大的数据量(长期更是积累了大量丰富的数据,比如客户交易数据等等),据说到2020年,全球每年产生的数据量达 到3500万亿GB;海量的历史数据是否有价值,是否可以利用为领导决策提供参考依据?随着软件工具、数据库技术、各种硬件设备的飞快发展,使得我们分析 海量数据成为可能。

而数据分析也越来越受到领导层的重视,借助报表告诉用户什么已经发生了,借助OLAP和可视化工具等分析工具 告诉用户为什么发生了,通过dashboard监控告诉用户现在在发生什么,通过预报告诉用户什么可能会发生。数据分析会从海量数据中提取、挖掘对业务发 展有价值的、潜在的知识,找出趋势,为决策层的提供有力依据,为产品或服务发展方向起到积极作用,有力推动企业内部的科学化、信息化管理。

我们举两个通过数据分析获得成功的例子:

(1) Facebook广告与微博、SNS等网络社区的用户相联系,通过先进的数据挖掘与分析技术,为广告商提供更为精准定位的服务,该精准广告模式收到广大广 告商的热捧,根据市场调研机构eMarketer的数据,Facebook年营收额超过20亿美元,成为美国最大的在线显示广告提供商。

(2) Hitwise发布会上,亚太区负责人John举例说明: 亚马逊30%的销售是来自其系统自动的产品推荐,通过客户分类,测试统计,行为建模,投放优化四步,运营客户的行为数据带来竞争优势。

此外,还有好多好多,数据分析,在营销、金融、互联网等方面应用是非常广泛的:比如在营销领域,有数据库营销,精准营销,RFM分析,客户分群,销量预测等 等;在金融上预测股价及其波动,套利模型等等;在互联网电子商务上面,百度的精准广告,淘宝的数据魔方等等。类似成功的案例会越来越多,以至于数据分析师 也越来越受到重视。

然而,现实却是另一种情况。我们来看一个来自微博上的信息:在美国目前面临14万~19万具有数据分析和管理 能力的专业人员,以及150万具有理解和决策能力(基于对海量数据的研究)的管理人员和分析人员的人才短缺。而在中国,受过专业训练并有经验的数据分析人 才,未来三年,分析能力人才供需缺口将逐渐放大,高级分析人才难寻。也就是说,数据分析的需求在不断增长,然而合格的为企业做分析决策的数据分析师却寥寥 无几。好多人想做数据分析却不知道如何入手,要么不懂得如何清洗数据,直接把数据拿来就用;要么乱套模型,分析的头头是道,其实完全不是那么回事。按俗话 说就是:见过猪跑,没吃过猪肉。

 我的职业规划:

对于数据分析,有一句话说的非 常好:spss/sql之类的软件、决策树、时间序列之类的方法,这些仅仅就都是个工具而已,最重要的是对业务的把握。没有正确的业务理解,再牛的理论, 再牛的工具,都是白搭。做一名合格的数据分析师,除了对数据需要有良好的敏感性之外,对相关业务的背景的深入了解,对客户或业务部门的需求的清晰认识。根 据实际的业务发展情况识别哪些数据可用,哪些不适用,而不是孤立地在“真空环境”下进行分析。

为此,我对自己的规划如下:

第一步:掌握基本的数据分析知识(比如统计,概率,数据挖掘基础理论,运筹学等),掌握基本的数据分析软件(比如,VBA,Matlab,Spss,Sql 等等),掌握基本的商业经济常识(比如宏微观经济学,营销理论,投资基础知识,战略与风险管理等等)。这些基础知识,在学校里尽量的学习,而且我来到了和 君商学院,这样我可以在商业分析、经济分析上面领悟到一些东西,增强我的数据分析能力。

第二步:参与各种实习。研一开始我当时虽然有课,不 过很幸运的找到一份一周只需去一两天的兼职,内容是为三星做竞争对手分析,当然分析框架是leader给定了,我只是做整合资料和往ppt里填充的内容的 工作,不过通过兼职,我接触到了咨询行业,也向正式员工学习了很多商业分析、思考逻辑之类的东西。之后去西门子,做和VBA的事情,虽然做的事情与数据分 析无关,不过在公司经常用VBA做一些自动化处理工作,为自己的数据分析工具打好了基础。再之后去了易车,在那里兼职了一个多月,参与了大众汽车销量数据 短期预测的项目,一个小项目下来,数据分析的方法流程掌握了不少,也了解了企业是如何用一些时间序列模型去参与预测的,如何选取某个拟合曲线作为预测值。 现在,我来到新的地方实习,也非常幸运的参加了一个央企的码头堆场优化系统设计,其实也算数据分析的一种吧,通过码头的数据实施调度,通过码头的数据进行 决策,最后写成一个可操作的自动化系统。而这个项目,最重要的就是业务流程的把握,我也参与项目最初的需求调研,和制定工作任务说明书SOW,体会颇多。

第三步:第一份工作,预计3-5年。我估计会选择咨询公司或者IT公司吧,主要是做数据分析这块比较强的公司,比如Fico,埃森哲,高沃,瑞尼 尔,IBM,AC等等。通过第一份工作去把自己的知识打得扎实些,学会在实际中应用所学,学会数据分析的流程方法,让自己成长起来。

第四步:去自己喜欢的一个行业,深入了解这个行业,并讲数据分析应用到这个行业里。比如我可以去电子商务做数据分析师。我觉得我选择电子商务,是因为未来必将 是互联网的时代,电子商务必将取代传统商务,最显著的现象就是传统零售商老大沃尔玛正在受到亚马逊的挑战。此外,电子商务比传统的零售商具有更好的数据收 集和管理能力,可以更好的跟踪用户、挖掘潜在用户、挖掘潜在商品。

第五步:未知。我暂时没有想法,不过我希望我是在一直的进步。

总结:数据分析师的能力和目标:

能力:

1、一定要懂点战略、才能结合商业;

2、一定要漂亮的presentation、才能buying;

3、一定要有global view、才能打单;

4 一定要懂业务、才能结合市场;

5、一定要专几种工具、才能干活;

6、一定要学好、才能有效率;

7、一定要有强悍理论基础、才能入门;

8 一定要努力、 才能赚钱;最重要的:

9 一定要务实、才有reputation;

目标:

1-做过多少个项目?

2-业务背景有哪些,是否跨行业?

3-做过多少种类型的模型?做了多少个模型?

4-基于模型做过多少次完整的marketing闭环?

以上四个问题,足以秒杀95%以上的忽悠和菜鸟!

我仅以此为努力之坐标,时刻提醒自己。

路在前方,漫漫前行。

机器学习常见面试题整理

By:kubiCode

Source: http://kubicode.me/2015/08/16/Machine%20Learning/Common-Interview/

有监督学习和无监督学习的区别

  • 有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。(LR,SVM,BP,RF,GBRT)
  • 无监督学习:对未标记的样本进行训练学习,比发现这些样本中的结构知识。(KMeans,DL)

正则化

正则化是针对过拟合而提出的,以为在求解模型最优的是一般优化最小的经验风险,现在在该经验风险上加入 模型复杂度这一项(正则化项是模型参数向量的范数),并使用一个rate比率来权衡模型复杂度与以往经验风险的权重,如果模型复杂度越高,结构化的经验风 险会越大,现在的目标就变为了结构经验风险的最优化,可以防止模型训练过度复杂,有效的降低过拟合的风险。

奥卡姆剃刀原理,能够很好的解释已知数据并且十分简单才是最好的模型。

过拟合

如果一味的去提高训练数据的预测能力,所选模型的复杂度往往会很高,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大。

产生的原因

  1. 因为参数太多,会导致我们的模型复杂度上升,容易过拟合
  2. 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征.

解决方法

  1. 交叉验证法
  2. 减少特征
  3. 正则化
  4. 权值衰减
  5. 验证数据

泛化能力

泛化能力是指模型对未知数据的预测能力

生成模型和判别模型

  1. 生成模型:由数据学习联合概率分布P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)。(朴素贝叶斯)
    生成模型可以还原联合概率分布p(X,Y),并且有较快的学习收敛速度,还可以用于隐变量的学习
  2. 判别模型:由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型,即判别模型。(k近邻、决策树)
    直接面对预测,往往准确率较高,直接对数据在各种程度上的抽象,所以可以简化模型

线性分类器与非线性分类器的区别以及优劣

如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是。
常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归
常见的非线性分类器:决策树、RF、GBDT、多层感知机

SVM两种都有(看线性核还是高斯核)

  • 线性分类器速度快、编程方便,但是可能拟合效果不会很好
  • 非线性分类器编程复杂,但是效果拟合能力强

特征比数据量还大时,选择什么样的分类器?

线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分

对于维度很高的特征,你是选择线性还是非线性分类器?

理由同上

对于维度极低的特征,你是选择线性还是非线性分类器?

非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分

ill-condition病态问题

训练完的模型测试样本稍作修改就会得到差别很大的结果,就是病态问题(这简直是不能用啊)

L1和L2正则的区别,如何选择L1和L2正则

他们都是可以防止过拟合,降低模型复杂度

  • L1是在loss function后面加上 模型参数的1范数(也就是|xi|)
  • L2是在loss function后面加上 模型参数的2范数(也就是sigma(xi^2)),注意L2范数的定义是sqrt(sigma(xi^2)),在正则项上没有添加sqrt根号是为了更加容易优化
  • L1 会产生稀疏的特征
  • L2 会产生更多地特征但是都会接近于0

L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。L1在特征选择时候非常有用,而L2就只是一种规则化而已。

特征向量的归一化方法

  1. 线性函数转换,表达式如下:y=(x-MinValue)/(MaxValue-MinValue)
  2. 对数函数转换,表达式如下:y=log10 (x)
  3. 反余切函数转换 ,表达式如下:y=arctan(x)*2/PI
  4. 减去均值,乘以方差:y=(x-means)/ variance

特征向量的异常值处理

  1. 用均值或者其他统计量代替

越小的参数说明模型越简单

过拟合的,拟合会经过曲面的每个点,也就是说在较小的区间里面可能会有较大的曲率,这里的导数就是很大,线性模型里面的权值就是导数,所以越小的参数说明模型越简单。

追加:这个其实可以看VC维相关的东西感觉更加合适

svm中rbf核函数与高斯和函数的比较

高斯核函数好像是RBF核的一种

KMeans初始类簇中心点的选取

选择批次距离尽可能远的K个点

首先随机选取一个点作为初始点,然后选择距离与该点最远的那个点作为中心点,再选择距离与前两个点最远的店作为第三个中心店,以此类推,直至选取大k个

选用层次聚类或者Canopy算法进行初始聚类

ROC、AUC

ROC和AUC通常是用来评价一个二值分类器的好坏

ROC曲线

曲线坐标上:

  • X轴是FPR(表示假阳率-预测结果为positive,但是实际结果为negitive,FP/(N))
  • Y轴式TPR(表示真阳率-预测结果为positive,而且的确真实结果也为positive的,TP/P)

那么平面的上点(X,Y):

  • (0,1)表示所有的positive的样本都预测出来了,分类效果最好
  • (0,0)表示预测的结果全部为negitive
  • (1,0)表示预测的错过全部分错了,分类效果最差
  • (1,1)表示预测的结果全部为positive

    针对落在x=y上点,表示是采用随机猜测出来的结果

ROC曲线建立
一般默认预测完成之后会有一个概率输出p,这个概率越高,表示它对positive的概率越大。
现在假设我们有一个 threshold,如果p>threshold,那么该预测结果为positive,否则为negitive,按照这个思路,我们多设置几个 threshold,那么我们就可以得到多组positive和negitive的结果了,也就是我们可以得到多组FPR和TPR值了
将这些(FPR,TPR)点投射到坐标上再用线连接起来就是ROC曲线了

当threshold取1和0时,分别得到的就是(0,0)和(1,1)这两个点。(threshold=1,预测的样本全部为负样本,threshold=0,预测的样本全部为正样本)

AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积不会大于1(一般情况下ROC会在x=y的上方,所以0.5<AUC<1).

AUC越大说明分类效果越好

为什么要使用ROC和AUC

因为当测试集中的正负样本发生变化时,ROC曲线能基本保持不变,但是precision和recall可能就会有较大的波动。
http://www.douban.com/note/284051363/?type=like

测试集和训练集的区别

训练集用于建立模型,测试集评估模型的预测等能力

优化Kmeans

使用kd树或者ball tree(这个树不懂)
将所有的观测实例构建成一颗kd树,之前每个聚类中心都是需要和每个观测点做依次距离计算,现在这些聚类中心根据kd树只需要计算附近的一个局部区域即可

数据挖掘和机器学习的区别

机器学习是数据挖掘的一个重要工具,但是数据挖掘不仅仅只有机器学习这一类方法,还有其他很多非机器学习的方法,比如图挖掘,频繁项挖掘等。感觉数据挖掘是从目的而言的,但是机器学习是从方法而言的。

备注

题目主要来源于网络,答案主要来源于网络或者《统计学习方法》,还有自己一小部分的总结,如果错误之处敬请指出
如果想要了解关于常见模型的东东可以看这篇机器学习常见算法个人总结(面试用)文章

《台大机器学习基石》Linear Regression

By Kubi Code

Source: http://kubicode.me/2015/08/19/Machine%20Learning/Linear-Regression/

Linear Regression

现在相对比于之前的Perceptron Learning Algorithm算法,假如我们现在时的问题不是解决是否发行用卡,而是该发多少额度的问题

也就是输出空间属于一个实数,那么就需要一个回归算法来解决该问题!

那么我们其实可以直接使用特征属性与权重的加权求和来表示需要发的信用额度即可(与PLA类似,但是没有激活函数:二值判断逆函数)

上图中表示的就是为线性回归(Linear Regression),其中wTx就是表示为全部的假设空间(hypothesis set)

如果当前的特征是一维的,那么这里的hypothesis set就表示一条线,(因为总体的特征向量里面还有一个常数值)

如果当前的特征是二维的,那么这里的hypothesis set就一个平面

当然特征更加多得话,最终hypothesis set表示一个超平面
其中图上红色的部分叫做误差(视频里面叫做余数),那么回归分析的目标就是将所有的误差降到最小越好
这里使用平方误差来衡量整体的误差

那么从机器学习的角度来说,这里的误差就可以看做(下面这个表达式就很熟悉了)

相应的

表示这个分类器在未来未训练数据集中产生的误差是多少
那么现在的线性回归的问题就是转为将Ein(w)优化到最小。

Ein(w)最小化

现将上面小节的中的Ein转为矩阵的运算

  1. 向量内积可交换,将wTx转为xTw
  2. 将连加转为向量形式的长度(应该是二范数)
  3. w单独提出来(相当于隔离出了一个特征属性向量的矩阵)
  4. 最终使用缩写来进行整理

到了这一步我们可以发现Ein(w)只与w有关,那么他们的关系图是

可以发现Ein(w)是连续可导,还有它是凸的
那么用Ein(w)w求偏导即可求导最优值(梯度为0的位置)

这样现在问题又转为了 求

首先将
现在对其求偏导

完了之后再将A,b替换回去

进一步将问题转换为
式子中XTXXTy都是已知的,唯一不知道的就是w,这样就变为了一个一次的方程式

  1. 假如有(XTX)-1反矩阵的存在,那么就可以直接得到解了,并且是唯一的
  2. 但是如果(XTX)-1反矩阵不存在,那么得到的解可能就不唯一了

所以这里的核心就是计算虚假的反矩阵(pseudo-inverse),听林老师说这个的计算很多工具都是由现成的^_^

刚刚求Ein(w)最小化的过程中看似直接用公式代替可到,但是其中的pseudo-inverse计算起来麻烦,最终在计算的时候还是需要迭代,然后会触发Ein(w)Eout(w)的变化,是一个深度隐含的学习过程(这种是叫做Analytic Solution)。

Learning happened

那么该如果保证Eout可以是小的呢?
我们先来看一下Ein的平均

其中nosie level表示样本中噪声的一个情况,d+1表示模型的自由度,N表示样本的容量
其中单独表示Ein(w)的话为

这样就形成了两项1-XX+y,也就是相当于将输入喝输出进行了一个分离,其中XX+叫做hat matrix
关于这个hat matrix,它的意义是这样纸的

  1. 红色区块表示向量X的一个扩散,而y^就是落在这个空间上
  2. 目标就是求y-y^的最小化,也就是图种的绿色那条线(y^)向下投影的线
  3. H就是表示这个空间上yy^的一个投影
  4. I-H就是表示误差部分y-y^

相应的会有trace(I-H)=N-(d+1)

好,现在再来看Ein的平均到底是什么意思

  1. 其中如果f(x)为目标函数,那么目标值y就相当于在f(x)上添加噪声
  2. 然后这个噪声通过I-H就可以转为y-y^

现在对噪声作评价的话,那么就可以得到
此时
这两个式子哲学上的意思是Ein的平均是可以看到的,所以当存在噪声的时候看到的线会偏向于噪声方向,而在Eout的平均是未知的,比最好的那个线还要向右边偏一点(没听懂-_-)

他们俩会形成如下的关系线

它描述的是当前的样本量与平均的EinEout的关系,随着样本量N的增长,最终会趋向于nosie level

那么就可以得到

说明N足够大,然后他的noise level够小时,说明了Learning happened

总结

  1. 线性回归最终求出的是一个加权求和的值.
  • 线性回归的Ein的采用的是最小平方误差.
  • 在计算Ein的最小化时,可以将问题转为矩阵之后就逆矩阵相关即可.
  • 通过Ein平均的计算,说明了Learning happened.
  • 其实线性回归去坐分类问题也是可以的^_^,第9课第4个小视频.

参考

  • 《台湾国立大学-机器学习基石》第九讲

配图均来自《台湾国立大学-机器学习基石》

机器学习常见算法个人总结

By:kubiCode

Source: http://kubicode.me/2015/08/16/Machine%20Learning/Algorithm-Summary-for-Interview/

朴素贝叶斯

参考[1]

事件AB同时发生的概率为在A发生的情况下发生B或者在B发生的情况下发生A

[Math Processing Error]
所以有:

[Math Processing Error]

对于给出的待分类项,求解在此项出现的条件下各个目标类别出现的概率,哪个最大,就认为此待分类项属于哪个类别

工作原理

  1. 假设现在有样本[Math Processing Error]

这个待分类项(并认为[Math Processing Error]

  • 里面的特征独立)
  • 再假设现在有分类目标[Math Processing Error]
  • 那么[Math Processing Error]
  • 就是最终的分类类别
  • [Math Processing Error]
  • 因为[Math Processing Error]

对于每个分类目标来说都一样,所以就是求[Math Processing Error]

  • [Math Processing Error]
  • 而具体的[Math Processing Error]

[Math Processing Error]都是能从训练样本中统计出来
[Math Processing Error]表示该类别下该特征出现的概率
[Math Processing Error]

 

  1. 表示全部类别中这个这个类别出现的概率
  2. 好的,就是这么工作的^_^

工作流程

  1. 准备阶段
    确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本。
  2. 训练阶段
    计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计
  3. 应用阶段
    使用分类器进行分类,输入是分类器和待分类样本,输出是样本属于的分类类别

属性特征

  1. 特征为离散值时直接统计即可(表示统计概率)
  2. 特征为连续值的时候假定特征符合高斯分布:[Math Processing Error]

那么[Math Processing Error]

Laplace校准(拉普拉斯校验)

当某个类别下某个特征划分没有出现时,会有[Math Processing Error]

,就是导致分类器质量降低,所以此时引入Laplace校验,就是对没类别下所有划分的计数加1。

遇到特征之间不独立问题

参考改进的贝叶斯网络,使用DAG来进行概率图的描述

优缺点

朴素贝叶斯的优点:

  1. 对小规模的数据表现很好,适合多分类任务,适合增量式训练。
    缺点:
  2. 对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。

逻辑回归和线性回归

参考[2,3,4]

LR回归是一个线性的二分类模型,主要是计算在某个样本特征下事件发生的概率,比如根据用户的浏览购买情况作为特征来计算它是否会购买这个商品,抑或是它是否会点击这个商品。然后LR的最终值是根据一个线性和函数再通过一个sigmod函数来求得,这个线性和函数权重与特征值的累加以及加上偏置求出来的,所以在训练LR时也就是在训练线性和函数的各个权重值w

[Math Processing Error]

关于这个权重值w一般使用最大似然法来估计,假设现在有样本[Math Processing Error]

,其中[Math Processing Error]表示样本的特征,[Math Processing Error]表示样本的分类真实值,[Math Processing Error]的概率是[Math Processing Error],则[Math Processing Error]的概率是[Math Processing Error],那么观测概率为:

[Math Processing Error]
则最大似然函数为:

[Math Processing Error]

对这个似然函数取对数之后就会得到的表达式

[Math Processing Error]
估计这个[Math Processing Error]的极大值就可以得到[Math Processing Error]

的估计值。

实际操作中一般会加个负号 改为求最小

所以求解问题就变成了这个最大似然函数的最优化问题,这里通常会采样随机梯度下降法和拟牛顿迭代法来进行优化

梯度下降法

LR的损失函数为:

[Math Processing Error]
这样就变成了求[Math Processing Error]

其更新w的过程为

[Math Processing Error]
其中[Math Processing Error],直到[Math Processing Error]

不能再小时停止

梯度下降法的最大问题就是会陷入局部最优,并且每次在对当前样本计算cost的时候都需要去遍历全部样本才能得到cost值,这样计算速度就会慢很多(虽然在计算的时候可以转为矩阵乘法去更新整个w值)
所以现在好多框架(mahout)中一般使用随机梯度下降法,它在计算cost的时候只计算当前的代价,最终cost是在全部样本迭代一遍之求和得出,还有他在更新当前的参数w的时候并不是依次遍历样本,而是从所有的样本中随机选择一条进行计算,它方法收敛速度快(一般是使用最大迭代次数),并且还可以避免局部最优,并且还很容易并行(使用参数服务器的方式进行并行)

[Math Processing Error]

这里SGD可以改进的地方就是使用动态的步长

[Math Processing Error]

其他优化方法

  • 拟牛顿法(记得是需要使用Hessian矩阵和cholesky分解)
  • BFGS
  • L-BFGS

优缺点:无需选择学习率α,更快,但是更复杂

关于LR的过拟合问题:

如果我们有很多的特性,在训练集上拟合得很好,但是在预测集上却达不到这种效果

  1. 减少feature个数(人工定义留多少个feature、算法选取这些feature)
  2. 正则化(为了方便求解,L2使用较多)
    添加正则化之后的损失函数为: [Math Processing Error]

同时w的更新变为[Math Processing Error]
注意:这里的[Math Processing Error]

  1. 不受正则化影响

关于LR的多分类:softmax

假设离散型随机变量Y的取值集合是{1,2,..,k},则多分类的LR为

[Math Processing Error]

这里会输出当前样本下属于哪一类的概率,并且满足全部概率加起来=1

关于softmax和k个LR的选择

如果类别之间是否互斥(比如音乐只能属于古典音乐、乡村音乐、摇滚月的一种)就用softmax
否则类别之前有联系(比如一首歌曲可能有影视原声,也可能包含人声,或者是舞曲),这个时候使用k个LR更为合适

优缺点:
Logistic回归优点:

  1. 实现简单;
  2. 分类时计算量非常小,速度很快,存储资源低;

缺点:

  1. 容易欠拟合,一般准确度不太高
  2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;

ps 另外LR还可以参考这篇以及多分类可以看这篇

KNN算法

给一个训练数据集和一个新的实例,在训练数据集中找出与这个新实例最近的k个训练实例,然后统计最近的k个训练实例中所属类别计数最多的那个类,就是新实例的类

三要素:

  1. k值的选择
  2. 距离的度量(常见的距离度量有欧式距离,马氏距离等)
  3. 分类决策规则 (多数表决规则)

k值的选择

  1. k值越小表明模型越复杂,更加容易过拟合
  2. 但是k值越大,模型越简单,如果k=N的时候就表明无论什么点都是训练集中类别最多的那个类

所以一般k会取一个较小的值,然后用过交叉验证来确定
这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的k

KNN的回归

在找到最近的k个实例之后,可以计算这k个实例的平均值作为预测值。或者还可以给这k个实例添加一个权重再求平均值,这个权重与度量距离成反比(越近权重越大)。

优缺点:

KNN算法的优点:

  1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;
  2. 可用于非线性分类;
  3. 训练时间复杂度为O(n);
  4. 准确度高,对数据没有假设,对outlier不敏感;

缺点:

  1. 计算量大;
  2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
  3. 需要大量的内存;

KD树

KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了)

构造KD树

在k维的空间上循环找子区域的中位数进行划分的过程。
假设现在有K维空间的数据集[Math Processing Error]

,[Math Processing Error]

  1. 首先构造根节点,以坐标[Math Processing Error]

的中位数b为切分点,将根结点对应的矩形局域划分为两个区域,区域1中[Math Processing Error],区域2中[Math Processing Error]

  • 构造叶子节点,分别以上面两个区域中[Math Processing Error]
  • 的中位数作为切分点,再次将他们两两划分,作为深度1的叶子节点,(如果a2=中位数,则a2的实例落在切分面)
  • 不断重复2的操作,深度为j的叶子节点划分的时候,索取的[Math Processing Error]

[Math Processing Error]

 

  1. ,直到两个子区域没有实例时停止

KD树的搜索

  1. 首先从根节点开始递归往下找到包含x的叶子节点,每一层都是找对应的xi
  2. 将这个叶子节点认为是当前的“近似最近点”
  3. 递归向上回退,如果以x圆心,以“近似最近点”为半径的球与根节点的另一半子区域边界相交,则说明另一半子区域中存在与x更近的点,则进入另一个子区域中查找该点并且更新”近似最近点“
  4. 重复3的步骤,直到另一子区域与球体不相交或者退回根节点
  5. 最后更新的”近似最近点“与x真正的最近点

KD树进行KNN查找

通过KD树的搜索找到与搜索目标最近的点,这样KNN的搜索就可以被限制在空间的局部区域上了,可以大大增加效率。

KD树搜索的复杂度

当实例随机分布的时候,搜索的复杂度为log(N),N为实例的个数,KD树更加适用于实例数量远大于空间维度的KNN搜索,如果实例的空间维度与实例个数差不多时,它的效率基于等于线性扫描。

后来自己有实现过KD树,可以看KNN算法中KD树的应用

SVM、SMO

对于样本点[Math Processing Error]

以及svm的超平面:[Math Processing Error]

  • 函数间隔:[Math Processing Error]

 

  • 几何间隔:[Math Processing Error]

,其中[Math Processing Error][Math Processing Error]

 

  • 的L2范数,几何间隔不会因为参数比例的改变而改变

svm的基本想法就是求解能正确划分训练样本并且其几何间隔最大化的超平面。

线性SVM问题

先来看svm的问题:

[Math Processing Error]

那么假设[Math Processing Error]

则将问题转为:

[Math Processing Error]

由于[Math Processing Error]

的成比例增减不会影响实际间距,所以这里的取[Math Processing Error],又因为[Math Processing Error]
所以最终的问题就变为了

[Math Processing Error]

这样就变成了一个凸的二次规划化,可以将其转换为拉格朗日函数,然后使用对偶算法来求解

对偶求解

引进拉格朗日乘子[Math Processing Error]

,定义拉格朗日函数:

[Math Processing Error]

根据对偶性质 原始问题就是求对偶问题的极大极小

[Math Processing Error]
先求L对[Math Processing Error]的极小,再求对[Math Processing Error]的极大。
[Math Processing Error],也就是相当于对[Math Processing Error]求偏导并且另其等于0

[Math Processing Error]
代入后可得

[Math Processing Error]
[Math Processing Error][Math Processing Error]的极大,即是对偶问题:

[Math Processing Error]
将求最大转为求最小,得到等价的式子为:

[Math Processing Error]

假如求解出来的[Math Processing Error]

[Math Processing Error]
则得到最优的[Math Processing Error]分别为

[Math Processing Error]
所以,最终的决策分类面为

[Math Processing Error]
也就是说,分类决策函数只依赖于输入[Math Processing Error]

与训练样本的输入的内积

ps:上面介绍的是SVM的硬间距最大化,还有一种是软间距最大化,引用了松弛变量[Math Processing Error]

,则次svm问题变为:

[Math Processing Error]

其余解决是与硬间距的一致~

还有:与分离超平面最近的样本点称为支持向量

损失函数

损失函数为(优化目标):

[Math Processing Error]
其中[Math Processing Error]称为折页损失函数,因为:

[Math Processing Error]

为什么要引入对偶算法

  1. 对偶问题往往更加容易求解(结合拉格朗日和kkt条件)
  2. 可以很自然的引用核函数(拉格朗日表达式里面有内积,而核函数也是通过内积进行映射的)

核函数

将输入特征x(线性不可分)映射到高维特征R空间,可以在R空间上让SVM进行线性可以变,这就是核函数的作用

  • 多项式核函数:[Math Processing Error]

 

  • 高斯核函数:[Math Processing Error]

 

  • 字符串核函数:貌似用于字符串处理等

SVM优缺点

优点:

  1. 使用核函数可以向高维空间进行映射
  2. 使用核函数可以解决非线性的分类
  3. 分类思想很简单,就是将样本与决策面的间隔最大化
  4. 分类效果较好

缺点:

  1. 对大规模数据训练比较困难
  2. 无法直接支持多分类,但是可以使用间接的方法来做

SMO

SMO是用于快速求解SVM的
它选择凸二次规划的两个变量,其他的变量保持不变,然后根据这两个变量构建一个二次规划问题,这个二次规划关于这两个变量解会更加的接近原始二次规划的解,通过这样的子问题划分可以大大增加整个算法的计算速度,关于这两个变量:

  1. 其中一个是严重违反KKT条件的一个变量
  2. 另一个变量是根据自由约束确定,好像是求剩余变量的最大化来确定的。

SVM多分类问题

  1. 直接法
    直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类(计算复杂度很高,实现起来较为困难)
  2. 间接法
    1. 一对多
      其中某个类为一类,其余n-1个类为另一个类,比如A,B,C,D四个类,第一次A为一个类,{B,C,D}为一个类训练一个分类器,第二次B为一个类,{A,C,D}为另一个类,按这方式共需要训练4个分类器,最后在测试的时候将测试样本经过这4个分类器[Math Processing Error]

,[Math Processing Error],[Math Processing Error][Math Processing Error]

    1. ,取其最大值为分类器(这种方式由于是1对M分类,会存在偏置,很不实用)
    2. 一对一(libsvm实现的方式)
      任意两个类都训练一个分类器,那么n个类就需要n*(n-1)/2个svm分类器。
      还是以 A,B,C,D为例,那么需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}为目标共6个分类器,然后在预测的将测试样本通过 这6个分类器之后进行投票选择最终结果。(这种方法虽好,但是需要n*(n-1)/2个分类器代价太大,不过有好像使用循环图来进行改进)

决策树

决策树是一颗依托决策而建立起来的树。

ID3

  1. 首先是针对当前的集合,计算每个特征的信息增益
  2. 然后选择信息增益最大的特征作为当前节点的决策决策特征
  3. 根据特征不同的类别划分到不同的子节点(比如年龄特征有青年,中年,老年,则划分到3颗子树)
  4. 然后继续对子节点进行递归,直到所有特征都被划分

[Math Processing Error]一个属性中某个类别的熵 [Math Processing Error], [Math Processing Error]表示[Math Processing Error]情况下发生[Math Processing Error]

的概率,也即是统计概率。

[Math Processing Error]

整个属性的熵,为各个类别的比例与各自熵的加权求和。

[Math Processing Error]

增益表示分类目标的熵减去当前属性的熵,增益越大,分类能力越强
(这里前者叫做经验熵,表示数据集分类C的不确定性,后者就是经验条件熵,表示在给定A的条件下对数据集分类C的不确定性,两者相减叫做互信息,决策树的增益等价于互信息)。
比如说当前属性是是否拥有房产,分类是是否能偿还债务
现在:

  • 有用房产为7个,4个能偿还债务,3个无法偿还债务
  • 然后无房产为3个,其中1个能偿还债务,2个无法偿还债务

然后
有房子的熵:[Math Processing Error]

无房子的熵:[Math Processing Error]
分类的熵:[Math Processing Error]
最终的增益=[Math Processing Error]

最大越好

关于损失函数
设树的叶子节点个数为[Math Processing Error]

[Math Processing Error]为其中一个叶子节点,该叶子节点有[Math Processing Error]个样本,其中[Math Processing Error]类的样本有[Math Processing Error]个,[Math Processing Error]为叶子节点上的经验熵,则损失函数定义为

[Math Processing Error]
其中

[Math Processing Error]
代入可以得到

[Math Processing Error]

[Math Processing Error]

为正则化项,[Math Processing Error]

是用于调节比率
决策树的生成只考虑了信息增益

C4.5

它是ID3的一个改进算法,使用信息增益率来进行属性的选择

[Math Processing Error]

优缺点:
准确率高,但是子构造树的过程中需要进行多次的扫描和排序,所以它的运算效率较低

Cart

分类回归树(Classification And Regression Tree)是一个决策二叉树,在通过递归的方式建立,每个节点在分裂的时候都是希望通过最好的方式将剩余的样本划分成两类,这里的分类指标:

  1. 分类树:基尼指数最小化(gini_index)
  2. 回归树:平方误差最小化

分类树:

  1. 首先是根据当前特征计算他们的基尼增益
  2. 选择基尼增益最小的特征作为划分特征
  3. 从该特征中查找基尼指数最小的分类类别作为最优划分点
  4. 将当前样本划分成两类,一类是划分特征的类别等于最优划分点,另一类就是不等于
  5. 针对这两类递归进行上述的划分工作,直达所有叶子指向同一样本目标或者叶子个数小于一定的阈值

gini用来度量分布不均匀性(或者说不纯),总体的类别越杂乱,GINI指数就越大(跟熵的概念很相似)

[Math Processing Error] [Math Processing Error]当前数据集中第i类样本的比例
gini越小,表示样本分布越均匀(0的时候就表示只有一类了),越大越不均匀
基尼增益

[Math Processing Error] 表示当前属性的一个混乱 [Math Processing Error]

表示当前类别占所有类别的概率
最终Cart选择GiniGain最小的特征作为划分特征

以ID3中的贷款的那棵树为样例:
基尼指数有房产:[Math Processing Error]

基尼指数无房产:[Math Processing Error]
基尼增益为:[Math Processing Error]

回归树:

回归树是以平方误差最小化的准则划分为两块区域

  1. 遍历特征计算最优的划分点s,
    使其最小化的平方误差是:[Math Processing Error]

计算根据s划分到左侧和右侧子树的目标值与预测值之差的平方和最小,这里的预测值是两个子树上输入xi样本对应[Math Processing Error]

  • 的均值
  • 找到最小的划分特征j以及其最优的划分点s,根据特征j以及划分点s将现有的样本划分为两个区域,一个是在特征j上小于等于s,另一个在在特征j上大于s

    [Math Processing Error]

 

  1. 进入两个子区域按上述方法继续划分,直到到达停止条件

这里面的最小化我记得可以使用最小二乘法来求

关于剪枝:用独立的验证数据集对训练集生长的树进行剪枝(事后剪枝)。

停止条件

  1. 直到每个叶子节点都只有一种类型的记录时停止,(这种方式很容易过拟合)
  2. 另一种时当叶子节点的记录树小于一定的阈值或者节点的信息增益小于一定的阈值时停止

关于特征与目标值

  1. 特征离散 目标值离散:可以使用ID3,cart
  2. 特征连续 目标值离散:将连续的特征离散化 可以使用ID3,cart
  3. 特征离散 目标值连续

决策树的分类与回归

  • 分类树
    输出叶子节点中所属类别最多的那一类
  • 回归树
    输出叶子节点中各个样本值的平均值

理想的决策树

  1. 叶子节点数尽量少
  2. 叶子节点的深度尽量小(太深可能会过拟合)

解决决策树的过拟合

  1. 剪枝
    1. 前置剪枝:在分裂节点的时候设计比较苛刻的条件,如不满足则直接停止分裂(这样干决策树无法到最优,也无法得到比较好的效果)
    2. 后置剪枝:在树建立完之后,用单个节点代替子树,节点的分类采用子树中主要的分类(这种方法比较浪费前面的建立过程)
  2. 交叉验证
  3. 随机森林

优缺点

优点:

  1. 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;
    缺点:
  2. 单颗决策树分类能力弱,并且对连续值变量难以处理;
  3. 容易过拟合(后续出现了随机森林,减小了过拟合现象);

随机森林RF

随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出(也就是投票的思想)

学习过程

  1. 现在有N个训练样本,每个样本的特征为M个,需要建K颗树
  2. 从N个训练样本中有放回的取N个样本作为一组训练集(其余未取到的样本作为预测分类,评估其误差)
  3. 从M个特征中取m个特征左右子集特征(m<<M)
  4. 对采样的数据使用完全分裂的方式来建立决策树,这样的决策树每个节点要么无法分裂,要么所有的样本都指向同一个分类
  5. 重复2的过程K次,即可建立森林

预测过程

  1. 将预测样本输入到K颗树分别进行预测
  2. 如果是分类问题,直接使用投票的方式选择分类频次最高的类别
  3. 如果是回归问题,使用分类之后的均值作为结果

参数问题

  1. 这里的一般取m=sqrt(M)
  2. 关于树的个数K,一般都需要成百上千,但是也有具体的样本有关(比如特征数量)
  3. 树的最大深度,(太深可能可能导致过拟合??)
  4. 节点上的最小样本数、最小信息增益

泛化误差估计

使用oob(out-of-bag)进行泛化误差的估计,将各个树的未采样样本作为预测样本(大约有36.8%),使用已经建立好的森林对各个预测样本进行预测,预测完之后最后统计误分得个数占总预测样本的比率作为RF的oob误分率。

学习算法

  1. ID3算法:处理离散值的量
  2. C45算法:处理连续值的量
  3. Cart算法:离散和连续 两者都合适?

关于CART

Cart可以通过特征的选择迭代建立一颗分类树,使得每次的分类平面能最好的将剩余数据分为两类

[Math Processing Error]

,表示每个类别出现的概率和与1的差值,
分类问题:[Math Processing Error]
回归问题:[Math Processing Error]

查找最佳特征f已经最佳属性阈值th 小于th的在左边,大于th的在右边子树

优缺点

  1. 能够处理大量特征的分类,并且还不用做特征选择
  2. 在训练完成之后能给出哪些feature的比较重要
  3. 训练速度很快
  4. 很容易并行
  5. 实现相对来说较为简单

GBDT

GBDT的精髓在于训练的时候都是以上一颗树的残差为目标,这个残差就是上一个树的预测值与真实值的差值。

比如,当前样本年龄是18岁,那么第一颗会去按18岁来训练,但是训练完之后预测的年龄为12岁,差值为6,
所以第二颗树的会以6岁来进行训练,假如训练完之后预测出来的结果为6,那么两棵树累加起来就是真实年龄了,
但是假如第二颗树预测出来的结果是5,那么剩余的残差1就会交给第三个树去训练。

Boosting的好处就是每一步的参加就是变相了增加了分错instance的权重,而对已经对的instance趋向于0,这样后面的树就可以更加关注错分的instance的训练了

Shrinkage

Shrinkage认为,每次走一小步逐步逼近的结果要比每次迈一大步逼近结果更加容易避免过拟合。

[Math Processing Error]

就像我们做互联网,总是先解决60%用户的需求凑合着,再解决35%用户的需求,最后才关注那5%人的需求,这样就能逐渐把产品做好.

调参

  1. 树的个数 100~10000
  2. 叶子的深度 3~8
  3. 学习速率 0.01~1
  4. 叶子上最大节点树 20
  5. 训练采样比例 0.5~1
  6. 训练特征采样比例 sqrt(num)

优缺点:

优点:

  1. 精度高
  2. 能处理非线性数据
  3. 能处理多特征类型
  4. 适合低维稠密数据
    缺点:
  5. 并行麻烦(因为上下两颗树有联系)
  6. 多分类的时候 复杂度很大

BP

最小二乘法

最小二乘法是一种数学的优化技术,通过求最小化平方误差来寻找最佳的函数匹配
假设现在有二维的观测数据[Math Processing Error]

,求[Math Processing Error]

的拟合。

现设[Math Processing Error]

如果有[Math Processing Error]能得到[Math Processing Error]最小,则该线比较理想
所以先变为求[Math Processing Error] ,这个与[Math Processing Error]等价
[Math Processing Error]
那么现设[Math Processing Error]

求其最小即可

上述就是最小二乘原则,估计[Math Processing Error]

的方法称为最小二乘法

先求[Math Processing Error]

[Math Processing Error]的偏导:

[Math Processing Error]

[Math Processing Error]
现设:

[Math Processing Error]
则代入上述偏导:

[Math Processing Error]
求该行列式:

[Math Processing Error]

所以有唯一解

最后记:

[Math Processing Error]

[Math Processing Error]

百度文库-最小二乘法

EM

EM用于隐含变量的概率模型的极大似然估计,它一般分为两步:第一步求期望(E),第二步求极大(M),
如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。
但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。

应用到的地方:混合高斯模型、混合朴素贝叶斯模型、因子分析模型

Bagging

  1. 从N样本中有放回的采样N个样本
  2. 对这N个样本在全属性上建立分类器(CART,SVM)
  3. 重复上面的步骤,建立m个分类器
  4. 预测的时候使用投票的方法得到结果

Boosting

boosting在训练的时候会给样本加一个权重,然后使loss function尽量去考虑那些分错类的样本(比如给分错类的样本的权重值加大)

凸优化

在机器学习中往往是最终要求解某个函数的最优值,但是一般情况下,任意一个函数的最优值求解比较困难,但是对于凸函数来说就可以有效的求解出全局最优值。

凸集

一个集合C是,当前仅当任意x,y属于C且[Math Processing Error]

,都有[Math Processing Error]

属于C
用通俗的话来说C集合线段上的任意两点也在C集合中

凸函数

一个函数f其定义域(D(f))是凸集,并且对任意x,y属于D(f)和[Math Processing Error]

都有

[Math Processing Error]

用通俗的话来说就是曲线上任意两点的割线都在曲线的上方

常见的凸函数有:

  • 指数函数[Math Processing Error]

 

  • 负对数函数[Math Processing Error]

 

  • 开口向上的二次函数等

凸函数的判定:

  1. 如果f是一阶可导,对于任意数据域内的x,y满足[Math Processing Error]
  1. 如果f是二阶可导,

凸优化应用举例

  • SVM:其中由[Math Processing Error]

转向[Math Processing Error]

  • 最小二乘法?
  • LR的损失函数[Math Processing Error]

 

参考

[1]. http://www.cnblogs.com/leoo2sk/archive/2010/09/17/naive-bayesian-classifier.html
[2]. http://www.cnblogs.com/biyeymyhjob/archive/2012/07/18/2595410.html
[3]. http://blog.csdn.net/abcjennifer/article/details/7716281
[4]. http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
[5]. 《统计学习方法》.李航

备注

资料主要来源于网络或者《统计学习方法》,还有自己一小部分的总结,如果错误之处敬请指出


本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言

程序员必读的书,StackOverflow 创始人推荐

伯乐在线/艾凌风

原载: http://blog.jobbole.com/100450/

Stack Overflow 创始人 Jeff Atwood 推荐给程序员的书。


本文最近一次更新是2015年3月份。 为什么我很少更新我的读书清单呢?因为虽然在这 10 年里,计算机一直在迅猛发展,但人始终却没有变。 为了开发出更好的软件,你需要理解人是如何工作的,这也是我推荐的这些书所关注的领域。

代码大全2

Steve McConnell所著的《代码大全2》 就像是为软件开发者所编写的《烹饪的乐趣》。能够去阅读这本书,说明你很享受自己的工作,并且在认真地对待自己的工作。同时,你还想要不断的进步。在《代 码大全》中Steve写到,普通程序员每年阅读的技术书籍不到一本。仅仅是阅读这本书的行为,就可能已经把你和你90%的程序员同事们区别开来了。

我非常喜欢这本书,以至于本站(coding horror)的名字也源于此书。书中列举的编程反例都被打上了”Coding Horror”的标签。没有什么比Coding Horror更有意思的了,直到你自己遇上一次。突然间一切都不那么有趣了。帮自己一个忙,把这本书作为你要研读的第一本书,并把它作为你推荐给同事的第一本书。

人月神话

这本书可能是我们这领域唯一的一本经典了。如果你还没读过,那就太不对了。

我敢说任何一个拿起这本书的程序员都没有发现关于那个早就不使用操作系统的故事以及它的开发团队之间惊人的相关性。这本二十五年前出版的老书大胆的阐明了一个观点:计算机也许会变,但人永远不会。

花时间去阅读这本经典书籍一定比你去阅读当今哪些几千页的大部头书籍更加有意义。

点石成金 : 访客至上的网页设计秘笈

在关于可用性的书籍中,这是我读过的最好的一本书。书名提到了“网页的可用性”,但是请不要被这一虚假的特指所迷惑。Steve Krug在书中提到了可用性这一概念所包含的全部重要内容,而且讲的很好,书也很有意思。如果你只想读一本关于可用性的书,那么读这本就可以了。这本书囊括了很多有用的信息,并且以简练的、平易近人的方式将这些信息呈现给你。这本书对于很多人都是适用的:技术人员、非技术人员、用户、开发者、经理等凡是你能说出名字的任何人。

呃。。。好吧。从来没有开过这样的会议。顺便提一下,解决这个问题的办法是进行一次快速的可用性测试。请想象这样的场景:基于实际数据来做决定而不是基于一场为了通过说服所有持有反对意见的人的辩论。真是革命性的转变啊!

快速软件开发

这本书的全称是:《快速软件开发:掌控软件开发进度》,这个标题不仅冗长还有些可笑,更不幸的是它用词不当。

快速软件开发》并不是一本关于快速开发的书。它讲述的是软件开发失败这一现实问题。大多数的软件开发项目都会失败:有时是没能按期交付,有时是开发出了不合格的产品,甚至有的时候都没有能够完成开发。这并不是什么论点,而是一个事实。一个令人不快的事实是:你的团队要足够的好,才能避免失败,更别说取得成功了。尽管这一切听起来可能会令人沮丧——好吧,这确实令人沮丧——但你仍然会想要去读一读这本书。

为什么呢?因为你曾经犯过的错误,或者其他人犯过的错误,如果能够避免再犯,就已经成功了一半*了。这本书传达了一个真谛:犯错是有益的——只要这些错误是一些未曾犯过的错误。如果你犯了一些经典的老错误,那么你在没有开始前就已经失败了。同时,你可能并没有意识到,你现在就在犯着类似的错误。

对我们这一行来讲,唯一不变的就是变化。所以拥抱变化和采取不同的“快速”开发技术是很自然的一件事。但是这句话反过来说就不对了。我们不能认为自 1970年以来,所有的旧式软件开发课程同今天的技术相比已经是废弃的或是没用的了。老生常谈的一件事是:计算机改变了很多;人却没有。在你准备开始前, 至少对于哪些可行哪些不可行有个认识。用 McConnell 的话说就是:“粉刷之前请先阅读油漆桶上的说明文字。” 诚然,这听上去已经足够直白了,但是直到你读了这本书,你才意识到,我们很少会真正去这么做。

  • 根据书的内容,严格来讲,有四分之一的内容。但是我觉得要比这多得多。

人件

如果你曾经看到过一个全明星球队,因为教练水平不高而战绩不佳,那你肯定会喜欢这本书。如果团队成员不能相互沟通或是认同一件事,那么你的团队中不 论有多少“编程之星”都没用。如果一个开发者经常被一些琐事打断,即使他是个天才,也不能够高效的工作。开发者并不清楚他们自己的社交技能,但是,讽刺的 是:这可能是你项目成功的关键因素。如果你希望成为一个真正的“团队领袖”,而不是徒有其名,你需要看看这本书。

尽管《人件》中有很多不错的、完全正确的观点,但是书中描绘的这种雇员管理对于大多数公司来讲纯粹是幻想。但是至少你可以在你的工作环境,或是你的团队出现问题的时候有所察觉——最重要的是,你可以知道怎么做。

设计心理学

软件开发有时候是一件极度令人沮丧的事情,因为很多事情都会做错。我们做的很多事情都是防御性的:尝试在情况变坏之前做出预测。这令人十分伤神,并 且最终可能会被证明是错的。我经常根非技术人员这样去解释这个问题:就好像去造一块有上千个运动部件的手表,其中每个部件都会动不动就随机坏掉。棒极了!

软件开发是很困难的,这点没错,但是做一个门也很困难。设计的微妙之处存在于我们接触到的每个事物,不论是最新的 SQL 引擎还是一双普通的鞋。这本书会让你对“恶魔藏在细节里”这句话产生新的认识。如果设计一个门并不是我们想象的那样是一件很简单的事的话,也许是时候因为 意识到我们也无法设计出完美的软件而给自己放个假了。

About Face:交互设计精髓

Alan Cooper 是 Visual Basic语言之父,可用性领域的教父级人物。我拥有这本书的多个版本(现在是第四版),这本书是少数越修订越好的书,越来越多的合作者向本书加入了不同的观点。

《About Face》一书中包含了关于移动应用和 web 应用的通用实用指导。 以老掉牙的 Windows 95 人机界面作为例子来进行阐释,将该系统已经改进的地方(在进行对话框选择前使用视觉样例进行展示)和还没有改进的部分(使用愚蠢的模态框来停止正在运行的 进程)进行对比是很有趣的一件事。

这是一本非常有用的书;我在我自己的项目中用到了书中提到了全部的指导。

交互设计之路:让高科技产品回归人性

正是这本书向世人介绍了角色模型的概念:不要把用户想象为一群抽象的、难以描述的、无定形的人。角色模型指导我 们和特定的用户进行交谈,这些用户有名字,有个性,有需求也有目标。我们的用户是否需要打印预览功能?谁知道?但是,如果对于客户经理 Gerry Manheim 来说,打印每周花销报表是他的工作,那你最好提供打印预览功能给他。这里边没有什么神奇的东西;一如既往的是,一切都归结于你的用户是谁,他们究竟要做什 么——角色模型是解决这一问题的好办法。

程序员认为自己在设计产品可用性时能够代表“普通”用户作出某些决定,但是在现实世界中,他们完全不能代表用户。程序员是一群怪人,充其量能算是是 一种极端的用户——就好比“逻辑人(Homo Logicus)” vs. “现代智人(Homo Sapiens)”。除非你碰巧开发的是一款编译器,因为编译器的用户也是程序员。

这本书有一个隐含的观点,有的时候,无论你的设计有多好,就像由 Alan 担任顾问并在此书中用作案例的这两款软件:扫描仪软件以及网页开发软件,在市场上都没有能够取得成功,但这和软件的可用性无关,因为它们的可用性已经被证明是非常优秀的了。有些时候,非常优秀的产品同样会失败,而其失败的原因是你无法掌控的,无论你多么努力。对于此书中的一些华而不实的词藻,你可以用以上事实将自己拉回到现实当中。

  • 我有书中图片里的同款 USB 扫描仪,设备配套对软件令我印象深刻。后来我把这台扫描仪送给了我父亲。有一次和他打电话,我并没有提到任何关于扫描仪的事情,但是他却提到他很喜欢这个扫描软件。这一切都发生在这本书出版之前!

编程珠玑

在这里推荐《编程珠玑》,我本来有些犹豫,因为这本书中介绍了很多底层的编程技巧。但是书中确实包含了很多软件开发中的『珠玑』,所以值得每位开发者花时间去读一读。任何包含这幅图的书…

…都是物有所值的。利用TRS-80 与 DEC Alpha 的对比来阐释48n和n3算法的差别?各位,真的没有比这样做更合适的了。能和大师一起工作一年是最好的了,退而求其次,你也可以读读《编程珠玑》。这本书将很多软件工程师的智慧提炼成了简洁易懂的文字,纳入其中。

我不会骗你:有一些章节是可以完全略过的。比如说,第11、13和14章分别介绍了如何实现排序,堆和哈希算法,考虑到现如今这些基本算法都有成熟 的库可以使用,我无法想象再去实现它们有什么意义。 对于那些和教科书一样恼人的习题,这里有一个很实在的建议。浏览一下这本书,跳过代码部分。有件事可能会让你失望,第八章“粗略估算”(Column 8, “Back of the Envelope” )是必须要看的。这里有我见过的最佳的估算方法。这章还解释了一些疯狂的面试问题,一些公司很喜欢用这些问题提问我们。

如果你还在犹豫,你也可以在网上阅读一下此书的样章。最近我用书中关于字符串的章节去解释了马尔科夫链在生成人造数据填充空数据库时的作用。

程序员修炼之道:从小工到专家

看这本书时常会让我想到《编程珠玑》,但是实际上这本书更好一些。因为这本书没有那么的专注于代码,取而代之的的是,作者在这本书中总结了实际工作中发现的全部实用方法。并非所有的方法都是与编程相关的。比如,问问自己『为什么我要做这件事?是否值得这样做?』,跳出固有的思维方式。你应该把这些东西融入到你和你同事的日常生活中。正是这些内容,使得《程序员修炼之道》成为了一本如此优秀的书。

如果你想再多了解一些这本书,我建立一个HTML 版本的插页参考卡片,这个参考卡片很好的总结了这本书的内容。

Web 可用性设计

Jakob Neilsen 因为他所创建的可用性网站而出名。1989年,当他的书出版的时候,他就是一个可用性专家了。《Web 可用性设计》是一本专注于 web 可用性的新手教程,所以它和面向 GUI 的 Cooper 的那本书有所不同。

定量信息的视觉显示

视觉解释:图像和数量,证据与线索

想象信息

美丽的证据

信息是很美的。一个设计良好的 GUI 也很美。

除非你是个完美主义者(或是一个受虐狂,我猜),否则你没有必要把一套四本全买齐,但是前两本是必须的。

Chris Sells 对 Tufte 的书有些有趣的见解,这些见解源于他2004年6月参加Tufte研讨会时的见闻。

正则表达式经典实例

众所周知 UNIX 非常复杂、难以理解。正则表达式也是这样。

我可能已经是『保持简单直白』俱乐部的正是成员了,但是我愿意将正则表达式作为一个特例。若能正确的书写正则表达式,则在处理字符串时,它可以帮你节省非常多的时间。我从来没有遇到过一个项目,正则表达不能在某些地方为我们提供方便。

一旦你深入研究了正则表达式,你就会沉醉于正则表达式惊人的能力和潜力,这一切也造就了 Perl。记住,绝对的权利会导致绝对的腐败。但是同样非常的赞。

译者简介


艾凌风:兴趣点:Python,C/C++,在线教育,英语

外行朋友值得一读的 5 本经典数学书

伯乐在线 – 熊铎

原载: http://blog.jobbole.com/55179/

有很多人让我给外行朋友推荐一些优秀的数学书,他们之中有些是没在大学学过高等课程的,只对学习数学感兴趣的朋友,还有些对历史人物比对数学成果更感兴趣。具有讽刺意味的是,当你是滑铁卢大学数学专业的学生之后,你到第四年才有机会上一门讲述数学历史的课程,会向你解释一些隐藏在数学之后的心态和哲学,而非只是定理和证明。

这5本书是我推荐给那些想了解数学思想和原理的朋友。

1.《A History of Mathematics | 数学史》作者:Carl B. Boyer

这是大概十年以前我上过的数学史课程的教材,而这本书仍是最好,最为深入讨论过去几千年中数学发展的书之一。其由埃及和前古典数学开始,解释一个简单的任务是如何因为缺少数学工具而变得复杂,然后随着时间推移各种工具的开发使我们能够理解量子理论。这本书很厚,超过700页的内容(编注:中文精装版1108页),但是非技术型读者也完全可以毫无障碍的阅读。

这本书非常值得任何图书馆收藏,它也可以每章分开来读,每章覆盖了数学史的一个不同方面。

2.《Journeys Through Genius | 天才引导的历程:数学中的伟大定理》作者:William Dunham

很多年前我在一个二手店选了这本书,仅仅是因为它吸引了我的注意力,并且价格不错。我觉得它读起来会比较有意思,但是我从没想过因为其内容而惊讶和兴奋,直到我开始认真阅读。这本书拿了一些数学上最为重要和变化后的定理,并用简洁且易于接受的方法解释它们。

借助一种有趣且令人愉快的方式,把定理发展过程中的历史文物展示出来,在上下文中保持了发现在当时的重要性。此外,更加重要的是,在定理的解释之外,这些为众人所知的工作背后的人物和生活以及他们的各种工作一起带入到了文中。如果你想对数学上最伟大的定理了解更多,这本书很好读并值得你拥有。

3. 《The Mathematical Experience | 数学经验》作者 Philip J.Davis、Reuben Hersh

我的数学史课程教授把他的这本书的复印本借给我,而这本书或许是我读过的最开眼界的读物。我花费了整个周末来读这本书,从头至尾,然后又读了一遍,狼吞虎咽并吸收其中所有的思想和观点。

从讨论成为一个数学家意味着什么,和从由全世界数学家所分享的经验的视角,毫无疑问这是我书库中最好的书。从哲学到数学家的社会情感经验,这本书涵盖了数学的全部领域。这本书写的很好,简洁并且触动了我的心弦。在这本书中,我真的感觉到我正在读一个已经知道什么叫爱数学,并且因数学感到兴奋的人,而不用深入钻研那些原本的推导过程。如果在这整个列表中有那么一本我建议去立即买的书,那一定是这本。快去买吧!

4. 《Proofs from the Book | 数学天书中的证明》作者:Martin Aigner、Günter M. Ziegler

Paul Erdös是20世纪多产的数学家,他通常涉及到及其优美的证明,就如同从“从上帝自己的书中”中得到一样。

这本书是一些很多数学家认为必要和重要的证明的集合,同时也是优雅和漂亮的。

如果你想要一本读起来比较容易,但可以用原始的严密的方法探索其中的定理的书,那这本书一定适合你。它覆盖了十分宽泛的领域中,一些最好的证明。

5. 《Proofs and Refutations | 证明与反驳-数学发现的逻辑》作者:Imre Lakatos

这本书可能是本文介绍的最高端的书。它竟然出色地采用了教授和学生之间的讨论的形式来写。Lakatos将数学过程交织在一起,包括了数学如何真正完成和定理如何应用于各种各样的易于理解的技术。

如果你或者你所认识的任何人,真的考虑转入数学这一行,我会推荐他读这本书。这尤其包括教师,因为他解释了如何通过技术和哲学思想,帮助你全面理解和创造性地运用新学到的工具,使你前进。这真的是一本十分精彩,并且能很快读完的书。