为什么神经网络模型不如树模型?

简介  这篇文章主要介绍了用 NumPy 手写 30 个主流机器学习算法,GitHub 9K 星,全都开源了!以及相关的经验技巧,文章约25516字,浏览量272,点赞数1,值得参考!

参与 | 思源、一鸣、张倩

用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgin 最近开源了一个非常剽悍的项目。超过 3 万行代码、30 多个模型,这也许能打造「最强」的机器学习基石?

NumPy 作为 Python 生态中最受欢迎的科学计算包,很多读者已经非常熟悉它了。它为 Python 提供高效率的多维数组计算,并提供了一系列高等数学函数,我们可以快速搭建模型的整个计算流程。毫不负责任地说,NumPy 就是现代深度学习框架的「爸爸」。

尽管目前使用  写模型已经不是主流,但这种方式依然不失为是理解底层架构和深度学习原理的好方法。最近,来自普林斯顿的一位博士后将 NumPy 实现的所有机器学习模型全部开源,并提供了相应的论文和一些实现的测试效果。

根据机器之心的粗略估计,该项目大约有 30 个主要机器学习模型,此外还有 15 个用于预处理和计算的小工具,全部.py 文件数量有 62 个之多。平均每个模型的代码行数在 500 行以上,在神经网络模型的 layer.py 文件中,代码行数接近 4000。

这,应该是目前用 NumPy 手写机器学习模型的「最高境界」吧。

通过项目的代码目录,我们能发现,作者基本上把主流模型都实现了一遍,这个工作量简直惊为天人。我们发现作者 David Bourgin 也是一位大神,他于 2018 年获得加州大学伯克利分校计算认知科学博士学位,随后在普林斯顿大学从事博士后研究。

尽管毕业不久,David 在顶级期刊与计算机会议上都发表了一些优秀论文。在最近结束的 ICML 2019 中,其关于认知模型先验的研究就被接收为少有的 Oral 论文。

David Bourgin 小哥哥就是用 NumPy 手写 ML 模型、手推反向传播的大神。这么多的工作量,当然还是需要很多参考资源的,David 会理解这些资源或实现,并以一种更易读的方式写出来。

正如 reddit 读者所质疑的:在 autograd repo 中已经有很多这样的例子,为什么你还要做这个项目?

作者表示,他的确从 autograd repo 学到了很多,但二者的不同之处在于,他显式地进行了所有梯度计算,以突出概念/数学的清晰性。当然,这么做的缺点也很明显,在每次需要微分一个新函数时,你都要写出它的公式……

估计 David Bourgin 小哥哥在写完这个项目后,机器学习基础已经极其牢固了。最后,David 表示下一步会添加文档和示例,以方便大家使用。

这个项目最大的特点是作者把机器学习模型都用 NumPy 手写了一遍,包括更显式的梯度计算和反向传播过程。可以说它就是一个机器学习框架了,只不过代码可读性会强很多。

David Bourgin 表示他一直在慢慢写或收集不同模型与模块的纯 NumPy 实现,它们跑起来可能没那么快,但是模型的具体过程一定足够直观。每当我们想了解模型 API 背后的实现,却又不想看复杂的框架代码,那么它可以作为快速的参考。

文章后面会具体介绍整个项目都有什么模型,这里先简要介绍它的整体结构。如下所示为项目文件,不同的文件夹即不同种类的代码集。

在每一个代码集下,作者都会提供不同实现的参考资料,例如模型的效果示例图、参考论文和参考链接等。如下所示,David 在实现神经网络层级的过程中,还提供了参考论文。

当然如此庞大的代码总会存在一些 Bug,作者也非常希望我们能一起完善这些实现。如果我们以前用纯 NumPy 实现过某些好玩的模型,那也可以直接提交 PR 请求。因为实现基本上都只依赖于 NumPy,那么环境配置就简单很多了,大家差不多都能跑得动。

作者在 GitHub 中提供了模型/模块的实现列表,列表结构基本就是代码文件的结构了。整体上,模型主要分为两部分,即传统机器学习模型与主流的深度学习模型。

其中浅层模型既有隐马尔可夫模型和提升方法这样的复杂模型,也包含了线性回归或最近邻等经典方法。而深度模型则主要从各种模块、层级、、最优化器等角度搭建代码架构,从而能快速构建各种神经网络。

除了模型外,整个项目还有一些辅助模块,包括一堆预处理相关的组件和有用的小工具。

该 repo 的模型或代码结构如下所示:

3. 隐狄利克雷分配模型(主题模型)

  • 用变分 EM 进行 MLE 参数估计的标准模型

  • 用 MCMC 进行 MAP 参数估计的平滑模型

  • ResNet 风格的残差块(恒等变换和卷积)

  • WaveNet 风格的残差块(带有扩张因果卷积)

  • 批归一化(时间上和空间上)

  • 层归一化(时间上和空间上)

  • 标准和截断正态分布初始化

4.10 神经网络工具

  • 贝叶斯线性回归 w/共轭先验

  • 使用交叉熵方法的智能体

  • 加权增量重要采样蒙特卡罗智能体

  • 离散傅立叶变换 (1D 信号)

  • 双线性插值 (2D 信号)

  • 自相关 (1D 信号)

由于代码量庞大,机器之心在这里整理了一些示例。

例如,实现点积注意力机制:

在以上代码中,Q、K、V 三个向量输入到「_fwd」函数中,用于计算每个向量的注意力分数,并通过 softmax 的方式得到权重。而「_bwd」函数则计算 V、注意力权重、注意力分数、Q 和 K 的梯度,用于更新网络权重。

在一些实现中,作者也进行了测试,并给出了测试结果。如图为隐狄利克雷(Latent Dirichlet allocation,LDA)实现进行文本聚类的结果。左图为词语在特定主题中的分布热力图。右图则为文档在特定主题中的分布热力图。

图注:隐狄利克雷分布实现的效

根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。

在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。常见的应用场景包括关联规则的学习以及聚类等。常见算法包括Apriori算法以及k-Means算法。

在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。如图论推理算法(Graph

在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括Q-Learning以及时间差学习(Temporal

根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。当然,机器学习的范围非常庞大,有些算法很难明确归类到某一类。而对于有些分类来说同一分类的算法可以针对不同类型的问题。这里,我们尽量把常用的算法按照最容易理解的方式进行分类。

回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法,这一点常常会使初学者有所困惑。常见的回归算法包括:最小二乘法(Ordinary Least

基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”。常见的算法包括 k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization,

正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。常见的算法包括:Ridge Regression,Least Absolute Shrinkage and

贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题。常见算法包括:朴素贝叶斯算法,平均单依赖估计(Averaged One-Dependence Estimators, AODE),以及Bayesian Belief Network(BBN)。

基于核的算法中最著名的莫过于支持向量机(SVM)了。基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易的解决。常见的基于核的算法包括:支持向量机(Support Vector Machine, SVM), 径向基函数(Radial Basis Function ,RBF), 以及线性判别分析(Linear

聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括

关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori算法和Eclat算法等。

人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法。(其中深度学习就是其中的一类算法,我们会单独讨论),重要的人工神经网络算法包括:感知器神经网络(Perceptron Neural Network), 反向传递(Back Propagation),

深度学习算法是对人工神经网络的发展。在近期赢得了很多关注, 特别是百度也开始发力深度学习后, 更是在国内引起了很多关注。 在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络。很多深度学习的算法是半监督式学习算法,用来处理存在少量未标识数据的大数据集。常见的深度学习算法包括:受限波尔兹曼机(Restricted Boltzmann

像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用。

集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。

常见机器学习算法优缺点:

1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分类为例),比如说是句子单词的话,则长度为整个词汇量的长度,对应位置是该单词出现的次数。

其中一项条件概率可以通过朴素贝叶斯条件独立展开。要注意一点就是 的计算方法,而由朴素贝叶斯的前提假设可知,=,因此一般有两种,一种是在类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本的总和;第二种方法是类别为ci的那些样本集中,找到wj出现次数的总和,然后除以该样本中所有特征出现次数的总和。

3. 如果 中的某一项为0,则其联合概率的乘积也可能为0,即2中公式的分子为0,为了避免这种现象出现,一般情况下会将这一项初始化为1,当然为了保证概率相等,分母应对应初始化为2(这里因为是2类,所以加2,如果是k类就需要加k,术语上叫做laplace光滑, 分母加k的原因是使之满足全概率公式)。

朴素贝叶斯的优点:对小规模的数据表现很好,适合多分类任务,适合增量式训练。

缺点:对输入数据的表达形式很敏感。

决策树:决策树中很重要的一点就是选择一个属性进行分枝,因此要注意一下信息增益的计算公式,并深入理解它。

信息熵的计算公式如下:

其中的n代表有n个分类类别(比如假设是2类问题,那么n=2)。分别计算这2类样本在总样本中出现的概率p1和p2,这样就可以计算出未选中属性分枝前的信息熵。

现在选中一个属性xi用来进行分枝,此时分枝规则是:如果xi=vx的话,将样本分到树的一个分支;如果不相等则进入另一个分支。很显然,分支中的样本很有可能包括2个类别,分别计算这2个分支的熵H1和H2,计算出分枝后的总信息熵H’=p1*H1+p2*H2.,则此时的信息增益ΔH=H-H’。以信息增益为原则,把所有的属性都测试一边,选择一个使增益最大的属性作为本次分枝属性。

决策树的优点:计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;

缺点:容易过拟合(后续出现了随机森林,减小了过拟合现象)。

Logistic回归:Logistic是用来分类的,是一种线性分类器,需要注意的地方有:

2. logsitc回归方法主要是用最大似然估计来学习的,所以单个样本的后验概率为:

到整个样本的后验概率:

通过对数进一步化简为:

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

1. 容易欠拟合,一般准确度不太高

2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;

线性回归才是真正用于回归的,而不像logistic回归是用于分类,其基本思想是用梯度下降法对最小二乘法形式的误差函数进行优化,当然也可以用normal equation直接求得参数的解,结果为:

而在LWLR(局部加权线性回归)中,参数的计算表达式为:

由此可见LWLR与LR不同,LWLR是一个非参数模型,因为每次进行回归计算都要遍历训练样本至少一次。

线性回归优点:实现简单,计算简单;

缺点:不能拟合非线性数据;

KNN算法:KNN即最近邻算法,其主要过程为:

1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);

2. 对上面所有的距离值进行排序;

3. 选前k个最小距离的样本;

4. 根据这k个样本的标签进行投票,得到最后的分类类别;

如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。

近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。

注:马氏距离一定要先给出样本集的统计性质,比如均值向量,协方差矩阵等。关于马氏距离的介绍如下:

1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;

2. 可用于非线性分类;

3. 训练时间复杂度为O(n);

4. 准确度高,对数据没有假设,对outlier不敏感;

2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);

3. 需要大量的内存;

要学会如何使用libsvm以及一些参数的调节经验,另外需要理清楚svm算法的一些思路:

1. svm中的最优分类面是对所有样本的几何裕量最大(为什么要选择最大间隔分类器,请从数学角度上说明?网易深度学习岗位面试过程中有被问到。答案就是几何间隔与样本的误分次数间存在关系:

,其中的分母就是样本到分类间隔距离,分子中的R是所有样本中的最长向量值),即:

经过一系列推导可得为优化下面原始目标:

2. 下面来看看拉格朗日理论:

可以将1中的优化目标转换为拉格朗日的形式(通过各种对偶优化,KKD条件),最后目标函数为:

我们只需要最小化上述目标函数,其中的α为原始优化问题中的不等式约束拉格朗日系数。

3. 对2中最后的式子分别w和b求导可得:

由上面第1式子可以知道,如果我们优化出了α,则直接可以求出w了,即模型的参数搞定。而上面第2个式子可以作为后续优化的一个约束条件。

4. 对2中最后一个目标函数用对偶优化理论可以转换为优化下面的目标函数:

而这个函数可以用常用的优化方法求得α,进而求得w和b。

5. 按照道理,svm简单理论应该到此结束。不过还是要补充一点,即在预测时有:

那个尖括号我们可以用核函数代替,这也是svm经常和核函数扯在一起的原因。

6. 最后是关于松弛变量的引入,因此原始的目标优化公式为:

此时对应的对偶优化公式为:

与前面的相比只是α多了个上界。

1. 可用于线性/非线性分类,也可以用于回归;

4. 计算复杂度较低;

1. 对参数和核函数的选择比较敏感;

2. 原始的SVM只比较擅长处理二分类问题;

主要以Adaboost为例,首先来看看Adaboost的流程图,如下:

从图中可以看到,在训练过程中我们需要训练出多个弱分类器(图中为3个),每个弱分类器是由不同权重的样本(图中为5个训练样本)训练得到(其中第一个弱分类器对应输入样本的权值是一样的),而每个弱分类器对最终分类结果的作用也不同,是通过加权平均输出的,权值见上图中三角形里面的数值。那么这些弱分类器和其对应的权值是怎样训练出来的呢?

下面通过一个例子来简单说明,假设的是5个训练样本,每个训练样本的维度为2,在训练第一个分类器时5个样本的权重各为0.2. 注意这里样本的权值和最终训练的弱分类器组对应的权值α是不同的,样本的权重只在训练过程中用到,而α在训练过程和测试过程都有用到。

现在假设弱分类器是带一个节点的简单决策树,该决策树会选择2个属性(假设只有2个属性)的一个,然后计算出这个属性中的最佳值用来分类。

Adaboost的简单版本训练过程如下:

1. 训练第一个分类器,样本的权值D为相同的均值。通过一个弱分类器,得到这5个样本(请对应书中的例子来看,依旧是machine learning in action)的分类预测标签。与给出的样本真实标签对比,就可能出现误差(即错误)。如果某个样本预测错误,则它对应的错误值为该样本的权重,如果分类正确,则错误值为0. 最后累加5个样本的错误率之和,记为ε。

2. 通过ε来计算该弱分类器的权重α,公式如下:

3. 通过α来计算训练下一个弱分类器样本的权重D,如果对应样本分类正确,则减小该样本的权重,公式为:

如果样本分类错误,则增加该样本的权重,公式为:

4. 循环步骤1,2,3来继续训练多个分类器,只是其D值不同而已。

输入一个样本到训练好的每个弱分类中,则每个弱分类都对应一个输出标签,然后该标签乘以对应的α,最后求和得到值的符号即为预测标签值。

2. 容易实现,分类准确率较高,没有太多参数可以调;

1. 基于划分的聚类:

k-means是使下面的表达式值最小:

(1)k-means算法是解决聚类问题的一种经典算法,算法简单、快速。

(2)对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法通常局部收敛。

(3)算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。

(1)k-平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。

(2)要求用户必须事先给出要生成的簇的数目k。

(3)对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。

(4)不适合于发现非凸面形状的簇,或者大小差别很大的簇。

(5)对于"噪声"和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。

2. 基于层次的聚类:

自底向上的凝聚方法,比如AGNES。

自上向下的分裂方法,比如DIANA。

推荐系统:推荐系统的实现主要分为两个方面:基于内容的实现和协同滤波的实现。

基于内容的实现:不同人对不同电影的评分这个例子,可以看做是一个普通的回归问题,因此每部电影都需要提前提取出一个特征向量(即x值),然后针对每个用户建模,即每个用户打的分值作为y值,利用这些已有的分值y和电影特征值x就可以训练回归模型了(最常见的就是线性回归)。

这样就可以预测那些用户没有评分的电影的分数。(值得注意的是需对每个用户都建立他自己的回归模型)

从另一个角度来看,也可以是先给定每个用户对某种电影的喜好程度(即权值),然后学出每部电影的特征,最后采用回归来预测那些没有被评分的电影。

当然还可以是同时优化得到每个用户对不同类型电影的热爱程度以及每部电影的特征。

基于协同滤波的实现:协同滤波(CF)可以看做是一个分类问题,也可以看做是矩阵分解问题。协同滤波主要是基于每个人自己的喜好都类似这一特征,它不依赖于个人的基本信息。

比如刚刚那个电影评分的例子中,预测那些没有被评分的电影的分数只依赖于已经打分的那些分数,并不需要去学习那些电影的特征。

SVD将矩阵分解为三个矩阵的乘积,公式如下所示:

中间的矩阵sigma为对角矩阵,对角元素的值为Data矩阵的奇异值(注意奇异值和特征值是不同的),且已经从大到小排列好了。即使去掉特征值小的那些特征,依然可以很好的重构出原始矩阵。如下图所示:

其中更深的颜色代表去掉小特征值重构时的三个矩阵。

果m代表商品的个数,n代表用户的个数,则U矩阵的每一行代表商品的属性,现在通过降维U矩阵(取深色部分)后,每一个商品的属性可以用更低的维度表示(假设为k维)。这样当新来一个用户的商品推荐向量X,则可以根据公式X'*U1*inv(S1)得到一个k维的向量,然后在V’中寻找最相似的那一个用户(相似度测量可用余弦公式等),根据这个用户的评分来推荐(主要是推荐新用户未打分的那些商品)。

pLSA:由LSA发展过来,而早期LSA的实现主要是通过SVD分解。pLSA的模型图如下

LDA主题模型,概率图如下:

和pLSA不同的是LDA中假设了很多先验分布,且一般参数的先验分布都假设为Dirichlet分布,其原因是共轭分布时先验概率和后验概率的形式相同。

Tree),好像在阿里内部用得比较多(所以阿里算法岗位面试时可能会问到),它是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的输出结果累加起来就是最终答案。

它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。

GBDT是回归树,不是分类树。其核心就在于,每一棵树是从之前所有树的残差中来学习的。为了防止过拟合,和Adaboosting一样,也加入了boosting这一项。

1. 数值上更容易求解;

2. 特征数目太大时更稳定;

3. 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。而加入规则项能使目标函数复杂度减小,且更光滑。

4. 减小参数空间;参数空间越小,复杂度越低。

5. 系数越小,模型越简单,而模型越简单则泛化能力越强(Ng宏观上给出的解释)。

6. 可以看成是权值的高斯先验。

异常检测:可以估计样本的密度函数,对于新样本直接计算其密度,如果密度值小于某一阈值,则表示该样本异常。而密度函数一般采用多维的高斯分布。

如果样本有n维,则每一维的特征都可以看作是符合高斯分布的,即使这些特征可视化出来不太符合高斯分布,也可以对该特征进行数学转换让其看起来像高斯分布,比如说x=log(x+c), x=x^(1/c)等。异常检测的算法流程如下:

其中的ε也是通过交叉验证得到的,也就是说在进行异常检测时,前面的p(x)的学习是用的无监督,后面的参数ε学习是用的有监督。那么为什么不全部使用普通有监督的方法来学习呢(即把它看做是一个普通的二分类问题)?

主要是因为在异常检测中,异常的样本数量非常少而正常样本数量非常多,因此不足以学习到好的异常行为模型的参数,因为后面新来的异常样本可能完全是与训练样本中的模式不同。

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

EM算法一般分为2步:

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

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

重复上面2步直至收敛,公式如下所示:

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

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

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

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

Apriori是关联分析中比较早的一种方法,主要用来挖掘那些频繁项集合。其思想是:

1. 如果一个项目集合不是频繁集合,那么任何包含它的项目集合也一定不是频繁集合;

2. 如果一个项目集合是频繁集合,那么它的任何非空子集也是频繁集合;

Aprioir需要扫描项目表多遍,从一个项目开始扫描,舍去掉那些不是频繁的项目,得到的集合称为L,然后对L中的每个元素进行自组合,生成比上次扫描多一个项目的集合,该集合称为C,接着又扫描去掉那些非频繁的项目,重复…

看下面这个例子,元素项目表格:

如果每个步骤不去掉非频繁项目集,则其扫描过程的树形结构如下:

在其中某个过程中,可能出现非频繁的项目集,将其去掉(用阴影表示)为:

FP Growth是一种比Apriori更高效的频繁项挖掘方法,它只需要扫描项目表2次。其中第1次扫描获得当个项目的频率,去掉不符合支持度要求的项,并对剩下的项排序。第2遍扫描是建立一颗FP-Tree(frequent-patten tree)。

接下来的工作就是在FP-Tree上进行挖掘,比如说有下表:

它所对应的FP_Tree如下:

然后从频率最小的单项P开始,找出P的条件模式基,用构造FP_Tree同样的方法来构造P的条件模式基的FP_Tree,在这棵树上找出包含P的频繁项集。

依次从m,b,a,c,f的条件模式基上挖掘频繁项集,有些项需要递归的去挖掘,比较麻烦,比如m节点。

来源:AI知识干货,编辑:nhyilin

仅用于学术分享,版权属于原作者。

若有侵权,请联系删除或修改!

会员申请 请在公众号内回复“个人会员”或“单位会员

欢迎关注中国指挥与控制学会媒体矩阵

CICC官方微信公众号

《指挥与控制学报》官网

『模型偏置有何不同?』

归纳偏置:在机器学习中,很多学习算法经常会对学习的问题做一些假设,这些假设就称为 归纳偏置(Inductive Bias) 。

因此,归纳偏置可以理解为,从现实生活中观察到的现象中归纳出一定的规则(heuristics),然后对模型做一定的约束,从而可以起到“模型选择”的作用,即从假设空间中选择出更符合现实规则的模型。

所以,要理解两个模型在同一数据上的表现差异,就需要理解两个模型归纳偏置的不同。

『模型本质有何不同?』

树模型的本质:分段常数函数

决策树在本质上是一组嵌套的if-else判定规则,从数学上看是分段常数函数,对应于用平行于坐标轴的平面对空间的划分。判定规则是人类处理很多问题时的常用方法,这些规则是我们通过经验总结出来的,而决策树的这些规则是通过训练样本自动学习得到的。而正是这种简单的划分使得模型的决策流形(decision manifolds)可以看成是超平面的分割边界,对于表格数据的效果很好。

神经网络的本质:分段线性函数

以最简单的神经网络结构表示的单变量逻辑回归模型来说,中间层是ax+b这种线性表达方式进行拟合的表达能力是非常有限的。

而不管在中间加多少层线性变换,并不能提高其表达能力,最终模型本质上仍然是一个关于x的线性模型。那么如何引入非线性呢?——激活函数。激活函数的引入使神经网络具备了非线性表达的能力。

神经网络强大的本质原因:1)激活函数让线性的神经网络具备了“分段”表达的能力。2)任何函数都可以用“分段”线性函数来逼近。成也强大、败也强大,正是因为神经网络这种过强的拟合能力导致在size通常不大的表格数据上很容易过拟合。对于大规模神经网络来说,中间隐层所生成的“高维特征”甚至有时比原始数据还多。

  1. 天然的鲁棒性,对异常点、缺失值不敏感,不需要归一化等操作。

  2. 模型的决策流形(decision manifolds)是可以看成是超平面的分割边界,对于表格数据的效果很好。

  3. 基于贪心的自动化特征选择和特征组合能相比其他ML模型,具有更强的非线性表达能力。

  4. 树的可解释性很好,分裂可视化以及特征重要性等操作,能改善特征工程。进一步优化特征,提升模型性能。

  5. 数据量带来的边际增益不大,容易触及天花板。

  1. 在语义含义统一的稠密数据上,拥有全自动化的特征工程的能力,包括超强的特征挖掘与特征组合能力。

  2. 极强的数据记忆能力与外推泛化能力。

  3. 对异常值敏感,对于表格数据,强依赖数据预处理。

  4. 不可解释,无法像树模型那种直观展示预测流程,无法推演与优化基础特征。

  5. 过强的非线性中隐含过拟合和噪音。

闻道有先后,术业有专攻,即便强如神经网络也有自己的软肋。但从上述结果其实也可以发现,神经网络不适合处理表格数据仅仅是因为我们还没有掌握合适的方法,神经网络的强大的建模能力仍毋庸置疑。相信总有一天,神经网络模型将一统江湖,三界唯尊!

扫描二维码添加小助手微信

请备注:姓名-学校/公司-研究方向
(如:小张-哈工大-对话系统)
即可申请加入自然语言处理/Pytorch等技术交流群

MLNLP 社区是由国内外机器学习与自然语言处理学者联合构建的民间学术社区,目前已经发展为国内外知名的机器学习与自然语言处理社区,旗下包括万人顶会交流群、AI臻选汇、MLNLP英才汇以及AI学术汇等知名品牌,旨在促进机器学习,自然语言处理学术界、产业界和广大爱好者之间的进步。
社区可以为相关从业者的深造、就业及研究等方面提供开放交流平台。欢迎大家关注和加入我们。

我要回帖

更多关于 神经网络模型应用实例 的文章

 

随机推荐