吴恩达机器学习——笔记

(考研数学一基础,仅供个人纪录,大纲为主,其中python代码cr [email protected] 笔记

 

一、基础知识

1 监督学习/无监督学习

2 单变量线性回归

(1)模型表示

(2)代价函数(cost function)——残差平方和

 (3) 直观理解——图示法

  (4)梯度下降——求解全局最小值

学习率α;梯度下降算法;梯度下降中的线性回归

正规方程法    \Theta ^{T}x——向量化

3 多变量线性回归

(1)多维特征

(2)多变量梯度下降法

def computeCost(X, y, theta):
     inner = np.power(((X * theta.T) - y), 2)
     return np.sum(inner) / (2 * len(X))

①特征缩放——类似于正态分布标准化

②学习率——影响迭代次数和最终收敛

(3)特征和多项式回归

(4)正规方程法(特征变量数目不大时)\Theta =\left ( x^{T}x\right )^{-1} x^{T}y

import numpy as np
def normalEqn(X, y):
      theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X 等价于 X.T.dot(X)
      return theta

不可逆性——伪逆

4 逻辑回归

( Logistic Regression)

①逻辑函数(logistic function )  或      S型函数(Sigmoid function)

g\left ( z \right )=\frac{1}{1+e^{-z}}

python 代码实现:

import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))

②判定边界(decision border)

③代价函数——log(有点类似假设检验)

import numpy as np
def cost(theta, X, y):
 theta = np.matrix(theta)
 X = np.matrix(X)
 y = np.matrix(y)
 first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
 second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
 return np.sum(first - second) / (len(X))
:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里 的ℎ() = ( \Theta ^{T}x )与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法 之前,进行特征缩放依旧是非必要的 

 ④分类:一对多(one-vs-all)—— 逻辑回归分类、取最大值

⑤其他高级优化算法

5 正则化

(Regularization)

(1)原因:过拟合(over-fitting)——无法泛化/推广到新数据

(正则化,就是通过收缩的办法,限制模型变的越来越「大」,牺牲样本内误差,降低模型(参数)的误差,从而提高样本外的预测效果,防止过拟合)

(2)处理办法:正则化——保留所有特征,但是减少参数的大小

(3)代价函数——添加正则化参数\lambda

(4)线性回归的正则化

(5)逻辑回归的正则化

import numpy as np
def costReg(theta, X, y, learningRate):
 theta = np.matrix(theta)
 X = np.matrix(X)
 y = np.matrix(y)
 first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
 second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
 reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:the
ta.shape[1]],2))
 return np.sum(first - second) / (len(X)) + reg

 

二、神经网络

(Neutral Network)

1 表述

(1)神经元/激活单元,activation unit

(2)输入层、隐藏层、输出层、偏差单位(bias unit)

(3)模型表示(前向传播)

吴恩达机器学习——笔记_第1张图片吴恩达机器学习——笔记_第2张图片

a_1{}^{(2)}代表第2层的第一个激活单元

\theta ^{(1)}代表从第一层映射到第二层的权重的矩阵,其尺寸为:以第j+1层的激活单元数量为行数,以第j层的激活单元加一为列数的矩阵,例如上图所述\theta ^{(1)}的尺寸为3*4

\theta \cdot x=a

吴恩达机器学习——笔记_第3张图片

(4)举例

①XOR/异或:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

XNOR/同或:异或结果取反

AND模型、OR模型

②通过上述模型组合构造神经网络——XOR模型

吴恩达机器学习——笔记_第4张图片

(5)利用神经网络解决多元分类问题

2 学习

(1)反向传播算法

即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出 最后一层的误差,然后利用该误差运用 反向传播法计算出直至第二层的 所有误差

(2)梯度检验(gradient  checking)

通过估计梯度值来检验我们计算的导数值是否是我们要求的。

(3)初始随机化(random initialization)

我们通常初始参数为正负 之间的随机值

(4)训练神经网络

1. 参数的随机初始化
2. 利用正向传播方法计算所有的 ()
3. 编写计算代价函数 的代码
4. 利用反向传播方法计算所有偏导数
5. 利用数值检验方法检验这些偏导数
6. 使用优化算法来最小化代价函数

(5)改进神经网络算法

①训练集:交叉验证集:测试集=6:2:2

吴恩达机器学习——笔记_第5张图片

②诊断偏差和方差d—特征数量)

吴恩达机器学习——笔记_第6张图片

正则化和偏差/方差

尝试改变想要测试的λ值

吴恩达机器学习——笔记_第7张图片

④学习曲线(改变m—训练集数据)

吴恩达机器学习——笔记_第8张图片

吴恩达机器学习——笔记_第9张图片

⑤结论

吴恩达机器学习——笔记_第10张图片

(增加多项式特征是指x_{1}^{2},x_{2}^{2},x_{1}x_{2},etc)

高方差:获得更多训练实例;尝试减少特征数量;尝试增加正则化程度

高偏差:尝试获得更多特征;尝试增加多项式特征;尝试减少正则化程度

(6)构建学习算法

1. 从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集数据测试这个算法
2. 绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他选择
3. 进行误差分析:人工检查交叉验证集中我们算法中产生预测误差的实例,看看这些实例是否有某种系统化的趋势,并思考怎样能改进分类器
4. 推荐使用量化数值评估

(7)偏斜类/skewed classes

类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。

评估度量值——查准率(Precision)和查全率(Recall) 

吴恩达机器学习——笔记_第11张图片吴恩达机器学习——笔记_第12张图片

选择阀值的方法:F=2\tfrac{PR}{P+R},选择其中F值较高的

 

三、支持向量机/SVM

(support vector machines)

简单点讲,SVM就是一种二类分类模型,他的基本模型是的定义在特征空间上的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。

1.优化目标

吴恩达机器学习——笔记_第13张图片

2.大边界的直观理解

大间距分类器吴恩达机器学习——笔记_第14张图片

如果你将 C 设置的不要太大,则你最终会得到这条黑线;当C不是非常非常大的时候,它可以忽略掉一些异常点的影响, 得到更好的决策界。 甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
 
回顾 = 1/ ,因此:
较大时,相当于 较小,可能会导致过拟合,高方差。
较小时,相当于 较大,可能会导致低拟合,高偏差。

3.核函数

(Kernels)

吴恩达机器学习——笔记_第15张图片吴恩达机器学习——笔记_第16张图片

常用核函数:线性核函数、高斯核函数

其余:多项式核函数、字符串核函数、卡方核函数、直方图交集核函数......

以上需要满足Mercer's定理

下面是一些普遍使用的准则:
为特征数, 为训练样本数。
(1) 如果相较于 而言, 要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2) 如果 较小,而且 大小中等,例如 1-1000 之间,而 10-10000 之间,使用高斯核函数的支持向量机。
(3) 如果 较小,而 较大,例如 1-1000 之间,而 大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

四、聚类

(Clustering)

1 无监督学习——聚类算法

2 K-均值算法(K-means)

K- 均值 是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为 :
①首先选择 个随机的点,称为 聚类中心 cluster centroids );
②对于数据集中的每一个数据,按照距离 个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
③计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
④重复步骤 2-4 直至中心点不再变化。

3 优化目标

\mu _1,\mu _2,...,\mu _k   来表示聚类中心,用c^{(1)},c^{(2)},...,c^{(m)}来存储与第 个实例数据最近的聚类中心的索引

吴恩达机器学习——笔记_第17张图片

4 初始随机化

K- 均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。
为了解决这个问题,我们通常需要多次运行 K- 均值算法,每一次都重新进行随机初始化,最后再比较多次运行 K- 均值 的结果,选择代价函数最小的结果。这种方法在 较小的时候( 2--10 )还是可行的,但是如果 较大,这么做也可能不会有明显地改善。
 

5 选取聚类数量

 
肘部法则 吴恩达机器学习——笔记_第18张图片
   

五、降维——PCA

(Dimensionality Reduction)

1 数据压缩/降维、数据可视化

2 主成分分析(PCA)

Principal Component Anayslis

主要成分分析是减少投射的平均均方误差。
 
PCA减少 维到 维:
第一步是。我们需要计算出所有特征的均值,然后令 x_{j}=\mu_{j}-x_{j}。如果特征是在不同的数量级上,我们还需要将其除以标准差\sigma ^{2}
第二步是计算 协方差矩阵 covariance matrix\Sigma =\frac{1}{m}\sum_{i=1}^{n}(x^{(i)})(x^{(i)})^{T}
第三步是计算协方差矩阵 特征向量 eigenvectors :奇异值分解

(可以理解为奇异值是特征值的推广,对长方形或者正方形但不满秩的矩阵,我们总可以求其奇异值。对于一般方阵两者不一定有联系。对于对称方阵,二者相等。)

吴恩达机器学习——笔记_第19张图片

选择主成分的数量

我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的 值。
如果我们希望这个比例小于 1% ,就意味着原本数据的偏差有 99%都保留下来了,如果我们选择保留 95% 的偏差,便能非常显著地降低模型中特征的维度了

我们可以先令 = 1,然后进行主要成分分析,获得U_{reduce}z,然后计算比例是否小于1%。如果不是的话再令 = 2,如此类推,直到找到可以使得比例小于 1%的最小 值(原因是各个特征之间通常情况存在某种相关性)。

吴恩达机器学习——笔记_第20张图片

3 压缩重现

吴恩达机器学习——笔记_第21张图片

5 PCA应用

错误的主要成分分析情况:
一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
 

六、异常检测

(Anomaly Detection)

1 高斯分布/正态分布

2 利用高斯分布开发异常检测算法

对于给定的数据集x^{(1)},x^{(2)},...,x^{(m)},我们要针对每一个特征计算 \mu\sigma ^2 的估计值。

给定新的一个训练实例,根据模型计算 (),当() < 时,为异常。

开发和评价一个异常检测系统

当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
具体的评价方法如下:
1. 根据测试集数据,我们估计特征的平均值和方差并构建 () 函数
2. 对交叉检验集,我们尝试使用不同的 值作为阀值,并预测数据是否异常,根据 F1 值或者查准率与查全率的比例来选择
3. 选出 后,针对测试集进行预测,计算异常检验系统的 1值,或者查准率与查全率之比。

异常检测与监督学习对比

 
异常检测
监督学习
非常少量的正向类(异常数据 = 1, 大量的负向类( = 0 同时有大量的正向类和负向类
许多不同种类的异常,非常难。根据非常少量的正向类数据来训练算法。
有足够多的正向类实例,足够用于训练算法,未来遇到的正向类实例可能与训练集中 的非常近似。
未来遇到的异常可能与已掌握的异常、非常的不同。
 
例如:欺诈行为检测 生产(例如飞机引擎) 检测数据中心的计算机运行状况
例如:邮件过滤器 天气预报 肿瘤分类

5 选择特征

异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数: =( + ) ,其中 为非负常数; 或者 = ^ 0-1 之间的一个分数,等方法。
 
误差分析:
一个常见的问题是一些异常的数据可能也会有较高的()值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
吴恩达机器学习——笔记_第22张图片
 

6 多变量高斯分布

(1)
  在一般的高斯分布模型中,我们计算 () 的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中,我们将构建特征的协方差矩阵,用所有的特征一起来计算 ()
吴恩达机器学习——笔记_第23张图片
协方差矩阵\Sigma
 
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。
如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。
 

(2)异常检测

吴恩达机器学习——笔记_第24张图片

七、推荐系统

(Recommender Systems)

1 问题形式化

2 基于内容的推荐系统

在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据是有关这些东西的特征。
在我们的例子中,我们可以假设每部电影都有两个特征,如 1 代表电影的浪漫程度, 2代表电影的动作程度
 

3 协同过滤

 
①协同过滤
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。
协同过滤算法可以同时学习这两者。 我们的优化目标便改为同时针对和进行。
吴恩达机器学习——笔记_第25张图片
②协同过滤的算法
吴恩达机器学习——笔记_第26张图片
向量化:低秩矩阵分解

吴恩达机器学习——笔记_第27张图片

推行工作上的细节:均值归一化

吴恩达机器学习——笔记_第28张图片

八、大规模机器学习

如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好的结果。我们应该怎样应对一个 100 万条记录的训练集
以线性回归模型为例,每一次梯度下降迭代,我们都需要计算训练集的误差的平方和,如果我们的学习算法需要有 20 次迭代,这便已经是非常大的计算代价。
首先应该做的事是去检查一个这么大规模的训练集是否真的必要,也许我们只用 1000个训练集也能获得较好的效果,我们可以绘制学习曲线来帮助判断

1 随机梯度下降法

Stochastic Gradient Descent
与之相对应的:Batch Gradient Descent
 

吴恩达机器学习——笔记_第29张图片

随机梯度下降算法在每一次计算之后便更新参数 ,而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时,随机梯度下降算法便已经走出了很远。但是这样的算法存在的问题是,不是每一步都是朝着 正确 ”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊

 

2 小批量梯度下降

  小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数 训练实例,便更新一次参数
  通常我们会令 2-100 之间。这样做的好处在于,我们可以用向量化的方式来循环个训练实例,如果我们用的线性代数函数库比较好,能够支持平行处理,那么算法的总体表现将不受影响(与随机梯度下降相同)。

 

3 随机梯度下降收敛

在批量梯度下降中,我们可以令代价函数为迭代次数的函数,绘制图表,根据图表来 判断梯度下降是否收敛。但是,在大规模的训练集的情况下,这是不现实的,因为计算代价太大了。
随机梯度下降中,我们在每一次更新 之前都计算一次代价,然后每 次迭代后,求出这 次对训练实例计算代价的平均值,然后绘制这些平均值与 次迭代的次数之间的函数图表。
我们也可以令学习率随着迭代次数的增加而减小,例如令:

 

4 在线学习

在线学习的算法与随机梯度下降算法有些类似,我们对单一的实例进行学习,而非对一个提前定义的训练集进行循环。
一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
在线学习的一个优点就是,如果你有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为。

 

映射化简和数据并行

Map Reduce and Data Parallelism 

映射化简和数据并行对于大规模机器学习问题而言是非常重要的概念。
之前提到,如果我们用批量梯度下降算法来求解大规模数据集的最优解,我们需要对整个训练集进行循环,计算偏导数和代价,再求和,计算代价非常大。如果我们能够将我们的数据集分配给不多台计算机,让每一台计算机处理数据集的一个子集,然后我们将计所的结果汇总在求和。这样的方法叫做映射简化

 

吴恩达机器学习作业python实现   https://www.heywhale.com/mw/project/5da16a37037db3002d441810

你可能感兴趣的:(笔记——深度学习入门)