机器学习:用初等数学解读逻辑回归

2015-11-03 龙心尘、寒小阳

摘自:http://my.csdn.net/longxinchen_ml

为了降低理解难度,本文试图用最基础的初等数学来解读逻辑回归,少用公式,多用图形来直观解释推导公式的现实意义,希望使读者能够对逻辑回归有更直观的理解。

逻辑回归问题的通俗几何描述

逻辑回归处理的是分类问题。我们可以用通俗的几何语言重新表述它:
空间中有两群点,一群是圆点“〇”,一群是叉点“X”。我们希望从空间中选出一个分离边界,将这两群点分开。

注:分离边界的维数与空间的维数相关。如果是二维平面,分离边界就是一条线(一维)。如果是三维空间,分离边界就是一个空间中的面(二维)。如果是一维直线,分离边界就是直线上的某一点。不同维数的空间的理解下文将有专门的论述。

为了简化处理和方便表述,我们做以下4个约定:

  1. 我们先考虑在二维平面下的情况。
  2. 而且,我们假设这两类是线性可分的:即可以找到一条最佳的直线,将两类点分开。
  3. 用离散变量y表示点的类别,y只有两个可能的取值。y=1表示是叉点“X”,y=0表示是是圆点“〇”。
  4. 点的横纵坐标用表示。

于是,现在的问题就变成了:怎么依靠现有这些点的坐标和标签(y),找出分界线的方程。

如何用解析几何的知识找到逻辑回归问题的分界线?
  1. 我们用逆推法的思路:
    假设我们已经找到了这一条线,再寻找这条线的性质是什么。根据这些性质,再来反推这条线的方程。
  2. 这条线有什么性质呢?
    首先,它能把两类点分开来。——好吧,这是废话。( ̄▽ ̄)”
    然后,两类点在这条线的法向量p上的投影的值的正负号不一样,一类点的投影全是正数,另一类点的投影值全是负数

    • 首先,这个性质是非常好,可以用来区分点的不同的类别
    • 而且,我们对法向量进行规范:只考虑延长线通过原点的那个法向量p。这样的话,只要求出法向量p,就可以唯一确认这条分界线,这个分类问题就解决了。


  3. 还有什么方法能将法向量p的性质处理地更好呢?
    因为计算各个点到法向量p投影,需要先知道p的起点的位置,而起点的位置确定起来很麻烦,我们就干脆将法向量平移使其起点落在坐标系的原点,成为新向量p’。因此,所有点到p’的投影也就变化了一个常量。

    假设这个常量为,p’向量的横纵坐标为。空间中任何一个点到p’的投影就是,再加上前面的常量值就是:

看到上面的式子有没有感到很熟悉?这不就是逻辑回归函数中括号里面的部分吗?

就可以根据z的正负号来判断点x的类别了。

从概率角度理解z的含义。

由以上步骤,我们由点x的坐标得到了一个新的特征z,那么:

z的现实意义是什么呢?

首先,我们知道,z可正可负可为零。而且,z的变化范围可以一直到正负无穷大。

z如果大于0,则点x属于y=1的类别。而且z的值越大,说明它距离分界线的距离越大,更可能属于y=1类。

那可否把z理解成点x属于y=1类的概率P(y=1|x) (下文简写成P)呢?显然不够理想,因为概率的范围是0到1的。

但是我们可以将概率P稍稍改造一下:令Q=P/(1-P),期望用Q作为z的现实意义。我们发现,当P的在区间[0,1]变化时,Q在[0,+∞)区间单调递增。函数图像如下(以下图像可以直接在度娘中搜“x/(1-x)”,超快):

但是Q的变化率在[0,+∞)还不够,我们是希望能在(-∞,+∞)区间变化的。而且在P=1/2的时候刚好是0。这样才有足够的解释力。

注:因为P=1/2说明该点属于两个类别的可能性相当,也就是说这个点恰好在分界面上,那它在法向量的投影自然就是0了。

而在P=1/2时,Q=1,距离Q=0还有一段距离。那怎么通过一个函数变换然它等于0呢?有一个天然的函数log,刚好满足这个要求。
于是我们做变换R=log(Q)=log(P/(1-P)),期望用R作为z的现实意义。画出它的函数图像如图:

这个函数在区间[0,1]中可正可负可为零,单调地在(-∞,+∞)变化,而且1/2刚好就是唯一的0值!基本完美满足我们的要求。
回到我们本章最初的问题,

“我们由点x的坐标得到了一个新的特征z,那么z的具体意义是什么呢?”

由此,我们就可以将z理解成x属于y=1类的概率P经过某种变换后对应的值。也就是说,z= log(P/(1-P))。反过来就是P=。图像如下:

这两个函数log(P/(1-P)) 、看起来熟不熟悉?

这就是传说中的logit函数和sigmoid函数!

小小补充一下:

  • 在概率理论中,Q=P/(1-P)的意义叫做赔率(odds)。世界杯赌过球的同学都懂哈。赔率也叫发生比,是事件发生和不发生的概率比。
  • 而z= log(P/(1-P))的意义就是对数赔率或者对数发生比(log-odds)。

于是,我们不光得到了z的现实意义,还得到了z映射到概率P的拟合方程:

有了概率P,我们顺便就可以拿拟合方程P=来判断点x所属的分类:

当P>=1/2的时候,就判断点x属于y=1的类别;当P<1/2,就判断点x属于y=0的类别。

构造代价函数求出参数的值

到目前为止我们就有两个判断某点所属分类的办法,一个是判断z是否大于0,一个是判断g(z)是否大于1/2。
然而这并没有什么X用,

以上的分析都是基于“假设我们已经找到了这条线”的前提得到的,但是最关键的三个参数仍未找到有效的办法求出来。

还有没有其他的性质可供我们利用来求出参数的值?

  • 我们漏了一个关键的性质:这些样本点已经被标注了y=0或者y=1的类别!
  • 我们一方面可以基于z是否大于0或者g(z) 是否大于1/2来判断一个点的类别,另一方又可以依据这些点已经被标注的类别与我们预测的类别的插值来评估我们预测的好坏。
  • 这种衡量我们在某组参数下预估的结果和实际结果差距的函数,就是传说中的代价函数Cost Function。
  • 当代价函数最小的时候,相应的参数就是我们希望的最优解。

由此可见,设计一个好的代价函数,将是我们处理好分类问题的关键。而且不同的代价函数,可能会有不同的结果。因此更需要我们将代价函数设计得解释性强,有现实针对性。

为了衡量“预估结果和实际结果的差距”,我们首先要确定“预估结果”“实际结果”是什么。

  • “实际结果”好确定,就是y=0还是y=1。
  • “预估结果”有两个备选方案,经过上面的分析,我们可以采用z或者g(z)。但是显然g(z)更好,因为g(z)的意义是概率P,刚好在[0,1]范围之间,与实际结果{0,1}很相近,而z的意思是逻辑发生比,范围是整个实数域(-∞,+∞),不太好与y={0,1}进行比较。

接下来是衡量两个结果的“差距”。

  • 我们首先想到的是y-hθ(x)。
    • 但这是当y=1的时候比较好。如果y=0,则y- hθ(x)= – hθ(x)是负数,不太好比较,则采用其绝对值hθ(x)即可。综合表示如下:
    • 但这个函数有个问题:求导不太方便,进而用梯度下降法就不太方便。
    • 因为梯度下降法超出的初等数学的范围,这里就暂且略去不解释了。
  • 于是对上面的代价函数进行了简单的处理,使之便于求导。结果如下:

代价函数确定了,接下来的问题就是机械计算的工作了。常见的方法是用梯度下降法。于是,我们的平面线形可分的问题就可以说是解决了。

从几何变换的角度重新梳理我们刚才的推理过程。

回顾我们的推理过程,我们其实是在不断地将点进行几何坐标变换的过程。

  • 第一步是将分布在整个二维平面的点通过线性投影映射到一维直线中,成为点x(z)
  • 第二步是将分布在整个一维直线的点x(z)通过sigmoid函数映射到一维线段[0,1]中成为点x(g(z))。
  • 第三步是将所有这些点的坐标通过代价函数统一计算成一个值,如果这是最小值,相应的参数就是我们所需要的理想值。

对于简单的非线性可分的问题。
  1. 由以上分析可知。比较关键的是第一步,我们之所以能够这样映射是因为假设我们点集是线性可分的。但是如果分离边界是一个圆呢?考虑以下情况。
  2. 我们仍用逆推法的思路:
    • 通过观察可知,分离边界如果是一个圆比较合理。
    • 假设我们已经找到了这个圆,再寻找这个圆的性质是什么。根据这些性质,再来反推这个圆的方程
  3. 我们可以依据这个性质:
    • 圆内的点到圆心的距离小于半径,圆外的点到圆心的距离大于半径
    • 假设圆的半径为r,空间中任何一个点到原点的距离为
    • ,就可以根据z的正负号来判断点x的类别了
    • 然后令,就可以继续依靠我们之前的逻辑回归的方法来处理和解释问题了。
  4. 从几何变换的角度重新梳理我们刚才的推理过程。
    • 第一步是将分布在整个二维平面的点通过某种方式映射到一维直线中,成为点x(z)
    • 第二步是将分布在整个一维射线的点x(z)通过sigmoid函数映射到一维线段[0,1]中成为点x(g(z))。
    • 第三步是将所有这些点的坐标通过代价函数统一计算成一个值v,如果这是最小值,相应的参数就是我们所需要的理想值。

 

从特征处理的角度重新梳理我们刚才的分析过程

其实,做数据挖掘的过程,也可以理解成做特征处理的过程。我们典型的数据挖掘算法,也就是将一些成熟的特征处理过程给固定化的结果
对于逻辑回归所处理的分类问题,我们已有的特征是这些点的坐标,我们的目标就是判断这些点所属的分类y=0还是y=1。那么最理想的想法就是希望对坐标进行某种函数运算,得到一个(或者一些)新的特征z,基于这个特征z是否大于0来判断该样本所属的分类。

对我们上一节非线性可分问题的推理过程进行进一步抽象,我们的思路其实是:

  • 第一步,将点的坐标通过某种函数运算,得到一个新的类似逻辑发生比的特征
  • 第二步是将特征z通过sigmoid函数得到新的特征
  • 第三步是将所有这些点的特征q通过代价函数统一计算成一个值,如果这是最小值,相应的参数(r)就是我们所需要的理想值。

对于复杂的非线性可分的问题

由以上分析可知。比较关键的是第一步,如何设计转换函数。我们现在开始考虑分离边界是一个极端不规则的曲线的情况。

我们仍用逆推法的思路:

  • 通过观察等先验的知识(或者完全不观察乱猜),我们可以假设分离边界是某种6次曲线(这个曲线方程可以提前假设得非常复杂,对应着各种不同的情况)。
  • 第一步:将点的坐标通过某种函数运算,得到一个新的特征。并假设z是某种程度的逻辑发生比,通过其是否大于0来判断样本所属分类。
  • 第二步:将特征z通过sigmoid函数映射到新的特征
  • 第三步:将所有这些样本的特征q通过逻辑回归的代价函数统一计算成一个值,如果这是最小值,相应的参数就是我们所需要的理想值。相应的,分离边界其实就是方程=0,也就是逻辑发生比为0的情况嘛

多维逻辑回归的问题

以上考虑的问题都是基于在二维平面内进行分类的情况。其实,对于高维度情况的分类也类似。

高维空间的样本,其区别也只是特征坐标更多,比如四维空间的点x的坐标为。但直接运用上文特征处理的视角来分析,不过是对坐标进行参数更多的函数运算得到新的特征并假设z是某种程度的逻辑发生比,通过其是否大于0来判断样本所属分类。

而且,如果是高维线性可分的情况,则可以有更近直观的理解。

  • 如果是三维空间,分离边界就是一个空间中的一个二维平面。两类点在这个二维平面的法向量p上的投影的值的正负号不一样,一类点的投影全是正数,另一类点的投影值全是负数。
  • 如果是高维空间,分离边界就是这个空间中的一个超平面。两类点在这个超平面的法向量p上的投影的值的正负号不一样,一类点的投影全是正数,另一类点的投影值全是负数。
  • 特殊的,如果是一维直线空间,分离边界就是直线上的某一点p。一类点在点p的正方向上,另一类点在点p的负方向上。这些点在直线上的坐标可以天然理解成类似逻辑发生比的情况。可见一维直线空间的分类问题是其他所有高维空间投影到法向量后的结果,是所有逻辑回归问题的基础

多分类逻辑回归的问题

以上考虑的问题都是二分类的问题,基本就是做判断题。但是对于多分类的问题,也就是做选择题,怎么用逻辑回归处理呢?

其基本思路也是二分类,做判断题。

比如你要做一个三选一的问题,有ABC三个选项。首先找到A与BUC(”U”是并集符号)的分离边界。然后再找B与AUC的分离边界,C与AUB的分离边界。

这样就能分别得到属于A、B、C三类的概率,综合比较,就能得出概率最大的那一类了。

总结

本文的分析思路——逆推法

画图,观察数据,看出(猜出)规律,假设规律存在,用数学表达该规律,求出相应数学表达式。
该思路比较典型,是数据挖掘过程中的常见思路。

两个视角:几何变换的视角与特征处理的视角。

  1. 小结:
    • 几何变换的视角:高维空间映射到一维空间 → 一维空间映射到[0,1]区间 → [0,1]区间映射到具体的值,求最优化解
    • 特征处理的视角:特征运算函数求特征单值z → sigmoid函数求概率 → 代价函数求代价评估值,求最优化解
  2. 首先要说明的是,在逻辑回归的问题中,这两个视角是并行的,而不是包含关系。它们是同一个数学过程的两个方面
    • 比如,我们后来处理复杂的非线性可分问题的时候,看似只用的是特征处理的思路。其实,对于复杂的非线性分离边界,也可以映射到高维空间进行线性可分的处理。在SVM中,有时候某些核函数所做的映射与之非常类似。这将在我们接下来的SVM系列文章中有更加详细的说明
  3. 在具体的分析过程中,运用哪种视角都可以,各有优点
    • 比如,作者个人比较倾向几何变换的视角来理解,这方便记忆整个逻辑回归的核心过程,画几张图就够了。相应的信息都浓缩在图像里面,异常清晰。
    • 于此同时,特征处理的视角方便你思考你手上掌握的特征是什么,怎么处理这些特征。这其实的数据挖掘的核心视角。因为随着理论知识和工作经验的积累,越到后面越会发现,当我们已经拿到无偏差、倾向性的数据集,并且做过数据清洗之后,特征处理的过程是整个数据挖掘的核心过程:怎么收集这些特征,怎么识别这些特征,挑选哪些特征,舍去哪些特征,如何评估不同的特征……这些过程都是对你算法结果有决定性影响的极其精妙的精妙部分。这是一个庞大的特征工程,里面的内容非常庞大,我们将在后续的系列文章中专门讨论
    • 总的来说,几何变换视角更加直观具体,特征处理视角更加抽象宏观,在实际分析过程中,掌握着两种视角的内在关系和转换规律,综合分析,将使得你对整个数据挖掘过程有更加丰富和深刻的认识
    • 为了将这两种视角更集中地加以对比,我们专门制作了下面的图表,方便读者查阅。

原文链接:http://blog.csdn.net/longxinchen_ml/article/details/49284391

封面来源:www.taopic.com

作者介绍:

龙心尘和寒小阳:从事机器学习/数据挖掘相关应用工作,热爱机器学习/数据挖掘

『我们是一群热爱机器学习,喜欢交流分享的小伙伴,希望通过“ML学分计划”交流机器学习相关的知识,认识更多的朋友。欢迎大家加入我们的讨论群获取资源资料,交流和分享。』

联系方式:

龙心尘 johnnygong.ml@gmail.com

寒小阳 hanxiaoyang.ml@gmail.com

 

机器学习算法一览(附python和R代码)

2016-04-19 大数据文摘
编译:@酒酒
校正:寒小阳 && 龙心尘

摘自:http://www.analyticsvidhya.com

谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更聪明,更人性化的技术,机器学习。 ”
—— 埃里克 施密特(谷歌首席执行官)

◆ ◆ ◆

当计算从大型计算机转移至个人电脑再转移到云的今天,我们可能正处于人类历史上最关键的时期。之所以关键,并不是因为已经取得的成就,而是未来几年里我们即将要获得的进步和成就。

对我来说,如今最令我激动的就是计算技术和工具的普及,从而带来了计算的春天。作为一名数据科学家,我可以建造一个数据处理系统来进行复杂的算法运算,这样每小时能赚几美金。可是学习这些算法却花了我无数个日日夜夜。

那么谁能从这篇文章里收益最多呢?

这篇文章有可能是我写的所有文章里最有价值的一篇。

写这篇文章的目的,就是希望它可以让有志于从事数据科学和机器学习的诸位在学习算法的路上少走些路。我会在文章中举例一些机器学习的问题,你们也可以在思考解决这些问题的过程中得到启发。我也会写下对于各种机器学习算法的一些个人理解,并且提供R和Python的执行代码。读完这篇文章,读者们至少可以行动起来亲手试试写一个机器学习的程序。

不过,这篇文章并没有阐述这些算法背后的统计学原理,有时候从实践入手也是很好的学习路径。如果你希望了解的是这些统计学原理,那么这篇文章的内容可能并不适合你。

一般说来,机器学习有三种算法:

1. 监督式学习

监督式学习算法包括一个目标变量(因变量)和用来预测目标变量的预测变量(自变量)。通过这些变量我们可以搭建一个模型,从而对于一个已知的预测变量值,我们可以得到对应的目标变量值。重复训练这个模型,直到它能在训练数据集上达到预定的准确度。
属于监督式学习的算法有:回归模型,决策树随机森林,K邻近算法,逻辑回归等。

2. 无监督式学习

与监督式学习不同的是,无监督学习中我们没有需要预测或估计的目标变量。无监督式学习是用来对总体对象进行分类的。它在根据某一指标将客户分类上有广泛应用。
属于无监督式学习的算法有:关联规则,K-means聚类算法等。

3. 强化学习

这个算法可以训练程序做出某一决定。程序在某一情况下尝试所有的可能行动,记录不同行动的结果并试着找出最好的一次尝试来做决定。
属于这一类算法的有马尔可夫决策过程。

常见的机器学习算法

以下是最常用的机器学习算法,大部分数据问题都可以通过它们解决:

1.线性回归 (Linear Regression) 2.逻辑回归 (Logistic Regression) 3.决策树 (Decision Tree) 4.支持向量机(SVM) 5.朴素贝叶斯 (Naive Bayes) 6.K邻近算法(KNN) 7.K-均值算法(K-means) 8.随机森林 (Random Forest) 9.降低维度算法(Dimensionality Reduction Algorithms) 10.Gradient Boost和Adaboost算法

1.线性回归 (Linear Regression)

线性回归是利用连续性变量来估计实际数值(例如房价,呼叫次数和总销售额等)。我们通过线性回归算法找出自变量和因变量间的最佳线性关系,图形上可以确定一条最佳直线。这条最佳直线就是回归线。这个回归关系可以用Y=aX+b 表示。

我们可以假想一个场景来理解线性回归。比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。

在Y=aX+b这个公式里:

  • Y- 因变量
  • a- 斜率
  • X- 自变量
  • b- 截距

a和b可以通过最小化因变量误差的平方和得到(最小二乘法)。

下图中我们得到的线性回归方程是 y=0.2811X+13.9。通过这个方程,我们可以根据一个人的身高得到他的体重信息。

线性回归主要有两种:一元线性回归和多元线性回归。一元线性回归只有一个自变量,而多元线性回归有多个自变量。拟合多元线性回归的时候,可以利用多项式回归(Polynomial Regression)或曲线回归 (Curvilinear Regression)。

Python 代码

  1. #Import Library
  2. #Import other necessary libraries like pandas, numpy...
  3. from sklearn import linear_model
  4. #Load Train and Test datasets
  5. #Identify feature and response variable(s) and values must be numeric and numpy arrays
  6. x_train=input_variables_values_training_datasets
  7. y_train=target_variables_values_training_datasets
  8. x_test=input_variables_values_test_datasets
  9. # Create linear regression object
  10. linear = linear_model.LinearRegression()
  11. # Train the model using the training sets and check score
  12. linear.fit(x_train, y_train)
  13. linear.score(x_train, y_train)
  14. #Equation coefficient and Intercept
  15. print('Coefficient: \n', linear.coef_)
  16. print('Intercept: \n', linear.intercept_)
  17. #Predict Output
  18. predicted= linear.predict(x_test)

R 代码

  1. #Load Train and Test datasets
  2. #Identify feature and response variable(s) and values must be numeric and numpy arrays
  3. x_train <- input_variables_values_training_datasets
  4. y_train <- target_variables_values_training_datasets
  5. x_test <- input_variables_values_test_datasets
  6. x <- cbind(x_train,y_train)
  7. # Train the model using the training sets and check score
  8. linear <- lm(y_train ~ ., data = x)
  9. summary(linear)
  10. #Predict Output
  11. predicted= predict(linear,x_test)

2.逻辑回归

别被它的名字迷惑了,逻辑回归其实是一个分类算法而不是回归算法。通常是利用已知的自变量来预测一个离散型因变量的值(像二进制值0/1,是/否,真/假)。简单来说,它就是通过拟合一个逻辑函数(logit fuction)来预测一个事件发生的概率。所以它预测的是一个概率值,自然,它的输出值应该在0到1之间。

同样,我们可以用一个例子来理解这个算法。

假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。

回到数学上,事件结果的胜算对数(log odds)可以用预测变量的线性组合来描述:

odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence ln(odds) = ln(p/(1-p)) logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk

在这里,p 是我们感兴趣的事件出现的概率。它通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和。

你可能会问为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法。因本篇文章旨不在此,这方面就不做详细介绍了。

Python 代码

  1. #Import Library
  2. from sklearn.linear_model import LogisticRegression
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create logistic regression object
  5. model = LogisticRegression()
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. model.score(X, y)
  9. #Equation coefficient and Intercept
  10. print('Coefficient: \n', model.coef_)
  11. print('Intercept: \n', model.intercept_)
  12. #Predict Output
  13. predicted= model.predict(x_test)

R 代码

  1. x <- cbind(x_train,y_train)
  2. # Train the model using the training sets and check score
  3. logistic <- glm(y_train ~ ., data = x,family='binomial')
  4. summary(logistic)
  5. #Predict Output
  6. predicted= predict(logistic,x_test)

延伸
以下是一些可以尝试的优化模型的方法:

  • 加入交互项(interaction)
  • 减少特征变量
  • 正则化(regularization
  • 使用非线性模型

3.决策树

这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。更详细的内容可以阅读这篇文章Decision Tree Simplified

从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。

理解决策树原理的最好的办法就是玩Jezzball游戏。这是微软的一款经典游戏(见下图)。这个游戏的最终任务是在一个有移动墙壁的房间里,通过建造墙壁来尽可能地将房间分成尽量大的,没有小球的空间。

每一次你用建墙来分割房间,其实就是在将一个总体分成两部分。决策树也是用类似方法将总体分成尽量多的不同组别。

延伸阅读:Simplified Version of Decision Tree Algorithms

Python 代码

  1. #Import Library
  2. #Import other necessary libraries like pandas, numpy...
  3. from sklearn import tree
  4. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  5. # Create tree object
  6. model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
  7. # model = tree.DecisionTreeRegressor() for regression
  8. # Train the model using the training sets and check score
  9. model.fit(X, y)
  10. model.score(X, y)
  11. #Predict Output
  12. predicted= model.predict(x_test)

R 代码

  1. library(rpart)
  2. x <- cbind(x_train,y_train)
  3. # grow tree
  4. fit <- rpart(y_train ~ ., data = x,method="class")
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

4. 支持向量机(SVM)

这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。

现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。

在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。

更多阅读:Simplified Version of Support Vector Machine

我们可以把这个算法想成n维空间里的JezzBall游戏,不过有一些变动:

  • 你可以以任何角度画分割线/分割面(经典游戏中只有垂直和水平方向)。
  • 现在这个游戏的目的是把不同颜色的小球分到不同空间里。
  • 小球是不动的。

Python 代码

  1. #Import Library
  2. from sklearn import svm
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create SVM classification object
  5. model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. model.score(X, y)
  9. #Predict Output
  10. predicted= model.predict(x_test)

R 代码

  1. library(e1071)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-svm(y_train ~ ., data = x)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

5. 朴素贝叶斯

这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。

朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。

贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:

  • P(c|x)是已知特征x而分类为c的后验概率。
  • P(c)是种类c的先验概率。
  • P(x|c)是种类c具有特征x的可能性。
  • P(x)是特征x的先验概率。

例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:

步骤1:根据已知数据做频率表

步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.

步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。

提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?

我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。

那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。

当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。

Python 代码

  1. #Import Library
  2. from sklearn.naive_bayes import GaussianNB
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
  5. # Train the model using the training sets and check score
  6. model.fit(X, y)
  7. #Predict Output
  8. predicted= model.predict(x_test)

R 代码

  1. library(e1071)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-naiveBayes(y_train ~ ., data = x)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

6.KNN(K-邻近算法)

这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。

距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。

KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。

在用KNN前你需要考虑到:

  • KNN的计算成本很高
  • 所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
  • 在进行KNN前预处理数据,例如去除异常值,噪音等。

Python 代码

  1. #Import Library
  2. from sklearn.neighbors import KNeighborsClassifier
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create KNeighbors classifier object model
  5. KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(knn)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <-knn(y_train ~ ., data = x,k=5)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

7. K均值算法(K-Means)

这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。

还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!

K均值算法如何划分集群:

  1. 从每个集群中选取K个数据点作为质心(centroids)。
  2. 将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
  3. 找出新集群的质心,这样就有了新的质心。
  4. 重复2和3,直到结果收敛,即不再有新的质心出现。

怎样确定K的值:

如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。

我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。

Python 代码

  1. #Import Library
  2. from sklearn.cluster import KMeans
  3. #Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
  4. # Create KNeighbors classifier object model
  5. k_means = KMeans(n_clusters=3, random_state=0)
  6. # Train the model using the training sets and check score
  7. model.fit(X)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(cluster)
  2. fit <- kmeans(X, 3) # 5 cluster solution

8.随机森林

随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。

怎样生成决策树:

  1. 如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
  2. 如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
  3. 每个决策树都最大程度上进行分割,没有剪枝。

比较决策树和调节模型参数可以获取更多该算法细节。我建议读者阅读这些文章:

  1. Introduction to Random forest – Simplified
  2. Comparing a CART model to Random Forest (Part 1)
  3. Comparing a Random Forest to a CART model (Part 2)
  4. Tuning the parameters of your Random Forest model

Python 代码

  1. #Import Library
  2. from sklearn.ensemble import RandomForestClassifier
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create Random Forest object
  5. model= RandomForestClassifier()
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(randomForest)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fit <- randomForest(Species ~ ., x,ntree=500)
  5. summary(fit)
  6. #Predict Output
  7. predicted= predict(fit,x_test)

9.降维算法(Dimensionality Reduction Algorithms)

在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。

例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。

作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。

进一步的了解可以阅读Beginners Guide To Learn Dimension Reduction Techniques。

Python 代码

更多信息在这里

  1. #Import Library
  2. from sklearn import decomposition
  3. #Assumed you have training and test data set as train and test
  4. # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
  5. # For Factor analysis
  6. #fa= decomposition.FactorAnalysis()
  7. # Reduced the dimension of training dataset using PCA
  8. train_reduced = pca.fit_transform(train)
  9. #Reduced the dimension of test dataset
  10. test_reduced = pca.transform(test)

R 代码

  1. library(stats)
  2. pca <- princomp(train, cor = TRUE)
  3. train_reduced  <- predict(pca,train)
  4. test_reduced  <- predict(pca,test)

10.Gradient Boosing 和 AdaBoost

GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。

更多阅读: Know about Gradient and AdaBoost in detail

Python 代码

  1. #Import Library
  2. from sklearn.ensemble import GradientBoostingClassifier
  3. #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
  4. # Create Gradient Boosting Classifier object
  5. model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
  6. # Train the model using the training sets and check score
  7. model.fit(X, y)
  8. #Predict Output
  9. predicted= model.predict(x_test)

R 代码

  1. library(caret)
  2. x <- cbind(x_train,y_train)
  3. # Fitting model
  4. fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
  5. fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
  6. predicted= predict(fit,x_test,type= "prob")[,2]

GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问这两个算法有什么不同。

“人工智能大脑”跳槽记:吴恩达所理解的智能,创新和失败

2016-04-17 董老师在硅谷

前两天公众号上发了吴恩达的Quora采访问答,而上周四“机器学习研究会”线上交流中,雷鸣对话吴恩达深度解析人工智能的发展现状与未来。让我印象深刻的是这么一段他谈到无人车和AI领域学习建议。吴恩达说:

在中国,每天都有500人死于车祸。我们的无人驾驶技术早实现一天,就相当于多拯救了500人的生命,这将会是接下来的十年中,人工智能得到的最重要的应用之一。

我想和在座的年轻人说几句话。我们处在一个独特的时期,这是一个人工智能将会改变世界的时期。如果你知道怎么运用人工智能,你今天的一个决策将有可能在接下来十年里改变世界。你的努力可能会拯救数以万计甚至百万计的生命。或许,你可以改变整个行业,帮助无数的人。也正因如此,我对人工智能如此兴奋!如果你还年轻,正在考虑未来的职业如何规划,我希望你能够考虑人工智能。

人工智能发展的如此迅猛,从事这一行业的我们应该不断的学习。再一次,我想跟在座的年轻人共勉:每个周六,你可以选择看美剧,也可以选择学习。如果你学习,两天后的周一,你不会很快的就在工作中出彩,你的老板也不会知道你花了整天的时间学习,更不会夸奖你什么。你几乎找不到任何东西可以证明你在努力学习。但是我想告诉大家:如果你每个周末都这样努力工作,持之以恒,你会发现你已经突飞猛进。我认为,学习是一件几乎没有短期回报的事,但是从长远来看,回报却是非常丰厚的。

下面这一篇是去年Huffington Post对他的采访,讲述科学家背后的成长,经历的失败和保持的信念。译文知乎专栏“董老师在硅谷”首发。转发请注明。

可以说最好的计算机科学的项目分布在卡内基美隆、麻省理工、加州大学伯克利分校和斯坦福大学等高校中,而吴恩达教授 (Andrew Ng)正是从这些地方分别取得了本科,硕士,博士学位,以及12年的任教经历。

吴恩达虽然不到40岁,但是已经是人工智能界的标志性人物。早在2011年,他建立了谷歌大脑(Google Brian),这是依托于谷歌强大的计算能力和丰富的数据建立起来的一个深度学习的研究项目。可喜的是,这个项目的重要成就之一是通过让计算机分析几十个YouTube的视频截图来识别猫(《纽约时报》标题:需要多少计算机才能正确的识别猫?16,000台)。正如吴恩达解释的那样,“最值得注意的是,我们的系统自己发现了‘猫’的概念,尽管没有人告诉过它‘猫’是什么。这可以说是机器学习的一个里程碑”。

吴恩达流露出喜悦但却非常冷静,他欣然地讨论着他职业生涯中犯过的错误和遇到的失败,以及他读不懂的论文。他每天穿着一样的牛津蓝的衬衫。他的妻子Carol Reiley从事外科手术机器人的研究,当同事们谈及他和妻子之前那张机器人主题的订婚照片时,他也会脸红,但又非常自豪。

尽管他作为讲师备受欢迎,但当和他一对一交谈时,他的声音显得非常柔和。2011年,他把自己在斯坦佛教授的机器学习课程录像上传到网上,随后超过100,000人在网上注册学习了这门课。在接下来的一年里,他和别人共同创立了迄今世界上最大的在线公开课程平台—Coursera。Coursera 的合作伙伴包括包括普林斯顿、耶鲁以及中国和欧洲的顶尖高校。尽管Coursera是一个盈利性的公司,但所有的课程都是免费开放,因为“对课程本身的内容收取费用将是一个悲剧”,吴恩达说到。

去年春天,吴恩达宣布了一条令人震惊的事情,他将离开谷歌、离开曾全身心投入的Coursera而加盟百度。当时,中国的科技巨头百度斥资3亿美金,在位于谷歌硅谷总部不远的地方,正建立一个专注于研究人工智能的实验室。吴恩达将会领导和管理这个实验室。

像之前一样,吴恩达在百度继续尝试让计算机以很高的准确率来实时识别音频和图像文件。吴恩达相信,高达99%准确率的语音识别技术会为人和计算机的交互方式、以及未来操作系统的设计带来革命性的改变。同时,面对百度的数以百万刚开始体验数字生活的用户,他要帮助百度为这些用户提供更好的服务。“在中国,你可能得到和美国的完全不一样的查询请求”,吴恩达解释道,“例如,我们得到的查询可能是‘百度你好,上周我在街角的那家店吃了碗面,味道很棒,你觉得这周末那家店会有促销活动吗?’”。“像这样的查询请求”,吴恩达补充道,“我想我们已经可以很好的回答它”。

尽管Elon Musk (SpaceX和特斯拉的CEO)和史蒂文霍金已经发出警告:高级人工智能技术可能会威胁到人类自身,吴恩达却不以为然,“我不会防止人工智能向邪恶的方向发展,就像我现在不会去解决火星上人口过剩问题一样。”根据吴恩达所说,距离人工智能达到可以自我感知的水平,还有相当长的一段时间。但与此同时,人工智能导致了更加棘手的问题的出现:这些基于机器学习的计算机,正在取代很多人工工作,而且这种趋势正在加速。吴恩达经常呼吁政策的制定者为因此产生的社会经济后果做好准备。

在位于加州Sunnyvale 的百度实验室,我们采访了吴恩达先生。我们谈到了一个名为‘索菲亚’(Sophia)的项目,这个项目诣在收集非常有趣的人的经历。他解释了为什么他认为“跟随着你的热情”是非常糟糕的职业发展建议,分享了他教授创造力的方法;他也讨论了他的失败经历以及他的一些不错的习惯,对他影响最大的书籍以及他关于人工智能前沿领域的一些看法。

问:您最近曾说过,“我发现人们正在学着更具有创造力了”,请您解释一下?

答:问题是,一个人如何才能创造新的想法?新的想法是某一个方面的天才(比如乔布斯)的不可预知的行为?还是可以通过系统的传授产生创新的想法?

我相信创新的能力是可以被教授的。人们可以通过很多方式来系统的发明创新。我在百度做的事情之一是组织一个关于培养创新思维的讨论班。我的想法是,创新不是那些天才所做的随机的、不可预知的事情,恰恰相反,人们可以非常系统的创造从未被创造的新事物。

对我而言,无论何时,当我觉得我不知道下一步应该如何做的时候,我将会尝试大量的学习和阅读,和某些领域的专家谈话。我不知道我们的大脑是如何工作的,但它非常的神奇:当你读了足够多的书,或者和足够多的专家谈话之后,换句话说,当你的大脑有了足够多的输入信息,新的想法就会随之产生。我知道的很多人都有这样的经历。

当你对某一个某技术领域足够的了解,你便停止随机地寻找新的想法。你会通过深思熟虑来选择想法,把这种想法组合到一起。你也会知道什么时候尝试创造尽量多的想法,什么时候裁剪、整合已有的想法。

好了,现在还有一个挑战,就是面对非常多的新想法,你如何去做?如何进一步用这些想法做一些非常有用的东西?当然,这是另外一回事了。

问:你可以谈一下你平时会学习什么,学习的方法是怎样的?

答:我阅读很多材料,也花很多时间和很多人交谈。我觉得两个最有效的学习、获取信息的方法是阅读和同专家交谈。所以我会花很多时间做这两件事情。在我的kindle上有不到一千本书,我大概已经阅读了其中的2/3。

在百度,我们有阅读小组,在那里,我们可以每星期读半本书。我试试上参加了两个这样的阅读小组,在每个小组里都会每星期读半本书。我想我是唯一一个参加了两个阅读小组的人。我每周六下午最喜欢的活动就是独自在家阅读。

问:我想了解一下早期教育对你的影响,你觉得父母做了什么独特的事情对你后来产生了持续的影响?

答:我记得在我六岁时,我父亲为我买了一台电脑,并帮助我学习编程。这本身并不是很特别,因为很多计算机科学家从很小的时候就开始学习编程了。但我仍然觉得从小就拥有计算机学习编程是件很幸运的事。

不像传统的亚洲家长,我的父母对我的要求非常宽松。当我在学校取得好的成绩时,他们就会夸张地表扬我,甚至让我觉得有些尴尬。所以我有时故意把取得的好成绩藏起来[笑]。我不喜欢把我的成绩单拿给父母看,不是因为我的成绩不好,而是因为他们的反应。

我有幸能在很多地方生活和工作过:我出生在英国,在香港和新加坡长大,来到美国读书。我在卡内基美隆,麻省理工,伯克利都拿到了学位,最后去了斯坦福任教。

我也有幸因为去了这些地方,从而见到了很多非常优秀的人。我在著名的前AT&T贝尔实验室做过实习,然后去了微软研究院。这些经历使我有机会从各个角度看待问题和接受观点。

问: 如果可以重新规划你的教育和早期的职业,你会做哪些不同的事情?你有哪些会让别人受益的教训,可不可以分享一下?

答: 我希望这个社会能给年轻人更好的职业发展建议。“跟着你的热情做事”不是什么好的建议,相反,是给年轻人非常糟糕的建议。

如果你酷爱驾车,并不一定要成为赛车车手。事实上,我们应该把“跟着你的热情做事”改成“跟着你的热情做事,但这些热情是对你在大学所学专业相关事物的热情”。

但通常,你先是掌握了一件事情,然后才会对它有热情。我相信大多数人都会很好的掌握大多数事情。所以关于选择我想要做的事情,有两个标准。第一,是否有学习的机会。就是说,做这件事情是否会让我学到新的、有趣的、实用的东西?第二,就是潜在的影响。这个世界有很多有趣的问题需要解决,但也有很多重要的问题。我希望大家把精力放在解决重要的问题上。

幸运的是,我不断地找到能够产生深远影响的事情去做,同时也有很多学习的机会。我想,年轻人如果能注重优化这两个标准,就会获得非常好的职业发展。

我的团队的使命就是要做更难、更高级的人工智能技术,这些技术会影响数亿人们。这就是令我兴奋的使命。

问: 在你看来,重要性就是说可以影响很多人吗?

答:不是。受到影响的人的数量并不是衡量重要性的唯一标准。用显著的方式改变数亿人的生活,我想这是我们可以合理追求的境界。通过这种方式,可以确信,我们不仅仅是做有趣的事情,而且是做有影响的事情。

问:你之前谈到过你做过一些失败的项目,那你又是如何面对这些失败呢?

答:失败在所难免,说来话长了[笑]。几年前,我在 Evernote里面列了一起清单,试图记住我所有开始做,却由于各种原因最后不了了之,或者没有成功,亦或投入和产出完全不成比例的项目。有时,我通过运气而非技能,以出乎我意料的方式,把一些项目做出来了。但我还是列了上面提到的那个清单。然后把它们按照哪里出了问题分类,对他们进行彻底的分析,找出没有成功的原因。

其中的一个失败的案例发生在斯坦福。当时受到鹅群成V型飞行,我们曾尝试让飞机也以V字型飞行,从而节省燃料。关于这方面的空气动力学理论非常成熟,我们就花了一年时间让飞机可以被自动控制,然后以V字型飞行。

但一年之后,我们发现我们没有办法让飞机以足够的精度控制飞机从而实现节省燃料。如果重新开始这个项目,我们会意识到我们用小型飞机根本不可能实现那个目标。因为阵风很容易无法让飞机准确地以V字型飞行。

我以前很容易犯的一种错误,就是当我做一个项目时,一步,两步,三步之后,发现第四步根本不可能完成。希望这种错误现在会少很多。上面的那个飞机V字型飞行的例子,我在战略创新组会上也讲过,教训就是尽早的发现项目的风险。

现在,我学会尽量早的发现评估项目的风险。如果我现在说“我们应该尽早找到项目的风险”时,每个人都会赞同,因为这显然是正确的。但问题是,如果你自己面对一个新的项目时,很难把我说的应用到你的项目中去。

究其原因,这些科研项目是一种策略技能。在现行的教育系统中,我们非常善于教授已有的事实,比如食谱。如果你要做意大利番茄牛肉面,你只需要照着食谱做就好了。

但创新或者创造力是一种策略技能,每天你醒来,便会处在从没有经历过的环境中,你需要在你自己所处的独特环境中做决策。据我所知,教授策略技能的唯一途径是通过经历无数的案例。当你已经见过足够的案例后,大脑会内化这些定律和准则,从而更好的做出决策。

通常,我发现做科研的人们要花好多年才能见到足够多的案例,内化这些准则。所以在这里,为创新策略,我一直试验做飞行模拟器。在非常有限的时间内,飞行模拟器可以产生非常多的案例,人们不再需要花五年时间来看足够多的案例。

如果你学驾驶飞机,你需要费很多年,或者几十年才能遇到紧急情况。但在飞行模拟器中,我们可以在很短的时间里展示非常多的紧急情况。这会让你学习的更快。这些就是我们一直试验的东西。

问: 当试验室刚刚建立,你说你之前还没看到团队文化的重要性,但你已经看到它的价值。几个月过去了,你学会到如何建立正确的团队文化了吗?

答:很多机构有关于文化的文件,比如“我们要互助”等等。当你说这句话的时候,每个人都会点头,因为没有人不想帮助团队的其他成员。但当他们回去以后,过了五分钟,他们还会这么做吗?事实上人们很难把抽象和实际联系起来。

在百度,我们做了一件关于文化的事情,我认为这是很不寻常,因为我不知道有别的企业这么做过。我们做了一个小测验,向每个员工描述一个具体的情景,然后问他们,“如果你在这种情况下,你应该怎么做?选A, B, C还是D?”

没有人在第一次就能拿到测验的满分。我觉得通过在测验中让员工把具体的行动用到假设情景中,就是我们尝试帮助员工把抽象的文化和实际联系起来。当你的员工找到你,做了这些事情,你会怎么做呢?

问:你是否可以分享一些对你知识构建很有影响的书呢?

答:对于那些想要创新的人,我有一些书推荐。第一本是《从零到一》(Zero to One),这是一本非常好的书,给出了对创业和创新的概览。我们经常把创业分为B2B, B2C. 对B2B,我推荐《跨越鸿沟》(Crossing the Chasm)。对B2C,《精益创业》(The Lean Startup)是我非常喜欢的一本书。这本书从更窄的范围入手,但给出了具体的快速创新策略。这本书的范围有点窄,但在提及的那些领域,它讲的非常棒。

然后我们进一步把B2C细分,两本我非常喜欢的书是,首先是《与人沟通》(Talking to Humans),这是一本非常简短的书,教会你如何通过和你服务的用户交谈,来为他们设身处地的着想。另外一本是《妙手回春》(Rocket Surgery Made Easy),如果你想做一些重要的,人们关心的产品,这本书会告诉你一些不同的策略(通过用户学习或者是面谈)了解你的用户。

最后,我推荐《创业艰难》(The Hard Thing about Hard Things)。这本书有些深,但它涵盖了关于如何建立企业的方方面面。

对那些想做出职业发展决策的人,So Good They Can’t Ignore You是一本非常有趣的书,它给出了关于如何选择职业发展道路的非常有价值观点。

问:你有那些好的习惯呢?

答:我每天都穿蓝色牛津衬衫,我不知道你是否已经意识到了。[笑]是的,培养好的习惯的能力是你撬动你生命的最大杠之一。

当我和研究人员,或是想创业的人交谈时,我告诉他们如果你不断地阅读论文,每周认真研究六篇论文,坚持两年。然后,你会学到很多东西。这是对你长期发展一个极好的投资。

但这种投资,比如你花整个周六去学习而不是看电视,没有人会赞扬你。而且很可能你在周六所学的东西对你在接下来周一的工作没有什么帮助。我们很少会从这些投资中得到短期回报。但这却是很好的长期投资。确实,要想成为一个伟大的研究者,就要大量阅读。

人们通常用意志力做这些事情,但不起作用,因为意志力会耗尽。我觉得,人们喜欢创造习惯,比如每周都努力的学习工作,这是最重要的。这些人才是最可能成功的。

我有一个习惯,每天早晨花七分钟用手机应用锻炼。我发现更容易每天做同样的事情,因为我只有一个选择。同样的原因,我的衣柜里塞满了蓝色的衬衫。我以前有两种颜色的衬衫,蓝色和紫红色。我觉得我需要做的决定太多了[笑]。所以我现在只穿蓝色衬衫了。

问: 你主张政策制定者要花时间想一下未来,当计算机和机器人削减了大量个人工工作。对这个问题,你有什么解决方案呢?

答:这是个很难回答的问题。计算机擅长做重复性的工作。迄今为止,计算机主要擅长的事情就是把人们每天重复的劳动自动化。

让我们从工作的难易程度来具体的分析。工人们在流水线上工作,每个月都重复同样的动作。现在部分这样的工作已经可以有机器人来实现。中等难度的工作,拿驾驶开车举例子。卡车司机每天都是做同样的事情,所以计算机也试图做这件事。虽然这比大多数人想象的要难很多,但自动驾驶很可能在未来的十几年里成为现实。最后讲的是最有难度的工作,比如放射线学家每天都要分析同样类型的X光射线,同样,计算机可能涉足这些领域。

但是对于那些非重复性的社会工作,我想,在今后很长一段时间内,人类要比计算机更擅长这类工作。很多工作,我们需要每天做不同的事情,见不同的人,计划不同的事情,解决不同的问题。现在,这些事情对于计算机来说还是很难完成。

当美国从农业经济向制造和服务型经济转型,有很多的人转变了所从事的工作,比如,从在农场工作变为制造或在电话客服中心工作。很多的人经历了那种转变,所以他们找到了新的工作,他们的生活还不错,但他们从事的工作大多还是重复性。

我们现在面临的挑战是,如何大规模地教人们从事非重复性的工作。从历史来看,我们的教育系统并不擅长做这种大规模的培训。顶尖高校擅长为相对少的一部分人提供这种培训。但大部分的人最后做的确实重要但重复性很强的工作。这是我们教育系统面临的挑战。

我觉得这个问题可以被解决。这就是我为什么一直想教授创新策略。我们要让很多人能做不重复的工作。这些创新策略,这些创新的飞行模拟器可以实现这个目标。我不是说我们已经知道如何解决这些问题,但我很乐观的相信我们能够解决它。

问: 你曾说过,“总体上来看,在中国的工程师要比在硅谷的工程师工作努力。在硅谷的初创公司的工程师工作非常努力,在成熟的公司,我没有见过像你这种工作强度,无论在初创公司还是在百度。”你为什么这么说呢?

答:其实我也不是很清楚。我觉得在中国的工程师非常出色。在硅谷的工程师也很出色。我认为不同之处在于公司。百度的工程师团队动作非常快。

对中国互联网经济的现状评价很少,我更感觉,所有的假设可以受到挑战,任何事情都可以被随时利用。中国互联网生态非常有活力。每个人都能看到大的机遇,每个人也都能看到大量的竞争。变化无所不在。新的事物出现,很多公司就会在一天之内进入一个全新的商业领域。

举个例子,在美国,如果Facebook说要做一个新的搜索引擎,我们可能会觉得这么做有点怪。为什么Facebook要做搜索引擎呢?这非常困难。但在中国,这种事情却更可信些,因为这么做不仅仅是个假设,还可能会创造一种新的商业模式。

问:这看起来是一种不同的管理文化,因此你可以很快的做重要的决定,从而让这些决定更明智有效,而不是更混乱。百度是以一种独特的方式来运营吗?你觉得这种运营方式对百度的成长有帮助吗?

答:这是一个非常好的问题。我想一下这个问题如何入手。在百度,决策制定可以推行到公司的最底层。百度的员工有很大的自治权,他们显得非常重要。有一件事我很欣赏公司,特别是公司执行高层,就是对世界,对竞争,有着清晰的眼界。

在管理层会议上,我们对公司的说话方式,没有任何的虚张声势。在公司的内部陈述中,他们会说“我们在这件事上做的很好。我们对这些是不是很满意。这些做的不错。这些做的不是很好。这些事情我们应该强调一下。我们仔细分析一下我们犯的错误。”在这里,确实没有什么虚张声势,我想,这让公司有一个不错的环境从事创新以及专注。

问:比起其他的问题,你非常专注语音识别。你现在遇到那些困难,当你解决了这些困难后,会让语音识别的准确率有显著的提高?

答:我们现在在做基于机器学习的语音识别系统。我们正在使用的一些机器学习的技术已经存在几十年了。但正是过去的几年,这些技术才真正开始被使用。

为什么会这样呢?我经常拿建造火箭飞船作比喻。火箭飞船需要很大的发动机和非常多的燃料。发动机必须足够大,燃料必须足够多。如果燃料很多发动机很小,那无法飞离地面。如果发动机很大但燃料很少,飞船可以飞起来,但无法进入轨道。

现在机器学习才真的算得上起步,原因是我们有了建造巨大引擎的工具—大型计算机。燃料就是数据。现在我们终于拥有了所需要的数据。

社会的数字化创造了很多的数据,长期以来,我们已经产生了很多的数据。但就是最近几年我们才有能力建造大引擎来吸收燃料。所以处理语音识别的方法就是想办法建造大引擎,并得到更多的燃料。

举个我们做的一个例子,这个例子有点偏技术。从哪里获取语音识别的数据呢?我们做的其中一件事就是获取音频数据。其他的研究组可能只用几千小时的音频数据,但我们用的是十几万小时的数据。这比你在学术文献里使用的燃料要多很多。

然后我们把人们说话的音频剪切下来,加上背景噪音,听起来像人们在咖啡厅里面的录音。这就是人工合成像在咖啡厅录制的音频。通过把人们的声音和背景音合成,我们得到了更多的数据。我们正是通过类似的方法,把更多的数据放到机器里,填充火箭的发动机。

说到语音识别,有一件事要提一下:大多数人不理解95%和99%的准确度的区别。95%的准确度意味着20个词中有一个是错的。这非常烦人,因为在电话上退回去再去纠正它非常痛苦。

99%意味着一切都变了。99% 说明语音识别系统更可靠。你在任何时候使用它,它都会照常运转。所以这不是四个百分点的改进,这将会是人们几乎不使用跟一直使用的差别。

问: 你觉得现在达到99%准确率的困难是什么呢?

答:我们需要更大的火箭引擎和更多的燃料。现在这两方面都很有限,而且这两方面要同时增长。我们正在为推动这些方面的发展而努力。

------------------

欢迎大家报名翻译,转载请注明出处。

关注如下我的微信公众号“董老师在硅谷”,关注硅谷趋势,一起学习成长。