想学一下深度学习方面的知识,有靠谱的机构推荐吗?

2020-07-09 18:25发布

1条回答
007
2楼 · 2020-07-15 22:48


本文是在七月的BAT机器学习面试1000题系列进行修改。 


前言


  July我又回来了。


  之前本博客整理过数千道微软等公司的面试题,侧重数据结构、算法、海量数据处理,详见:微软面试100题系列,今17年,近期和团队整理BAT机器学习面试1000题系列,侧重机器学习、深度学习。我们将通过这个系列索引绝大部分机器学习和深度学习的笔试面试题、知识点,它将更是一个足够庞大的机器学习和深度学习面试库/知识库,通俗成体系且循序渐进。


  此外,有四点得强调下:


虽然本系列主要是机器学习、深度学习相关的考题,其他类型的题不多,但不代表应聘机器学习或深度学习的岗位时,公司或面试官就只问这两项,虽说是做数据或AI相关,但基本的语言(比如Python)、编码coding能力(对于开发,编码coding能力怎么强调都不过分,比如最简单的手写快速排序、手写二分查找)、数据结构、算法、计算机体系结构、操作系统、概率统计等等也必须掌握。对于数据结构和算法,一者重点推荐前面说的微软面试100题系列(后来这个系列整理成了新书《编程之法:面试和算法心得》),二者多刷leetcode,看1000道题不如实际动手刷100道。

    本系列会尽量让考察同一个部分(比如同是模型/算法相关的)、同一个方向(比如同是属于最优化的算法)的题整理到一块,为的是让大家做到举一反三、构建完整知识体系,在准备笔试面试的过程中,通过懂一题懂一片。

    本系列每一道题的答案都会确保逻辑清晰、通俗易懂(当你学习某个知识点感觉学不懂时,十有八九不是你不够聪明,十有八九是你所看的资料不够通俗、不够易懂),如有更好意见,欢迎在评论下共同探讨。

    关于如何学习机器学习,最推荐机器学习集训营系列。从Python基础、数据分析、爬虫,到数据可视化、spark大数据,最后实战机器学习、深度学习等一应俱全。

  另,本系列会长久更新,直到上千道、甚至数千道题,欢迎各位于评论下留言分享你在自己笔试面试中遇到的题,或你在网上看到或收藏的题,共同分享帮助全球更多人,thanks。


 


 


BAT机器学习面试1000题系列


1请简要介绍下SVM,机器学习ML模型易SVM,全称是supportvectormachine,中文名叫支持向量机。SVM是一个面向数据的分类算法,它的目标是为确定一个分类超平面,从而将不同的数据分隔开。

扩展:这里有篇文章详尽介绍了SVM的原理、推导,《支持向量机通俗导论(理解SVM的三层境界)》。此外,这里有个视频也是关于SVM的推导:《纯白板手推SVM》


2请简要介绍下tensorflow的计算图,深度学习DL框架中


@寒小阳&AntZ:Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个节点都是计算图上的一个Tensor,也就是张量,而节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。如下两图表示:



a=x*y;b=a+z;c=tf.reduce_sum(b);


1



 


3在k-means或kNN,我们常用欧氏距离来计算最近的邻居之间的距离,有时也用曼哈顿距离,请对比下这两种距离的差别。机器学习ML模型中


欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点x=(x1,…,xn)和y=(y1,…,yn)之间的距离为:


欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量量纲)之间的差别等同看待,这一点有时不能满足实际要求。例如,在教育研究中,经常遇到对人的分析和判别,个体的不同属性对于区分个体有着不同的重要性。因此,欧氏距离适用于向量各分量的度量标准统一的情况。


曼哈顿距离,我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈顿距离为:,要注意的是,曼哈顿距离依赖座标系统的转度,而非系统在座标轴上的平移或映射。当坐标轴变动时,点间的距离就会不同。

   通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,这也是曼哈顿距离名称的来源,同时,曼哈顿距离也称为城市街区距离(City Block distance)。


曼哈顿距离和欧式距离一般用途不同,无相互替代性。另,关于各种距离的比较参看《从K近邻算法、距离度量谈到KD树、SIFT+BBF算法》。


 


4CNN的卷积核是单层的还是多层的?深度学习DL模型中

@AntZ:卷积运算的定义和理解可以看下这篇文章《CNN笔记:通俗理解卷积神经网络》,链接:http://blog.csdn.net/v_july_v/article/details/51812459,在CNN中,卷积计算属于离散卷积,本来需要卷积核的权重矩阵旋转180度,但我们并不需要旋转前的权重矩阵形式,故直接用旋转后权重矩阵作为卷积核表达,这样的好处就离散卷积运算变成了矩阵点积运算。

一般而言,深度卷积网络是一层又一层的。层的本质是特征图,存贮输入数据或其中间表示值。一组卷积核则是联系前后两层的网络参数表达体,训练的目标就是每个卷积核的权重参数组。

描述网络模型中某层的厚度,通常用名词通道channel数或者特征图featuremap数。不过人们更习惯把作为数据输入的前层的厚度称之为通道数(比如RGB三色图层称为输入通道数为3),把作为卷积输出的后层的厚度称之为特征图数。

卷积核(filter)一般是3D多层的,除了面积参数,比如3x3之外,还有厚度参数H(2D的视为厚度1).还有一个属性是卷积核的个数N。

卷积核的厚度H,一般等于前层厚度M(输入通道数或featuremap数).特殊情况M>H。

卷积核的个数N,一般等于后层厚度(后层featuremaps数,因为相等所以也用N表示)。


 


5关于LR。机器学习ML模型难


@rickjin:把LR从头到脚都给讲一遍。建模,现场数学推导,每种解法的原理,正则化,LR和maxent模型啥关系,lr为啥比线性回归好。有不少会背答案的人,问逻辑细节就糊涂了。原理都会?那就问工程,并行化怎么做,有几种并行化方式,读过哪些开源的实现。还会,那就准备收了吧,顺便逼问LR模型发展历史。


顺便提一下,LR也可以作为多标签分类(multilabelclassification)的损失函数,又叫binarycrossentopy。


另外,这两篇文章可以做下参考:LogisticRegression的前世今生(理论篇)、机器学习算法与Python实践之(七)逻辑回归(LogisticRegression)。


 


6overfitting怎么解决?机器学习ML基础中

dropout、regularization、batchnormalization


overfitting就是过拟合, 其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的lossvalue渐渐减小,但是在验证集上的lossvalue却反而渐渐增大——因为训练出来的网络过拟合了训练集, 对训练集外的数据却不work, 这称之为泛化(generalization)性能不好。泛化性能是训练的效果评价中的首要目标,没有良好的泛化,就等于南辕北辙, 一切都是无用功。

实际训练中, 降低过拟合的办法一般如下:正则化(Regularization)

L2正则化:目标函数中增加所有权重w参数的平方之和, 逼迫所有w尽可能趋向零但不为零. 因为过拟合的时候, 拟合函数需要顾忌每一个点, 最终形成的拟合函数波动很大, 在某些很小的区间里, 函数值的变化很剧烈, 也就是某些w非常大. 为此, L2正则化的加入就惩罚了权重变大的趋势.

L1正则化:目标函数中增加所有权重w参数的绝对值之和, 逼迫更多w为零(也就是变稀疏. L2因为其导数也趋0, 奔向零的速度不如L1给力了). 大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的特征权重反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些无用的特征,也就是把这些特征对应的权重置为0。随机失活(dropout)

在训练的运行的时候,让神经元以超参数p的概率被激活(也就是1-p的概率被设置为0), 每个w因此随机参与, 使得任意w都不是不可或缺的, 效果类似于数量巨大的模型集成。逐层归一化(batch normalization)

这个方法给每层的输出都做一次归一化(网络上相当于加了一个线性变换层), 使得下一层的输入接近高斯分布. 这个方法相当于下一层的w训练时避免了其输入以偏概全, 因而泛化效果非常好. 提前终止(early stopping)

理论上可能的局部极小值数量随参数的数量呈指数增长, 到达某个精确的最小值是不良泛化的一个来源. 实践表明, 追求细粒度极小值具有较高的泛化误差。这是直观的,因为我们通常会希望我们的误差函数是平滑的, 精确的最小值处所见相应误差曲面具有高度不规则性, 而我们的泛化要求减少精确度去获得平滑最小值, 所以很多训练方法都提出了提前终止策略. 典型的方法是根据交叉叉验证提前终止: 若每次训练前, 将训练数据划分为若干份, 取一份为测试集, 其他为训练集, 每次训练完立即拿此次选中的测试集自测. 因为每份都有一次机会当测试集, 所以此方法称之为交叉验证. 交叉验证的错误率最小时可以认为泛化性能最好, 这时候训练错误率虽然还在继续下降, 但也得终止继续训练了.  


 


7LR和SVM的联系与区别。机器学习ML模型中

@朝阳在望,联系: 

1、LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题) 

2、两个方法都可以增加不同的正则化项,如l1、l2等等。所以在很多实验中,两种算法的结果是很接近的。 

区别: 

1、LR是参数模型,SVM是非参数模型。 

2、从目标函数来看,区别在于逻辑回归采用的是logisticalloss,SVM采用的是hingeloss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。 

3、SVM的处理方法是只考虑supportvectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。 

4、逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。 

5、logic能做的svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。

来源:http://blog.csdn.net/timcompp/article/details/62237986


 


8说说你知道的核函数。机器学习ML基础易


通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:


多项式核,显然刚才我们举的例子是这里多项式核的一个特例(R=1,d=2)。虽然比较麻烦,而且没有必要,不过这个核所对应的映射实际上是可以写出来的,该空间的维度是,其中  是原始空间的维度。

    高斯核,这个核就是最开始提到过的会将原始空间映射为无穷维空间的那个家伙。不过,如果选得很大的话,高次特征上的权重实际上衰减得非常快,所以实际上(数值上近似一下)相当于一个低维的子空间;反过来,如果选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题。不过,总的来说,通过调控参数,高斯核实际上具有相当高的灵活性,也是使用最广泛的核函数之一。下图所示的例子便是把低维线性不可分的数据通过高斯核函数映射到了高维空间:

    线性核,这实际上就是原始空间中的内积。这个核存在的主要目的是使得“映射后空间中的问题”和“映射前空间中的问题”两者在形式上统一起来了(意思是说,咱们有的时候,写代码,或写公式的时候,只要写个模板或通用表达式,然后再代入不同的核,便可以了,于此,便在形式上统一了起来,不用再分别写一个线性的,和一个非线性的)。

9LR与线性回归的区别与联系。机器学习 ML模型中等

@AntZ:LR工业上一般指LogisticRegression(逻辑回归)而不是LinearRegression(线性回归).LR在线性回归的实数范围输出值上施加sigmoid函数将值收敛到0~1范围,其目标函数也因此从差平方和函数变为对数损失函数,以提供最优化所需导数(sigmoid函数是softmax函数的二元特例,其导数均为函数值的f*(1-f)形式)。请注意,LR往往是解决二元0/1分类问题的,只是它和线性回归耦合太紧,不自觉也冠了个回归的名字(马甲无处不在).若要求多元分类,就要把sigmoid换成大名鼎鼎的softmax了。

@nishizhen:个人感觉逻辑回归和线性回归首先都是广义的线性回归,

其次经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数,

另外线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。

@乖乖癞皮狗:逻辑回归的模型本质上是一个线性回归模型,逻辑回归都是以线性回归为理论支持的。但线性回归模型无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题。


10请问(决策树、RandomForest、Booting、Adaboot)GBDT和XGBoost的区别是什么?机器学习ML模型难

@AntZ

集成学习的集成对象是学习器.Bagging和Boosting属于集成学习的两类方法.Bagging方法有放回地采样同数量样本训练每个学习器,然后再一起集成(简单投票);Boosting方法使用全部样本(可调权重)依次训练每个学习器,迭代集成(平滑加权).

决策树属于最常用的学习器,其学习过程是从根建立树,也就是如何决策叶子节点分裂.ID3/C4.5决策树用信息熵计算最优分裂,CART决策树用基尼指数计算最优分裂,xgboost决策树使用二阶泰勒展开系数计算最优分裂.

下面所提到的学习器都是决策树:

Bagging方法: 

  学习器间不存在强依赖关系,学习器可并行训练生成,集成方式一般为投票;

  RandomForest属于Bagging的代表,放回抽样,每个学习器随机选择部分特征去优化;

Boosting方法: 

  学习器之间存在强依赖关系、必须串行生成,集成方式为加权和;

  Adaboost属于Boosting,采用指数损失函数替代原本分类任务的0/1损失函数;

  GBDT属于Boosting的优秀代表,对函数残差近似值进行梯度下降,用CART回归树做学习器,集成为回归模型;

  xgboost属于Boosting的集大成者,对函数残差近似值进行梯度下降,迭代时利用了二阶梯度信息,集成模型可分类也可回归.由于它可在特征粒度上并行计算,结构风险和工程实现都做了很多优化,泛化,性能和扩展性都比GBDT要好。

关于决策树,这里有篇《决策树算法》。而随机森林RandomForest是一个包含多个决策树的分类器。至于AdaBoost,则是英文”AdaptiveBoosting”(自适应增强)的缩写,关于AdaBoost可以看下这篇文章《Adaboost算法的原理与推导》。GBDT(GradientBoostingDecisionTree),即梯度上升决策树算法,相当于融合决策树和梯度上升boosting算法。

@XijunLI:xgboost类似于gbdt的优化版,不论是精度还是效率上都有了提升。与gbdt相比,具体的优点有:

  1. 损失函数是用泰勒展式二项逼近,而不是像gbdt里的就是一阶导数

  2. 2.对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性

  3. 3.节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的

  4. 更多详见:https://xijunlee.github.io/2017/06/03/集成学习总结/

 


11为什么xgboost要用泰勒展开,优势在哪里?机器学习ML模型难

@AntZ:xgboost使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准.使用泰勒展开取得函数做自变量的二阶导数形式,可以在不选定损失函数具体形式的情况下,仅仅依靠输入数据的值就可以进行叶子分裂优化计算,本质上也就把损失函数的选取和模型算法优化/参数选择分开了.这种去耦合增加了xgboost的适用性,使得它按需选取损失函数,可以用于分类,也可以用于回归。

 


12xgboost如何寻找最优特征?是又放回还是无放回的呢?机器学习ML模型难

@AntZ:xgboost在训练的过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据,从而记忆了每个特征对在模型训练时的重要性–从根到叶子中间节点涉及某特征的次数作为该特征重要性排序.

xgboost属于boosting集成学习方法,样本是不放回的,因而每轮计算样本不重复.另一方面,xgboost支持子采样,也就是每轮计算可以不使用全部样本,以减少过拟合.进一步地,xgboost还有列采样,每轮计算按百分比随机采样一部分特征,既提高计算速度又减少过拟合。

 


13谈谈判别式模型和生成式模型?机器学习ML基础易

判别方法:由数据直接学习决策函数Y=f(X),或者由条件分布概率P(Y|X)作为预测模型,即判别模型。

生成方法:由数据学习联合概率密度分布函数P(X,Y),然后求出条件概率分布P(Y|X)作为预测的模型,即生成模型。

由生成模型可以得到判别模型,但由判别模型得不到生成模型。

常见的判别模型有:K近邻、SVM、决策树、感知机、线性判别分析(LDA)、线性回归、传统的神经网络、逻辑斯蒂回归、boosting、条件随机场

常见的生成模型有:朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型(LDA)、限制玻尔兹曼机L1和L2的区别。机器学习ML基础易

L1范数(L1norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lassoregularization)。 

比如向量A=[1,-1,3],那么A的L1范数为|1|+|-1|+|3|.

简单总结一下就是: 

L1范数:为x向量各个元素绝对值之和。 

L2范数:为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或者Frobenius范数 

Lp范数:为x向量各个元素绝对值p次方和的1/p次方.

在支持向量机学习过程中,L1范数实际是一种对于成本函数求解最优的过程,因此,L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征。 

L1范数可以使权值稀疏,方便特征提取。 

L2范数可以防止过拟合,提升模型的泛化能力。

@AntZ:L1和L2的差别,为什么一个让绝对值最小,一个让平方最小,会有那么大的差别呢?看导数一个是1一个是w便知,在靠进零附近,L1以匀速下降到零,而L2则完全停下来了.这说明L1是将不重要的特征(或者说,重要性不在一个数量级上)尽快剔除,L2则是把特征贡献尽量压缩最小但不至于为零.两者一起作用,就是把重要性在一个数量级(重要性最高的)的那些特征一起平等共事(简言之,不养闲人也不要超人)。

 


14L1和L2正则先验分别服从什么分布。机器学习ML基础易

@齐同学:面试中遇到的,L1和L2正则先验分别服从什么分布,L1是拉普拉斯分布,L2是高斯分布。

@AntZ:先验就是优化的起跑线,有先验的好处就是可以在较小的数据集中有良好的泛化性能,当然这是在先验分布是接近真实分布的情况下得到的了,从信息论的角度看,向系统加入了正确先验这个信息,肯定会提高系统的性能。

对参数引入高斯正态先验分布相当于L2正则化,这个大家都熟悉:

对参数引入拉普拉斯先验等价于L1正则化,如下图:

从上面两图可以看出,L2先验趋向零周围,L1先验趋向零本身。


 


15CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?深度学习DL应用难

@许韩,来源:https://zhuanlan.zhihu.com/p/25005808

Deep Learning -Yann LeCun, Yoshua Bengio & Geoffrey Hinton

Learn TensorFlow and deep learning, without a Ph.D.

The Unreasonable Effectiveness of Deep Learning -LeCun 16 NIPS Keynote

以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。

CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。

局部连接使网络可以提取数据的局部特征;权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图:

上图中,如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。

另,关于CNN,这里有篇文章《 CNN笔记:通俗理解卷积神经网络》。


 


 


16说一下Adaboost,权值更新公式。当弱分类器是Gm时,每个样本的的权重是w1,w2…,请写出最终的决策公式。机器学习ML模型难


给定一个训练数据集T={(x1,y1),(x2,y2)…(xN,yN)},其中实例,而实例空间,yi属于标记集合{-1,+1},Adaboost的目的就是从训练数据中学习一系列弱分类器或基本分类器,然后将这些弱分类器组合成一个强分类器。


  Adaboost的算法流程如下:


步骤1. 首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N。







步骤2. 进行多轮迭代,用m=1,2,…,M表示迭代的第多少轮

a. 使用具有权值分布Dm的训练数据集学习,得到基本分类器(选取让误差率最低的阈值来设计基本分类器):








b. 计算Gm(x)在训练数据集上的分类误差率




由上述式子可知,Gm(x)在训练数据集上的误差率em就是被Gm(x)误分类样本的权值之和。


c.计算Gm(x)的系数,am表示Gm(x)在最终分类器中的重要程度(目的:得到基本分类器在最终分类器中所占的权重):




由上述式子可知,em<=1/2时,am>=0,且am随着em的减小而增大,意味着分类误差率越小的基本分类器在最终分类器中的作用越大。


d.更新训练数据集的权值分布(目的:得到样本的新的权值分布),用于下一轮迭代






使得被基本分类器Gm(x)误分类样本的权值增大,而被正确分类样本的权值减小。就这样,通过这样的方式,AdaBoost方法能“重点关注”或“聚焦于”那些较难分的样本上。


  其中,Zm是规范化因子,使得Dm+1成为一个概率分布:








步骤3. 组合各个弱分类器





从而得到最终分类器,如下:





更多请查看此文:《Adaboost算法的原理与推导》。




 


17LSTM结构推导,为什么比RNN好?深度学习DL模型难

推导forgetgate,inputgate,cellstate,hiddeninformation等的变化;因为LSTM有进有出且当前的cellinformaton是通过inputgate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸


经常在网上搜索东西的朋友知道,当你不小心输入一个不存在的单词时,搜索引擎会提示你是不是要输入某一个正确的单词,比如当你在Google中输入“Julw”时,系统会猜测你的意图:是不是要搜索“July”,如下图所示:






  这叫做拼写检查。根据谷歌一员工写的文章显示,Google的拼写检查基于贝叶斯方法。请说说的你的理解,具体Google是怎么利用贝叶斯方法,实现”拼写检查”的功能。机器学习ML应用难


  用户输入一个单词时,可能拼写正确,也可能拼写错误。如果把拼写正确的情况记做c(代表correct),拼写错误的情况记做w(代表wrong),那么”拼写检查”要做的事情就是:在发生w的情况下,试图推断出c。换言之:已知w,然后在若干个备选方案中,找出可能性最大的那个c,也就是求的最大值。

  而根据贝叶斯定理,有:





  





  由于对于所有备选的c来说,对应的都是同一个w,所以它们的P(w)是相同的,因此我们只要最大化







 









  即可。其中:


P(c)表示某个正确的词的出现”概率”,它可以用”频率”代替。如果我们有一个足够大的文本库,那么这个文本库中每个单词的出现频率,就相当于它的发生概率。某个词的出现频率越高,P(c)就越大。比如在你输入一个错误的词“Julw”时,系统更倾向于去猜测你可能想输入的词是“July”,而不是“Jult”,因为“July”更常见。

    P(w|c)表示在试图拼写c的情况下,出现拼写错误w的概率。为了简化问题,假定两个单词在字形上越接近,就有越可能拼错,P(w|c)就越大。举例来说,相差一个字母的拼法,就比相差两个字母的拼法,发生概率更高。你想拼写单词July,那么错误拼成Julw(相差一个字母)的可能性,就比拼成Jullw高(相差两个字母)。值得一提的是,一般把这种问题称为“编辑距离”,参见博客中的这篇文章。

  所以,我们比较所有拼写相近的词在文本库中的出现频率,再从中挑出出现频率最高的一个,即是用户最想输入的那个词。具体的计算过程及此方法的缺陷请参见这里。


 


18为什么朴素贝叶斯如此“朴素”?机器学习ML模型易

因为它假定所有的特征在数据集中的作用是同样重要和独立的。正如我们所知,这个假设在现实世界中是很不真实的,因此,说朴素贝叶斯真的很“朴素”。

@AntZ:朴素贝叶斯模型(NaiveBayesianModel)的朴素(Naive)的含义是”很简单很天真”地假设样本特征彼此独立.这个假设现实中基本上不存在,但特征相关性很小的实际情况还是很多的,所以这个模型仍然能够工作得很好。


 


19请大致对比下plsa和LDA的区别。机器学习ML模型中等


pLSA中,主题分布和词分布确定后,以一定的概率(、)分别选取具体的主题和词项,生成好文档。而后根据生成好的文档反推其主题分布、词分布时,最终用EM算法(极大似然估计思想)求解出了两个未知但固定的参数的值:(由转换而来)和(由转换而来)。

    文档d产生主题z的概率,主题z产生单词w的概率都是两个固定的值。

        举个文档d产生主题z的例子。给定一篇文档d,主题分布是一定的,比如{P(zi|d),i=1,2,3}可能就是{0.4,0.5,0.1},表示z1、z2、z3,这3个主题被文档d选中的概率都是个固定的值:P(z1|d)=0.4、P(z2|d)=0.5、P(z3|d)=0.1,如下图所示(图截取自沈博PPT上):

        

    







但在贝叶斯框架下的LDA中,我们不再认为主题分布(各个主题在文档中出现的概率分布)和词分布(各个词语在某个主题下出现的概率分布)是唯一确定的(而是随机变量),而是有很多种可能。但一篇文档总得对应一个主题分布和一个词分布吧,怎么办呢?LDA为它们弄了两个Dirichlet先验参数,这个Dirichlet先验为某篇文档随机抽取出某个主题分布和词分布。


    文档d产生主题z(准确的说,其实是Dirichlet先验为文档d生成主题分布Θ,然后根据主题分布Θ产生主题z)的概率,主题z产生单词w的概率都不再是某两个确定的值,而是随机变量。

        还是再次举下文档d具体产生主题z的例子。给定一篇文档d,现在有多个主题z1、z2、z3,它们的主题分布{P(zi|d),i=1,2,3}可能是{0.4,0.5,0.1},也可能是{0.2,0.2,0.6},即这些主题被d选中的概率都不再认为是确定的值,可能是P(z1|d)=0.4、P(z2|d)=0.5、P(z3|d)=0.1,也有可能是P(z1|d)=0.2、P(z2|d)=0.2、P(z3|d)=0.6等等,而主题分布到底是哪个取值集合我们不确定(为什么?这就是贝叶斯派的核心思想,把未知参数当作是随机变量,不再认为是某一个确定的值),但其先验分布是dirichlet分布,所以可以从无穷多个主题分布中按照dirichlet先验随机抽取出某个主题分布出来。如下图所示(图截取自沈博PPT上):

        

    







  换言之,LDA在pLSA的基础上给这两参数(、)加了两个先验分布的参数(贝叶斯化):一个主题分布的先验分布Dirichlet分布,和一个词语分布的先验分布Dirichlet分布。


  综上,LDA真的只是pLSA的贝叶斯版本,文档生成后,两者都要根据文档去推断其主题分布和词语分布,只是用的参数推断方法不同,在pLSA中用极大似然估计的思想去推断两未知的固定参数,而LDA则把这两参数弄成随机变量,且加入dirichlet先验。


更多请参见:《通俗理解LDA主题模型》。


 


20请简要说说EM算法。机器学习ML模型中等


@tornadomeet,本题解析来源:http://www.cnblogs.com/tornadomeet/p/3395593.html

有时候因为样本的产生和隐含变量有关(隐含变量是不能观察的),而求模型的参数时一般采用最大似然估计,由于含有了隐含变量,所以对似然函数参数求导是求不出来的,这时可以采用EM算法来求模型的参数的(对应模型参数个数可能有多个),EM算法一般分为2步:


  E步:选取一组参数,求出在该参数下隐含变量的条件概率值;


  M步:结合E步求出的隐含变量条件概率,求出似然函数下界函数(本质上是某个期望函数)的最大值。


  重复上面2步直至收敛。


  公式如下所示:


   


  M步公式中下界函数的推导过程:


   


  EM算法一个常见的例子就是GMM模型,每个样本都有可能由k个高斯产生,只不过由每个高斯产生的概率不同而已,因此每个样本都有对应的高斯分布(k个中的某一个),此时的隐含变量就是每个样本对应的某个高斯分布。


  GMM的E步公式如下(计算每个样本对应每个高斯的概率):


   


  更具体的计算公式为:


  


  M步公式如下(计算每个高斯的比重,均值,方差这3个参数):


   


 


21KNN中的K如何选取的?机器学习ML模型易

关于什么是KNN,可以查看此文:《从K近邻算法、距离度量谈到KD树、SIFT+BBF算法》。KNN中的K值选取对K近邻算法的结果会产生重大影响。如李航博士的一书「统计学习方法」上所说:


如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

    如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。

    K=N,则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的累,模型过于简单,忽略了训练实例中大量有用信息。

  在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。


 


22防止过拟合的方法。机器学习ML基础易

  过拟合的原因是算法的学习能力过强;一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。 

  处理方法:


早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练

    数据集扩增:原有数据增加、原有数据加随机噪声、重采样

    正则化

    交叉验证

    特征选择/特征降维

    创建一个验证集是最基本的防止过拟合的方法。我们最终训练得到的模型目标是要在验证集上面有好的表现,而不训练集。

    正则化可以限制模型的复杂度。

 


23机器学习中,为何要经常对数据做归一化。机器学习ML基础中等


@zhanlijun,本题解析来源:http://www.cnblogs.com/LBSer/p/4440590.html


  机器学习模型被互联网行业广泛应用,如排序(参见:排序学习实践)、推荐、反作弊、定位(参见:基于朴素贝叶斯的定位算法)等。一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释:1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度。下面再简单扩展解释下这两点。


1归一化为什么能提高梯度下降法求解最优解的速度?


   斯坦福机器学习视频做了很好的解释:https://class.coursera.org/ml-003/lecture/21


   如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;


   而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。


   因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。




2归一化有可能提高精度


   一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。


3归一化的类型


1)线性归一化


   这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。


2)标准差标准化


  经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:


  其中μ为所有样本数据的均值,σ为所有样本数据的标准差。


3)非线性归一化


   经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V,2)还是log(V,10)等。


谈谈深度学习中的归一化问题。深度学习DL基础易

详情参见此视频:《深度学习中的归一化》。


 


24哪些机器学习算法不需要做归一化处理?机器学习ML基础易

概率模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、rf。而像adaboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化。

@管博士:我理解归一化和标准化主要是为了使计算更方便比如两个变量的量纲不同可能一个的数值远大于另一个那么他们同时作为变量的时候可能会造成数值计算的问题,比如说求矩阵的逆可能很不精确或者梯度下降法的收敛比较困难,还有如果需要计算欧式距离的话可能量纲也需要调整所以我估计lr和knn保准话一下应该有好处。至于其他的算法我也觉得如果变量量纲差距很大的话先标准化一下会有好处。

@寒小阳:一般我习惯说树形模型,这里说的概率模型可能是差不多的意思。


 


25对于树形结构为什么不需要归一化?机器学习ML基础易

答:数值缩放,不影响分裂点位置。因为第一步都是按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。对于线性模型,比如说LR,我有两个特征,一个是(0,1)的,一个是(0,10000)的,这样运用梯度下降时候,损失等高线是一个椭圆的形状,这样我想迭代到最优点,就需要很多次迭代,但是如果进行了归一化,那么等高线就是圆形的,那么SGD就会往原点迭代,需要的迭代次数较少。

另外,注意树模型是不能进行梯度下降的,因为树模型是阶跃的,阶跃点是不可导的,并且求导没意义,所以树模型(回归树)寻找最优点事通过寻找最优分裂点完成的。


 


26数据归一化(或者标准化,注意归一化和标准化不同)的原因。机器学习ML基础易

@我愛大泡泡,来源:http://blog.csdn.net/woaidapaopao/article/details/77806273

  要强调:能不归一化最好不归一化,之所以进行数据归一化是因为各维度的量纲不相同。而且需要看情况进行归一化。


有些模型在各维度进行了不均匀的伸缩后,最优解与原来不等价(如SVM)需要归一化。

    有些模型伸缩有与原来等价,如:LR则不用归一化,但是实际中往往通过迭代求解模型参数,如果目标函数太扁(想象一下很扁的高斯模型)迭代算法会发生不收敛的情况,所以最坏进行数据归一化。

补充:其实本质是由于loss函数不同造成的,SVM用了欧拉距离,如果一个特征很大就会把其他的维度dominated。而LR可以通过权重调整使得损失函数不变。


27请简要说说一个完整机器学习项目的流程。机器学习ML应用中

@寒小阳、龙心尘

1抽象成数学问题

明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。

这里的抽象成数学问题,指的我们明确我们可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。

2获取数据

数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。

数据要有代表性,否则必然会过拟合。

而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。

而且还要对数据的量级有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。如果数据量实在太大,那就要考虑分布式了。

3特征预处理与特征选择

良好的数据要能够提取出良好的特征才能真正发挥效力。

特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。

筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

4训练模型与调优

直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。

5模型诊断

如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。

过拟合、欠拟合判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。

误差分析也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题……

诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试,进而达到最优状态。

6模型融合

一般来说,模型融合后都能使得效果有一定提升。而且效果很好。

工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。

7上线运行

这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。

故,基于此,七月在线每一期ML算法班都特此增加特征工程、模型调优等相关课。比如,这里有个公开课视频《特征处理与特征选择》。


 


28逻辑斯特回归为什么要对特征进行离散化。机器学习ML模型中等

@严林,本题解析来源:https://www.zhihu.com/question/31989952


在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:


0.离散特征的增加和减少都很容易,易于模型的快速迭代;


  1. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

2.离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;


3.逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;


4.离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;


5.特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;


6.特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。


李沐曾经说过:模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型”同“少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。就看是喜欢折腾特征还是折腾模型了。通常来说,前者容易,而且可以n个人一起并行做,有成功经验;后者目前看很赞,能走多远还须拭目以待。


 


29new和malloc的区别。编程开发C/C++易

@Sommer_Xia,来源:http://blog.csdn.net/shymi1991/article/details/39432775

  1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

  2. 2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

  3. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

  4. 4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存

 


30hash冲突及解决办法。数据结构/算法中等

@Sommer_Xia,来源:http://blog.csdn.net/shymi1991/article/details/39432775

关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突。解决办法:

1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。

2)再哈希法:同时构造多个不同的哈希函数。

3)链地址法:将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

4)建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。


 


31下列哪个不属于CRF模型对于HMM和MEMM模型的优势(B )机器学习ML模型中等

 A.特征灵活 B.速度快 C.可容纳较多上下文信息 D.全局最优

首先,CRF,HMM(隐马模型),MEMM(最大熵隐马模型)都常用来做序列标注的建模.

隐马模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择

最大熵隐马模型则解决了隐马的问题,可以任意选择特征,但由于其在每一节点都要进行归一化,所以只能找到局部的最优值,同时也带来了标记偏见的问题,即凡是训练语料中未出现的情况全都忽略掉

条件随机场则很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行全局归一化,因此可以求得全局的最优值。

此外《机器学习工程师第八期》里有讲概率图模型。


 


32什么是熵。机器学习ML基础易


  从名字上来看,熵给人一种很玄乎,不知道是啥的感觉。其实,熵的定义很简单,即用来表示随机变量的不确定性。之所以给人玄乎的感觉,大概是因为为何要取这样的名字,以及怎么用。


   熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量。


熵的引入


  事实上,熵的英文原文为entropy,最初由德国物理学家鲁道夫·克劳修斯提出,其表达式为:







 






 







  它表示一个系系统在不受外部干扰时,其内部最稳定的状态。后来一中国学者翻译entropy时,考虑到entropy是能量Q跟温度T的商,且跟火有关,便把entropy形象的翻译成“熵”。


  我们知道,任何粒子的常态都是随机运动,也就是”无序运动”,如果让粒子呈现”有序化”,必须耗费能量。所以,温度(热能)可以被看作”有序化”的一种度量,而”熵”可以看作是”无序化”的度量。


  如果没有外部能量输入,封闭系统趋向越来越混乱(熵越来越大)。比如,如果房间无人打扫,不可能越来越干净(有序化),只可能越来越乱(无序化)。而要让一个系统变得更有序,必须有外部能量的输入。


   1948年,香农ClaudeE.Shannon引入信息(熵),将其定义为离散随机事件的出现概率。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。所以说,信息熵可以被认为是系统有序化程度的一个度量。


更多请查看《最大熵模型中的数学推导》。


 


33熵、联合熵、条件熵、相对熵、互信息的定义。机器学习ML基础中等


为了更好的理解,需要了解的概率必备知识有:


大写字母X表示随机变量,小写字母x表示随机变量X的某个具体的取值;

    P(X)表示随机变量X的概率分布,P(X,Y)表示随机变量X、Y的联合概率分布,P(Y|X)表示已知随机变量X的情况下随机变量Y的条件概率分布;

    p(X=x)表示随机变量X取某个具体值的概率,简记为p(x);

    p(X=x,Y=y)表示联合概率,简记为p(x,y),p(Y=y|X=x)表示条件概率,简记为p(y|x),且有:p(x,y)=p(x)*p(y|x)。

熵:如果一个随机变量X的可能取值为X={x1,x2,…,xk},其概率分布为P(X=xi)=pi(i=1,2,…,n),则随机变量X的熵定义为:





   





  把最前面的负号放到最后,便成了:










  上面两个熵的公式,无论用哪个都行,而且两者等价,一个意思(这两个公式在下文中都会用到)。


 


   联合熵:两个随机变量X,Y的联合分布,可以形成联合熵JointEntropy,用H(X,Y)表示。

   条件熵:在随机变量X发生的前提下,随机变量Y发生所新带来的熵定义为Y的条件熵,用H(Y|X)表示,用来衡量在已知随机变量X的条件下随机变量Y的不确定性。


  且有此式子成立:H(Y|X)= H(X,Y)–H(X),整个式子表示(X,Y)发生所包含的熵减去X单独发生包含的熵。至于怎么得来的请看推导:






  简单解释下上面的推导过程。整个式子共6行,其中


 


第二行推到第三行的依据是边缘分布p(x)等于联合分布p(x,y)的和;

    第三行推到第四行的依据是把公因子logp(x)乘进去,然后把x,y写在一起;

    第四行推到第五行的依据是:因为两个sigma都有p(x,y),故提取公因子p(x,y)放到外边,然后把里边的-(log p(x,y) - log p(x))写成-log (p(x,y)/p(x) );

    第五行推到第六行的依据是:p(x,y)=p(x)*p(y|x),故p(x,y)/p(x)= p(y|x)。

   相对熵:又称互熵,交叉熵,鉴别信息,Kullback熵,Kullback-Leible散度等。设p(x)、q(x)是X中取值的两个概率分布,则p对q的相对熵是:










  在一定程度上,相对熵可以度量两个随机变量的“距离”,且有D(p||q)≠D(q||p)。另外,值得一提的是,D(p||q)是必然大于等于0的。


   互信息:两个随机变量X,Y的互信息定义为X,Y的联合分布和各自独立分布乘积的相对熵,用I(X,Y)表示:











 



  且有I(X,Y)=D(P(X,Y)||P(X)P(Y))。下面,咱们来计算下H(Y)-I(X,Y)的结果,如下:


 










  通过上面的计算过程,我们发现竟然有H(Y)-I(X,Y)= H(Y|X)。故通过条件熵的定义,有:H(Y|X)=H(X,Y)-H(X),而根据互信息定义展开得到H(Y|X)=H(Y)-I(X,Y),把前者跟后者结合起来,便有I(X,Y)=H(X)+H(Y)-H(X,Y),此结论被多数文献作为互信息的定义。更多请查看《最大熵模型中的数学推导》。


 


34什么是最大熵。机器学习ML基础易


熵是随机变量不确定性的度量,不确定性越大,熵值越大;若随机变量退化成定值,熵为0。如果没有外界干扰,随机变量总是趋向于无序,在经过足够时间的稳定演化,它应该能够达到的最大程度的熵。 


  为了准确的估计随机变量的状态,我们一般习惯性最大化熵,认为在所有可能的概率模型(分布)的集合中,熵最大的模型是最好的模型。换言之,在已知部分知识的前提下,关于未知分布最合理的推断就是符合已知知识最不确定或最随机的推断,其原则是承认已知事物(知识),且对未知事物不做任何假设,没有任何偏见。


  例如,投掷一个骰子,如果问”每个面朝上的概率分别是多少”,你会说是等概率,即各点出现的概率均为1/6。因为对这个”一无所知”的色子,什么都不确定,而假定它每一个朝上概率均等则是最合理的做法。从投资的角度来看,这是风险最小的做法,而从信息论的角度讲,就是保留了最大的不确定性,也就是说让熵达到最大。


3.1无偏原则


  下面再举个大多数有关最大熵模型的文章中都喜欢举的一个例子。


  例如,一篇文章中出现了“学习”这个词,那这个词是主语、谓语、还是宾语呢?换言之,已知“学习”可能是动词,也可能是名词,故“学习”可以被标为主语、谓语、宾语、定语等等。


令x1表示“学习”被标为名词,x2表示“学习”被标为动词。

    令y1表示“学习”被标为主语,y2表示被标为谓语,y3表示宾语,y4表示定语。

  且这些概率值加起来的和必为1,即 ,,则根据无偏原则,认为这个分布中取各个值的概率是相等的,故得到:












  因为没有任何的先验知识,所以这种判断是合理的。如果有了一定的先验知识呢?


  即进一步,若已知:“学习”被标为定语的可能性很小,只有0.05,即,剩下的依然根据无偏原则,可得:












  再进一步,当“学习”被标作名词x1的时候,它被标作谓语y2的概率为0.95,即,此时仍然需要坚持无偏见原则,使得概率分布尽量平均。但怎么样才能得到尽量无偏见的分布?


  实践经验和理论计算都告诉我们,在完全无约束状态下,均匀分布等价于熵最大(有约束的情况下,不一定是概率相等的均匀分布。比如,给定均值和方差,熵最大的分布就变成了正态分布 )。


  于是,问题便转化为了:计算X和Y的分布,使得H(Y|X)达到最大值,并且满足下述条件:












 


  因此,也就引出了最大熵模型的本质,它要解决的问题就是已知X,计算Y的概率,且尽可能让Y的概率最大(实践中,X可能是某单词的上下文信息,Y是该单词翻译成me,I,us、we的各自概率),从而根据已有信息,尽可能最准确的推测未知信息,这就是最大熵模型所要解决的问题。


  相当于已知X,计算Y的最大可能的概率,转换成公式,便是要最大化下述式子H(Y|X):







 



  且满足以下4个约束条件:



 













简单说下有监督学习和无监督学习的区别。机器学习ML基础易

有监督学习:对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。(LR,SVM,BP,RF,GBDT)

无监督学习:对未标记的样本进行训练学习,比发现这些样本中的结构知识。(KMeans,DL)


 


35了解正则化么。机器学习ML基础易

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

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


 


36协方差和相关性有什么区别?机器学习ML基础易

相关性是协方差的标准化格式。协方差本身很难做比较。例如:如果我们计算工资($)和年龄(岁)的协方差,因为这两个变量有不同的度量,所以我们会得到不能做比较的不同的协方差。

为了解决这个问题,我们计算相关性来得到一个介于-1和1之间的值,就可以忽略它们各自不同的度量。


 


37线性分类器与非线性分类器的区别以及优劣。机器学习ML基础易

@伟祺,线性和非线性是针对,模型参数和输入特征来讲的;比如输入x,模型y=ax+ax^2那么就是非线性模型,如果输入是x和X^2则模型是线性的。

线性分类器可解释性好,计算复杂度较低,不足之处是模型的拟合效果相对弱些。

非线性分类器效果拟合能力较强,不足之处是数据量不足容易过拟合、计算复杂度高、可解释性不好。

常见的线性分类器有:LR,贝叶斯分类,单层感知机、线性回归

常见的非线性分类器:决策树、RF、GBDT、多层感知机

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


 


38数据的逻辑存储结构(如数组,队列,树等)对于软件开发具有十分重要的影响,试对你所了解的各种存储结构从运行速度、存储效率和适用场合等方面进行简要地分析。数据结构/算法中等


 

            运行速度

            存储效率

            适用场合

             

        数组

            快

            高

            比较适合进行查找操作,还有像类似于矩阵等的操作

             

        链表

            较快

            较高

            比较适合增删改频繁操作,动态的分配内存

             

        队列

            较快

            较高

            比较适合进行任务类等的调度

             

        栈

            一般

            较高

            比较适合递归类程序的改写

             

        二叉树(树)

            较快

            一般

            一切具有层次关系的问题都可用树来描述

             

        图

            一般

            一般

            除了像最小生成树、最短路径、拓扑排序等经典用途。还被用于像神经网络等人工智能领域等等。

             

         

             

             

             

             

        39什么是分布式数据库?计算机基础数据库易

分布式数据库系统是在集中式数据库系统成熟技术的基础上发展起来的,但不是简单地把集中式数据库分散地实现,它具有自己的性质和特征。集中式数据库系统的许多概念和技术,如数据独立性、数据共享和减少冗余度、并发控制、完整性、安全性和恢复等在分布式数据库系统中都有了不同的、更加丰富的内容。

具体来说,集群文件系统是指运行在多台计算机之上,之间通过某种方式相互通信从而将集群内所有存储空间资源整合、虚拟化并对外提供文件访问服务的文件系统。其与NTFS、EXT等本地文件系统的目的不同,前者是为了扩展性,后者运行在单机环境,纯粹管理块和文件之间的映射以及文件属性。

集群文件系统分为多类,按照对存储空间的访问方式,可分为共享存储型集群文件系统和分布式集群文件系统,前者是多台计算机识别到同样的存储空间,并相互协调共同管理其上的文件,又被称为共享文件系统;后者则是每台计算机各自提供自己的存储空间,并各自协调管理所有计算机节点中的文件。Veritas的VxFS/VCS,昆腾Stornext,中科蓝鲸BWFS,EMC的MPFS,属于共享存储型集群文件系统。而HDFS、Gluster、Ceph、Swift等互联网常用的大规模集群文件系统无一例外都属于分布式集群文件系统。分布式集群文件系统可扩展性更强,目前已知最大可扩展至10K节点。

按照元数据的管理方式,可分为对称式集群文件系统和非对称式集群文件系统。前者每个节点的角色均等,共同管理文件元数据,节点间通过高速网络进行信息同步和互斥锁等操作,典型代表是Veritas的VCS。而非对称式集群文件系统中,有专门的一个或者多个节点负责管理元数据,其他节点需要频繁与元数据节点通信以获取最新的元数据比如目录列表文件属性等等,后者典型代表比如HDFS、GFS、BWFS、Stornext等。对于集群文件系统,其可以是分布式+对称式、分布式+非对称式、共享式+对称式、共享式+非对称式,两两任意组合。

按照文件访问方式来分类,集群文件系统可分为串行访问式和并行访问式,后者又被俗称为并行文件系统。

串行访问是指客户端只能从集群中的某个节点来访问集群内的文件资源,而并行访问则是指客户端可以直接从集群中任意一个或者多个节点同时收发数据,做到并行数据存取,加快速度。

HDFS、GFS、pNFS等集群文件系统,都支持并行访问,需要安装专用客户端,传统的NFS/CIFS客户端不支持并行访问。


 


40简单说说贝叶斯定理。机器学习ML模型易

在引出贝叶斯定理之前,先学习几个定义:


条件概率(又称后验概率)就是事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”。

比如,在同一个样本空间Ω中的事件或者子集A与B,如果随机从Ω中选出的一个元素属于B,那么这个随机选择的元素还属于A的概率就定义为在B的前提下A的条件概率,所以:P(A|B) = |A∩B|/|B|,接着分子、分母都除以|Ω|得到












联合概率表示两个事件共同发生的概率。A与B的联合概率表示为或者。

    边缘概率(又称先验概率)是某个事件发生的概率。边缘概率是这样得到的:在联合概率中,把最终结果中那些不需要的事件通过合并成它们的全概率,而消去它们(对离散随机变量用求和得全概率,对连续随机变量用积分得全概率),这称为边缘化(marginalization),比如A的边缘概率表示为P(A),B的边缘概率表示为P(B)。 

  接着,考虑一个问题:P(A|B)是在B发生的情况下A发生的可能性。


首先,事件B发生之前,我们对事件A的发生有一个基本的概率判断,称为A的先验概率,用P(A)表示;

    其次,事件B发生之后,我们对事件A的发生概率重新评估,称为A的后验概率,用P(A|B)表示;

    类似的,事件A发生之前,我们对事件B的发生有一个基本的概率判断,称为B的先验概率,用P(B)表示;

    同样,事件A发生之后,我们对事件B的发生概率重新评估,称为B的后验概率,用P(B|A)表示。

  贝叶斯定理便是基于下述贝叶斯公式:





 




















 





  上述公式的推导其实非常简单,就是从条件概率推出。


 


  根据条件概率的定义,在事件B发生的条件下事件A发生的概率是


 




 
















 




 


  同样地,在事件A发生的条件下事件B发生的概率


 




 














  整理与合并上述两个方程式,便可以得到:


 




 














 




 


  接着,上式两边同除以P(B),若P(B)是非零的,我们便可以得到贝叶斯定理的公式表达式:


 



 















  所以,贝叶斯公式可以直接根据条件概率的定义直接推出。即因为P(A,B)=P(A)P(B|A)=P(B)P(A|B),所以P(A|B)=P(A)P(B|A) /P(B)。更多请参见此文:《从贝叶斯方法谈到贝叶斯网络》。


 


41#include和#include“filename.h”有什么区别?计算机基础编译原理易

用#include格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。

用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 


42某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A)  数据挖掘DM模型易

  A.关联规则发现   B.聚类

  C.分类       D.自然语言处理

 


43将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) 数据挖掘DM基础易

  A.频繁模式挖掘  B.分类和预测  C.数据预处理  D.数据流挖掘

 


44下面哪种不属于数据预处理的方法?(D) 数据挖掘DM基础易

A变量代换 B离散化 C聚集D估计遗漏值 

 


45什么是KDD?(A)  数据挖掘DM基础易

 A.数据挖掘与知识发现  B.领域知识发现

 C.文档知识发现   D.动态知识发现

 


46当不知道数据所带标签时,可以使用哪种技术促使带同类标签的数据与带其他标签的数据相分离?(B) 数据挖掘DM模型易

 A.分类   B.聚类   C.关联分析   D.隐马尔可夫链

 


47建立一个模型,通过这个模型根据已知的变量值来预测其他某个变量值属于数据挖掘的哪一类任务?(C) 数据挖掘DM基础易

 A.根据内容检索  B.建模描述

 C.预测建模 D.寻找模式和规则

 


48以下哪种方法不属于特征选择的标准方法:    (D) 数据挖掘DM基础易

A嵌入 B过滤  C 包装 D 抽样   

 


49请用python编写函数find_string,从文本中搜索并打印内容,要求支持通配符星号和问号。PythonPython语言易

例子:


 >>>find_string(‘helloworld’,’wor’)

[‘wor’]

>>>find_string(‘helloworld’,’l*d’)

[‘ld’]

>>>find_string(‘helloworld’,’o.’)

[‘or’]

答案

def find_string(str,pat):

 import re

 return re.findall(pat,str,re.I) 


 


50说下红黑树的五个性质。数据结构树易

红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。

通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

红黑树,作为一棵二叉查找树,满足二叉查找树的一般性质。下面,来了解下二叉查找树的一般性质。

二叉查找树,也称有序二叉树(orderedbinarytree),或已排序二叉树(sortedbinarytree),是指一棵空树或者具有下列性质的二叉树:

若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

任意节点的左、右子树也分别为二叉查找树。

没有键值相等的节点(noduplicatenodes)。

因为一棵由n个结点随机构造的二叉查找树的高度为lgn,所以顺理成章,二叉查找树的一般操作的执行时间为O(lgn)。但二叉查找树若退化成了一棵具有n个结点的线性链后,则这些操作最坏情况运行时间为O(n)。

红黑树虽然本质上是一棵二叉查找树,但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(logn)。

但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:

每个结点要么是红的要么是黑的。 

根结点是黑的。 

每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 

如果一个结点是红的,那么它的两个儿子都是黑的。 

 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 

正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(logn)”这一结论成立的原因。更多请参见此文:《教你初步了解红黑树》。


 


51简单说下sigmoid激活函数。深度学习DL基础易


常用的非线性激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。


   sigmoid的函数表达式如下












 


  其中z是一个线性组合,比如z可以等于:b + * + *。通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1。


  因此,sigmoid函数g(z)的图形表示如下(横轴表示定义域z,纵轴表示值域g(z)):










  也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0。


  压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。


  举个例子,如下图(图引自Stanford机器学习公开课)







 



  z=b + * + *,其中b为偏置项假定取-30,、都取为20










如果 =0  =0,则z=-30,g(z)=1/(1+e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0

    如果 =0  =1,或 =1  =0,则z= b + * + * =-30+20=-10,同样,g(z)的值趋近于0

    如果 =1  =1,则z= b + * + * =-30+20*1+20*1=10,此时,g(z)趋近于1。

  换言之,只有和都取1的时候,g(z)→1,判定为正样本;或取0的时候,g(z)→0,判定为负样本,如此达到分类的目的。

综上,sigmod函数,是逻辑斯蒂回归的压缩函数,它的性质是可以把分隔平面压缩到[0,1]区间一个数(向量),在线性分割平面值为0时候正好对应sigmod值为0.5,大于0对应sigmod值大于0.5、小于0对应sigmod值小于0.5;0.5可以作为分类的阀值;exp的形式最值求解时候比较方便,用相乘形式作为logistic损失函数,使得损失函数是凸函数;不足之处是sigmod函数在y趋于0或1时候有死区,控制不好在bp形式传递loss时候容易造成梯度弥撒。


 


52什么是卷积。深度学习DL基础易


  对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。


  非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。






  OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。




  分解下上图



 对应位置上是数字先相乘后相加  = 



  中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0+0*0+0*0+0*0+0*1+0*1+0*0+0*1+-4*2=-8


 


53什么是CNN的池化pool层。深度学习DL模型易


池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)




  上图所展示的是取区域最大,即上图左边部分中左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6834。很简单不是?


 


54简述下什么是生成对抗网络。深度学习DL扩展中

GAN之所以是对抗的,是因为GAN的内部是竞争关系,一方叫generator,它的主要工作是生成图片,并且尽量使得其看上去是来自于训练样本的。另一方是discriminator,其目标是判断输入图片是否属于真实训练样本。

  更直白的讲,将generator想象成假币制造商,而discriminator是警察。generator目的是尽可能把假币造的跟真的一样,从而能够骗过discriminator,即生成样本并使它看上去好像来自于真实训练样本一样。





如下图中的左右两个场景:


更多请参见此课程:《生成对抗网络班》。


 


55学梵高作画的原理是啥?深度学习DL应用难

这里有篇如何做梵高风格画的实验教程《教你从头到尾利用DL学梵高作画:GTX1070cuda8.0tensorflowgpu版》,至于其原理请看这个视频:NeuralStyle艺术化图片(学梵高作画背后的原理)。


现在有a到z26个元素,编写程序打印a到z中任取3个元素的组合(比如打印abc,dyz等)数理逻辑排列组合中

解析参考:http://blog.csdn.net/lvonve/article/details/53320680


 


56说说梯度下降法。机器学习ML基础中


@LeftNotEasy,本题解析来源:http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html下面是一个典型的机器学习的过程,首先给出一个输入数据,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计,也被称为构建一个模型。


 


   


   我们用X1,X2..Xn去描述feature里面的分量,比如x1=房间的面积,x2=房间的朝向等等,我们可以做出一个估计函数:




   θ在这儿称为参数,在这儿的意思是调整feature中每个分量的影响力,就是到底是房屋的面积更重要还是房屋的地段更重要。为了如果我们令X0=1,就可以用向量的方式来表示了:




   我们程序也需要一个机制去评估我们θ是否比较好,所以说需要对我们做出的h函数进行评估,一般这个进行评估的函数称为损失函数(lossfunction),描述h函数不好的程度,在下面,我们称这个函数为J函数


   在这儿我们可以做出下面的一个损失函数:




  换言之,我们把对x(i)的估计值与真实值y(i)差的平方和作为损失函数,前面乘上的1/2是为了在求导的时候,这个系数就不见了。


   如何调整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(minsquare),是一种完全是数学描述的方法,另外一种就是梯度下降法。


   梯度下降法的算法流程如下:


   1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。


   2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。


   为了描述的更清楚,给出下面的图:


   这是一个表示参数θ与误差函数J(θ)的关系图,红色的部分是表示J(θ)有着比较高的取值,我们需要的是,能够让J(θ)的值尽量的低,也就是达到深蓝色的部分。θ0,θ1表示θ向量的两个维度。


   在上面提到梯度下降法的第一步是给θ给一个初值,假设随机给的初值是在图上的十字点。


   然后我们将θ按照梯度下降的方向进行调整,就会使得J(θ)往更低的方向进行变化,如下图所示,算法的结束将是在θ下降到无法继续下降为止。


    当然,可能梯度下降的最终点并非是全局最小点,即也可能是一个局部最小点,如下图所示:




  上面这张图就是描述的一个局部最小点,这是我们重新选择了一个初始点得到的,看来我们这个算法将会在很大的程度上被初始点的选择影响而陷入局部最小点。


  下面我将用一个例子描述一下梯度减少的过程,对于我们的函数J(θ)求偏导J:


   


   下面是更新的过程,也就是θi会向着梯度最小的方向进行减少。θi表示更新之前的值,-后面的部分表示按梯度方向减少的量,α表示步长,也就是每次按照梯度减少的方向变化多少。


    一个很重要的地方值得注意的是,梯度是有方向的,对于一个向量θ,每一维分量θi都可以求出一个梯度的方向,我们就可以找到一个整体的方向,在变化的时候,我们就朝着下降最多的方向进行变化就可以达到一个最小点,不管它是局部的还是全局的。


   用更简单的数学语言进行描述步骤2)是这样的:


   


 


57梯度下降法找到的一定是下降最快的方向么?机器学习ML基础中

梯度下降法并不是下降最快的方向,它只是目标函数在当前的点的切平面(当然高维问题不能叫平面)上下降最快的方向。在practicalimplementation中,牛顿方向(考虑海森矩阵)才一般被认为是下降最快的方向,可以达到superlinear的收敛速度。梯度下降类的算法的收敛速度一般是linear甚至sublinear的(在某些带复杂约束的问题)。by林小溪(https://www.zhihu.com/question/30672734/answer/139689869)。

一般解释梯度下降,会用下山来举例。假设你现在在山顶处,必须抵达山脚下(也就是山谷最低处)的湖泊。但让人头疼的是,你的双眼被蒙上了无法辨别前进方向。换句话说,你不再能够一眼看出哪条路径是最快的下山路径,如下图(图片来源:http://blog.csdn.net/wemedia/details.html?id=45460):




最好的办法就是走一步算一步,先用脚向四周各个方向都迈出一步,试探一下周围的地势,用脚感觉下哪个方向是下降最大的方向。换言之,每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向(当前最陡峭的位置向下)走一步。就这样,每要走一步都根据上一步所在的位置选择当前最陡峭最快下山的方向走下一步,一步步走下去,一直走到我们感觉已经到了山脚。

当然这样走下去,我们走到的可能并不一定是真正的山脚,而只是走到了某一个局部的山峰低处。换句话说,梯度下降不一定能够找到全局的最优解,也有可能只是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。




 


 


@zbxzc(http://blog.csdn.net/u014568921/article/details/44856915):更进一步,我们来定义输出误差,即对于任意一组权值向量,那它得到的输出和我们预想的输出之间的误差值。定义误差的方法很多,不同的误差计算方法可以得到不同的权值更新法则,这里我们先用这样的定义:

上面公式中D代表了所有的输入实例,或者说是样本,d代表了一个样本实例,od表示感知器的输出,td代表我们预想的输出。

这样,我们的目标就明确了,就是想找到一组权值让这个误差的值最小,显然我们用误差对权值求导将是一个很好的选择,导数的意义是提供了一个方向,沿着这个方向改变权值,将会让总的误差变大,更形象的叫它为梯度。

既然梯度确定了E最陡峭的上升的方向,那么梯度下降的训练法则是:


梯度上升和梯度下降其实是一个思想,上式中权值更新的+号改为-号也就是梯度上升了。梯度上升用来求函数的最大值,梯度下降求最小值。


这样每次移动的方向确定了,但每次移动的距离却不知道。这个可以由步长(也称学习率)来确定,记为α。这样权值调整可表示为:




总之,梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是“最速下降法”。最速下降法越接近目标值,步长越小,前进越慢。梯度下降法的搜索迭代示意图如下图所示:




正因为梯度度下降法在接近最优解的区域收敛速度明显变慢,所以利用梯度下降法求解需要很多次的迭代。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。by@wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040


 


 


58随机梯度下降


普通的梯度下降算法在更新回归系数时要遍历整个数据集,是一种批处理方法,这样训练数据特别忙庞大时,可能出现如下问题:


1)收敛过程可能非常慢;


2)如果误差曲面上有多个局极小值,那么不能保证这个过程会找到全局最小值。


为了解决上面的问题,实际中我们应用的是梯度下降的一种变体被称为随机梯度下降。


上面公式中的误差是针对于所有训练样本而得到的,而随机梯度下降的思想是根据每个单独的训练样本来更新权值,这样我们上面的梯度公式就变成了:




经过推导后,我们就可以得到最终的权值更新的公式:




 


有了上面权重的更新公式后,我们就可以通过输入大量的实例样本,来根据我们预期的结果不断地调整权值,从而最终得到一组权值使得我们的算法能够对一个新的样本输入得到正确的或无限接近的结果。


这里做一个对比


设代价函数为




 


 


批量梯度下降


 




 


参数更新为:


     


i是样本编号下标,j是样本维数下标,m为样例数目,n为特征数目。所以更新一个θj需要遍历整个样本集




 


随机梯度下降


 


参数更新为:


     


 


i是样本编号下标,j是样本维数下标,m为样例数目,n为特征数目。所以更新一个θj只需要一个样本就可以。




 


下面两幅图可以很形象的对比各种优化方法(图来源:http://sebastianruder.com/optimizing-gradient-descent/):




SGD各优化方法在损失曲面上的表现


从上图可以看出,Adagrad、Adadelta与RMSprop在损失曲面上能够立即转移到正确的移动方向上达到快速的收敛。而Momentum与NAG会导致偏离(off-track)。同时NAG能够在偏离之后快速修正其路线,因为其根据梯度修正来提高响应性。




SGD各优化方法在损失曲面鞍点处上的表现


 


59牛顿法和梯度下降法有什么不同。机器学习ML基础中


@wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040

1)牛顿法(Newton’smethod)


牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f (x)的泰勒级数的前面几项来寻找方程f (x)=0的根。牛顿法最大的特点就在于它的收敛速度很快。


具体步骤:


首先,选择一个接近函数 f (x)零点的 x0,计算相应的 f (x0) 和切线斜率f ’ (x0)(这里f‘ 表示函数 f 的导数)。然后我们计算穿过点(x0, f (x0)) 并且斜率为f ’(x0)的直线和 x 轴的交点的x坐标,也就是求如下方程的解:




我们将新求得的点的 x 坐标命名为x1,通常x1会比x0更接近方程f (x)=0的解。因此我们现在可以利用x1开始下一轮迭代。迭代公式可化简为如下所示:




已经证明,如果f ’ 是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x0位于这个邻近区域内,那么牛顿法必定收敛。并且,如果f ’(x)不为0,那么牛顿法将具有平方收敛的性能.粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。


由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是”切线法”。牛顿法的搜索路径(二维情况)如下图所示:




关于牛顿法和梯度下降法的效率对比:


a)从收敛速度上看 ,牛顿法是二阶收敛,梯度下降是一阶收敛,前者牛顿法收敛速度更快。但牛顿法仍然是局部算法,只是在局部上看的更细致,梯度法仅考虑方向,牛顿法不但考虑了方向还兼顾了步子的大小,其对步长的估计使用的是二阶逼近。


b)根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。




注:红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。


牛顿法的优缺点总结:


优点:二阶收敛,收敛速度快;


缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。


什么是拟牛顿法(Quasi-NewtonMethods)?机器学习ML基础中


@wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040

拟牛顿法是求解非线性优化问题最有效的方法之一,于20世纪50年代由美国Argonne国家实验室的物理学家W.C.Davidon所提出来。Davidon设计的这种算法在当时看来是非线性优化领域最具创造性的发明之一。不久R.Fletcher和M.J.D.Powell证实了这种新的算法远比其他方法快速和可靠,使得非线性优化这门学科在一夜之间突飞猛进。


拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。


具体步骤:


拟牛顿法的基本思想如下。首先构造目标函数在当前迭代xk的二次模型:




  这里Bk是一个对称正定矩阵,于是我们取这个二次模型的最优解作为搜索方向,并且得到新的迭代点:




  其中我们要求步长ak 满足Wolfe条件。这样的迭代与牛顿法类似,区别就在于用近似的Hessian矩阵Bk 


代替真实的Hessian矩阵。所以拟牛顿法最关键的地方就是每一步迭代中矩阵Bk


 


的更新。现在假设得到一个新的迭代xk+1,并得到一个新的二次模型:


 


 


 


 


 


 


 


 




我们尽可能地利用上一步的信息来选取Bk。具体地,我们要求


 




  从而得到




这个公式被称为割线方程。常用的拟牛顿法有DFP算法和BFGS算法。


 


60请说说随机梯度下降法的问题和挑战?机器学习ML基础中

那到底如何优化随机梯度法呢?详情请点击:论文公开课第一期:详解梯度下降等各类优化算法(含视频和PPT下载)。


61说说共轭梯度法?机器学习ML基础中

   @wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040

  共轭梯度法是介于梯度下降法(最速下降法)与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了梯度下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hessian矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有逐步收敛性,稳定性高,而且不需要任何外来参数。


  下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:




 


注:绿色为梯度下降法,红色代表共轭梯度法


 


62对所有优化问题来说, 有没有可能找到比現在已知算法更好的算法?机器学习ML基础中

@抽象猴,来源:https://www.zhihu.com/question/41233373/answer/145404190

没有免费的午餐定理:

对于训练样本(黑点),不同的算法A/B在不同的测试样本(白点)中有不同的表现,这表示:对于一个学习算法A,若它在某些问题上比学习算法 B更好,则必然存在一些问题,在那里B比A好。

也就是说:对于所有问题,无论学习算法A多聪明,学习算法 B多笨拙,它们的期望性能相同。

但是:没有免费午餐定力假设所有问题出现几率相同,实际应用中,不同的场景,会有不同的问题分布,所以,在优化算法时,针对具体问题进行分析,是算法优化的核心所在。


 


63什么最小二乘法?机器学习ML基础中


我们口头中经常说:一般来说,平均来说。如平均来说,不吸烟的健康优于吸烟者,之所以要加“平均”二字,是因为凡事皆有例外,总存在某个特别的人他吸烟但由于经常锻炼所以他的健康状况可能会优于他身边不吸烟的朋友。而最小二乘法的一个最简单的例子便是算术平均。


   最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。用函数表示为:










  使误差「所谓误差,当然是观察值与实际真实值的差量」平方和达到最小以寻求估计值的方法,就叫做最小二乘法,用最小二乘法得到的估计,叫做最小二乘估计。当然,取平方和作为目标函数只是众多可取的方法之一。


  最小二乘法的一般形式可表示为:










 


   有效的最小二乘法是勒让德在1805年发表的,基本思想就是认为测量中有误差,所以所有方程的累积误差为









 



   我们求解出导致累积误差最小的参数即可:



 






 



  勒让德在论文中对最小二乘法的优良性做了几点说明:


 最小二乘使得误差平方和最小,并在各个方程的误差之间建立了一种平衡,从而防止某一个极端误差取得支配地位

     计算中只要求偏导后求解线性方程组,计算过程明确便捷

    最小二乘可以导出算术平均值作为估计值

   对于最后一点,从统计学的角度来看是很重要的一个性质。推理如下:假设真值为 , 为n次测量值,每次测量的误差为,按最小二乘法,误差累积为










   求解 使达到最小,正好是算术平均。


   由于算术平均是一个历经考验的方法,而以上的推理说明,算术平均是最小二乘的一个特例,所以从另一个角度说明了最小二乘方法的优良性,使我们对最小二乘法更加有信心。

  最小二乘法的原理之一:当估计误差服从正态分布时,最小二乘法等同于极大似然估计。如果y=f(x)+e,其中y是目标值,f(x)为估计值,e为误差项。如果e服从正态分布,那么细节可以看:https://www.zhihu.com/question/20447622/answer/209839263,而由于中心极限定理的原因,很多误差分布确实服从正态分布,这也是最小二乘法能够十分有效的一个原因。


   最小二乘法发表之后很快得到了大家的认可接受,并迅速的在数据分析实践中被广泛使用。不过历史上又有人把最小二乘法的发明归功于高斯,这又是怎么一回事呢。高斯在1809年也发表了最小二乘法,并且声称自己已经使用这个方法多年。高斯发明了小行星定位的数学方法,并在数据分析中使用最小二乘方法进行计算,准确的预测了谷神星的位置。

对了,最小二乘法跟SVM有什么联系呢?请参见《支持向量机通俗导论(理解SVM的三层境界)》。


64看你T恤上印着:人生苦短,我用Python,你可否说说Python到底是什么样的语言?你可以比较其他技术或者语言来回答你的问题。PythonPython语言易

@David9,http://nooverfit.com/wp/15个重要python面试题-测测你适不适合做python?/ 


这里是一些关键点:Python是解释型语言。这意味着不像C和其他语言,Python运行前不需要编译。其他解释型语言包括PHP和Ruby。


Python是动态类型的,这意味着你不需要在声明变量时指定类型。你可以先定义x=111,然后 x=”I’mastring”。

    Python是面向对象语言,所有允许定义类并且可以继承和组合。Python没有访问访问标识如在C++中的public, private,这就非常信任程序员的素质,相信每个程序员都是“成人”了~

    在Python中,函数是一等公民。这就意味着它们可以被赋值,从其他函数返回值,并且传递函数对象。类不是一等公民。

    写Python代码很快,但是跑起来会比编译型语言慢。幸运的是,Python允许使用C扩展写程序,所以瓶颈可以得到处理。Numpy库就是一个很好例子,因为很多代码不是Python直接写的,所以运行很快。

    Python使用场景很多–web应用开发、大数据应用、数据科学、人工智能等等。它也经常被看做“胶水”语言,使得不同语言间可以衔接上。

    Python能够简化工作  ,使得程序员能够关心如何重写代码而不是详细看一遍底层实现。

@July:Python目前早已成为AI时代的第一语言,为帮助大家更好的学习Python语言、数据分析、爬虫等相关知识,七月在线特开一系列Python课程,有需要的亲们可以看下,比如《Python数据分析集训营》。


 


65Python是如何进行内存管理的?PythonPython基础中

@Tom_junsong,来源:http://www.cnblogs.com/tom-gao/p/6645859.html

答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:

1,一个对象分配一个新名称

2,将其放入一个容器中(如列表、元组或字典)

引用计数减少的情况:

1,使用del语句对对象别名显示的销毁

2,引用超出作用域或被重新赋值

sys.getrefcount()函数可以获得对象的当前引用计数

多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

二、垃圾回收

1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。

3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。


 


66请写出一段Python代码实现删除一个list里面的重复元素。PythonPython开发中

@Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html

答:

1,使用set函数,set(list)

2,使用字典函数,

>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]

>>>b={}

>>>b=b.fromkeys(a)

>>>c=list(b.keys())

>>>c


67编程用sort进行排序,然后从最后一个元素开始判断?PythonPython开发中

a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]

@Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html

a.sort()

last=a[-1]

foriinrange(len(a)-2,-1,-1):

iflast==a[i]:

dela[i]

else:last=a[i]

print(a)

 


68Python里面如何生成随机数?PythonPython开发中

@Tom_junsong,http://www.cnblogs.com/tom-gao/p/6645859.html

答:random模块

随机整数:random.randint(a,b):返回随机整数x,a<=x<=b

random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。

随机实数:random.random():返回0到1之间的浮点数

random.uniform(a,b):返回指定范围内的浮点数。更多Python笔试面试题请看:http://python.jobbole.com/85231/

 


69说说常见的损失函数?机器学习ML基础易


对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致(要知道,有时损失或误差是不可避免的),用一个损失函数来度量预测错误的程度。损失函数记为L(Y,f(X))。


  常用的损失函数有以下几种(基本引用自《统计学习方法》):






    


  如此,SVM有第二种理解,即最优化+损失最小,或如@夏粉_百度所说“可从损失函数和优化算法角度看SVM,boosting,LR等算法,可能会有不同收获”。关于SVM的更多理解请参考:支持向量机通俗导论(理解SVM的三层境界)


 


70简单介绍下logistics回归?机器学习ML模型易


Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。


  假设函数










  其中x是n维特征向量,函数g就是logistic函数。


  而的图像是


 






 







 


 





 


  可以看到,将无穷映射到了(0,1)。


  而假设函数就是特征属于y=1的概率。


 





 







  从而,当我们要判别一个新来的特征属于哪个类时,只需求即可,若大于0.5就是y=1的类,反之属于y

相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,&#39;\n&#39;是换行,&#39;\t&#39;是tab,&#39;\\&#39;是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open(&#39;3_2.txt&#39;,&#39;r&#39;)linecount=len(file.readlines())linecache.getline(&#39;3_2.txt&#39;,linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问