斯坦福大学Andrew Ng学习笔记

线性回归

代价函数

为了使建模误差(modeling error)最小,应当使建模误差的平方和最小

J(θ)=12mi=1m(hθ(x(i)y(i)))2
最小

Gradient Descent

先随机选择参数组合,计算代价函数,然后寻找能让代价函数值下降最多的参数集合,直到找到一个局部最小值(local minumum)

批量梯度下降算法(batch gradient descent)

repeat until convergence{θj:=θjαθjJ(θ)    (for j=0 and j=1)}

其中,α是学习率(learning rate),

注意我们应该同时更新θ的值

Learning rate

如果α太小,导致程序运行效率低下
如果α太大。可能无法收敛,甚至发散

特征缩放 Feature Scaling

帮助Gradient Descent更快收敛

x=xnμnsn

其中μn是平均值sn是标准差

逻辑回归

分类问题中,我们尝试预测结果是否属于某一个类。

以二元问题为例
将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量y{0,1},其中0表示负向类

逻辑回归模型

hθ(x)=11+eθTX

hθ(x)=P(y=1|x;θ)

判断边界

θTX0y=1
θTX0y=0

代价函数Cost Function

如果应用线性回归模型,将得到非凸函数(non-convex function)

CostFunction:J(θ)=1mi=1mCost(hθ(x(i)),y(i))

Cost(hθ(x),y)={log(hθ(x))    if y=1log(1hθ(x))    if y=0

Cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))

Repeat{θj:=θjαi=1m(hθ(x(i))y(i))xj(i)    (simultaneously update all)}

多类别分类

使用一对余的方法,若有n (n3)个类别则需n个分类器

正则化 Regularization

用于解决过拟合问题

一般解决过拟合问题的方案:
丢弃一些不能帮助我们正确预测的feature
Regularization, 保留所有特征,减少参数大小

一定程度上减小高次项的系数

正则化线性回归

J(θ): J(θ)=12m[i=1m((hθ(x(i))y(i))2+λj=1nθj2)]λ(RegularizationParameter)

λ过大,导致模型变成hθ(x)=θ0,造成欠拟合,所以要选取合理的λ

θj:=θ(1αλm)α1mi=1m(hθ(x(i)y(i))xj(i),   j=1,2,3,...

()线θ=(XTX+λ(0000001000..........00001))1XTy(n+1)×(n+1)

正则化逻辑回归

J(θ)=[1mi=1m(y(i)×log(hθ(x(i)))+(1y(i))×log(1hθ(x(i))))]+λ2mj=1nθj2

注意:
θ0不参与正则化

神经网络

非线性假设

使用神经网络原因:如果有n个变量(feature),则需要Cn2个特征组合,数量过于庞大,所以需要使用神经网络

模型表示 Model Representation

神经网络模型建立在很多神经元之上,每个神经元又是一个个模型。
这些神经元(**单元, activation unit)采用一些特征作为输出,并根据本身的模型提供一个输出
在神经网络中,参数可被称为权重(weight)
斯坦福大学Andrew Ng学习笔记
其中x1,x2,x3是输入单元,a1,a2,a3是中间单元,hθ(x)是输出单元。
神经网络是许多逻辑单元按照不同层级组织起来的网格,每一层的输出变量都是下一层的输入变量。
第一层为输入层(Input Layer),最后一层为称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)

......

......

......

反向传播算法

学习完1个样本后,就要进行一次反向传播的计算,并添加到误差矩阵Δij(l)

梯度检验

用割线斜率检验偏导数
注意在学习过程中关闭梯度检验,因为运行速度很慢

随机初始化

不能初始化所有参数为零
通常选择初始参数为正负ϵ之间的随机值,越小越好

选择神经网络时的步骤

决定选择多少层的神经网络,一般选择一层隐藏层,若有多个隐藏层,尽量使每个隐藏层的单元个数相同。通常情况下,隐藏层单元越多越好
具体步骤:
1. 参数的随机初始化
2. 利用正向传播计算所有的hθ(x)
3. 编写计算代价函数J的代码
4. 利用反向传播算法计算所有的偏导数
5. 利用数值检验方法检验偏导数
6. 使用优化算法最小化代价函数

神经网络的诊断方法

判断过拟合

训练数据和测试数据七三分
1. 对于线性回归模型,用训练集计算出的代价函数计算测试集
2. 对于逻辑回归模型,除了用代价函数外,还可用误分比计算。若误判则结果为1,否则为0,然后加和求平均

模型选择和交叉验证

60%的数据作为训练集,20%的数据作为验证集,20%的数据作为测试集
先用训练集训练不同的模型,再用验证集选出最优模型,最后用测试集检验最优模型

判断偏差与方差

JtrainJcv都很高且两者相差不大时,为偏差较大的情况——欠拟合;
Jtrain很小,Jcv很大,则为方差较大的情况——过拟合。

λ较大,属于较大偏差的情况
λ较小,属于较大方差的情况

操作过程
1. 创建包含不同λ值的列表
2. Create a set of models with different degrees or any other variants.
3. 对每个λ进行迭代,得到矩阵Θ
4. 在无正则化的情况下,通过JCV(Θ)计算所得Θ矩阵的交叉验证误差
5. 选取交叉误差最小的矩阵
6. 使用最优ΘλJtest(Θ)进行验证

学习曲线

高偏差
斯坦福大学Andrew Ng学习笔记

高误差
斯坦福大学Andrew Ng学习笔记

决定下一步做什么

  1. 获得更多的训练实例——解决高方差
  2. 尝试减少特征的数量——解决高方差
  3. 尝试获得更多特征——解决高偏差
  4. 尝试增加多项式特征——解决高偏差
  5. 尝试减少正则化程度λ——解决高偏差
  6. 尝试增加正则化程度λ——解决高方差

较小的神经网络,参数少,容易导致高偏差和欠拟合,但计算代价小
较大的神经网络,参数多,容易导致高方差和过拟合,虽然计算代价大,但可通过正则化调整
通常选较大神经网络+正则化处理

机器学习系统设计

误差分析 Error Analysis

构建一个学习算法的推荐方法:
1. 从简单的能快速实现的算法开始,实现它,并用交叉验证集数据测试
2. 绘制学习曲线,决定是增加数据还是添加特征或其他
3. 误差分析,人工检查交叉验证集中算法产生的预测误差的实例,看看实例是否有系统化的倾向

类偏斜的误差度量 Error Metrics for Skewed Classes

 Precision=##

 Recall=##

查准率于查全率之间的权衡

F值评估

F1=2PRP+R

支持向量机 Support Vector Machine

SVM hypothesis:minθCi=1m[y(i)cost1(θTx(i))+(1y(i))cost0(θTx(i))]+12i=1mθj2

假设函数hθ(x)直接预测0或1,而不是概率

核函数 Kernels

可以用一系列新的特征f来替代多项式模型中的每一项。
f可用核函数计算。用x与预先给定的地标l(i)的近似程度来选取新的特征
例如:

f1=similarity(x,l(i))=e(xl(i)22σ2)

其中,xl(i)2=j=1n(xjlj(1))2,上例中的similarity(x,l(1))就是核函数,此处使用的是高斯核函数。
xl间的距离很近,则f近似于1,反之近似于0

使用SVM

可以使用线性核函数(直接用线性函数)或其他核函数
如果使用高斯核函数,最好进行特征归一化

无监督算法

聚类 Clustering

K均值算法

  1. 首先选择K个随机点,为聚类中心(cluster centroids)
  2. 对每个数据按照距离K个点的位置,将其与距离最近的中心点关联
  3. 计算每组的均值,将改组的关联中心移到均值点
  4. 重复直至均值点不再变化

优化目标

最小化所有数据点与其关联中心点之间的距离之和,K均值的代价函数(又称畸变函数(Distortion function))为

J(c(1),...,c(m),μ(1),...,μ(K))=1mi=1mx(i)μc(i)2

随机初始化

  1. 选择K<m
  2. 随机选择K个训练实例,然后令K个聚类中心分别与这K个实例相等
    为解决得到局部最优解的情况,需要多次运行K均值算法,但若K较大,这种措施收效甚微

选择聚类数K

考虑算法使用的动机,或者遵循“肘部法则”
即画出代价函数与K值的图像,选取“肘部点”

降维(Dimensionality Reduction)

降维的两个Motivation:
1. 数据压缩
2. 数据可视化

主成分分析算法(PCA)

  1. 均值归一化
  2. 计算协方差矩阵,即
    Σ=1mi=1n(x(i))(x(i))T
  3. 计算协方差矩阵的特征向量
  4. 从(Octave奇异值分解得到的[U,S,V]=svd(sigma)中的)矩阵U中选取前K个向量,获得n×k的矩阵,用Ureduce表示,然后通过如下计算
    z(i)=UreduceT×x(i)
    获得新特征向量z(i)

选择主成分的数量

减少平均均方投射误差
训练集方差1mi=1mx(i)2
在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的K
若希望此比例小于1%,则原本数据99%的偏差都保留下来了
可取不同的K值,找使得比例满足要求的最小K

重建的压缩表示

Xapprox=Ureducez

XapproxX

应用PCA的建议

  1. 压缩训练集特征
  2. 对训练集运行学习算法
  3. 在预测时,采用之前学习的Ureduce将输入的特征向量x转化为特征向量z然后预测
    注意:
    1. 不要用PCA来解决过拟合
    2. 不要将PCA默认作为学习过程的一部分

异常检测算法

算法

对于给定的数据集x(i),i=1,2,...,m,针对每一个特征计算μσ2
μj=1mi=1mx(i)
σj2=1mi=1m(xj(i)μj)2
一旦获得了均值和方差的估计值,给定一个新的实例,根据模型计算p(x)
p(x)=j=1np(xj;μj,σj2)=j=1n12πσjexp((xjμj)22σj2)
p(x)<ϵ时,为异常

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

从带标记的数据着手,从中选择一部分正常数据构建数据集,剩下的构成交叉验证集和测试集 例如:有10000台正常引擎,20台异常引擎,数据应当这样分配 6000台正常引擎作为训练集 2000台正常引擎和10台异常引擎作为交叉验证集 2000台正常引擎和10台异常引擎作为测试集 评价方法: 1. 根据测试集数据,估计**特征**的平均值和方差并构建p(x)函数(如高斯分布函数) 2. 对交叉验证集,尝试不同的ϵ作为阀值,根据F1值来选择ϵ 3. 选出ϵ后,对测试集进行预测,计算异常检测系统的F1

异常检测和监督学习对比

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

选择特征

  1. 若数据不符合高斯分布,可使用对数化,或指数化转化成高斯分布的情况
  2. 手动增加特征

多元高斯分布

  1. 对于训练集
    μ=1mi=1mx(i)
    Σ=1mi=1m(x(i)μ)(x(i)μ)T
  2. 对于新实例
    p(x)=1(2π)n2|Σ|12exp(12(xμ)TΣ1(xμ))
    如果p(x)<ϵ,标记为异常
高斯分布 多元高斯分布
不能捕捉特征之间的相关性,但可通过特征组合的方法解决 自动捕捉特征间的相关性
计算代价低,能适应大规模特征 计算代价高
必须m>n,否则协方差矩阵不可逆,通常m>10n,另外冗余特征也会导致协方差矩阵不可逆

推荐系统

一些标记
nu代表用户的数量
nm代表电影数量
r(i,j)如果用户j给电影i评过分则r(i,j)=1
y(i,j)代表用户i给电影j的评分
m(j)代表用户j评过分的电影总数

基于内容的推荐系统

针对每个用户训练一个线性回归模型,如θ(i)是第1个用户的参数,
于是:
θ(i)用户j的参数向量
x(i)电影i的特征向量
对于用户j和电影i,我们预测评分为:(θ(j))Tx(i)
为了学习所有的参数

minθ(i),...,θ(nu)12i=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(θk(k))2

协同过滤算法

优化目标同时对xθ进行

J(x(1),...,x(nm),θ(1),...,θ(nm))=12(i,j):r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2i=1nmk=1n(xk(i))2+λ2j=1nuk=1n(θk(j))2

minx(1),...,x(nm),θ(1),...,θ(nm)J(x(1),...,x(nm),θ(1),...,θ(nm))

学习参数时要去掉截距量x0,且xRn,θRn
实现协同过滤算法
1. 将x(i),i=1,2,...,nm,θ(j),j=1,2,...,nu设为小的随机值
2. 使用梯度下降或其他算法优化J(x(i),θ(j))
3. 对于拥有参数θ和特征x的用户,预测评分为θTx