1. Introduction
1.1 Welcome
如今机器学习被大规模应用于:
- 数据挖掘(网站点击,医学记录,生物学,工程)
- 一些无法通过编程实现的功能(自动驾驶,手写识别,NLP,CV)
- self-customizing programs(各种网站的推荐系统)
- 辅助理解人脑
这是一个快速发展的领域,我看好
1.2 What is machine learning
常用的机器学习包括监督学习算法和无监督学习算法。
此外还有增强学习和推荐系统。
1.3 Supervised Learning
监督学习的样本是带有标签的(即我们知道预测所对应的真实值是多少)。
1.4 Unsupervised Learning
无监督学习的样本是没有标签的(即我们不知道真实值)。
2. Linear Regression with one variable
2.1 Model Representation
h = theta`x
2.2 Cost Function
线性回归的J采用了平方误差公式(squared error function)
2.3 Cost Function - Introduce I
代价函数J衡量了训练样本的预测值与真实值之间的整体误差。当拟合的越差的时候,J越大,也就是代价越高。那么通过找到令J最小的theta,也就找到了对训练样本集最好的拟合。
2.4 Cost Function - Introduce II
…
2.5 Gradient Descent
梯度下降法是一种用来找到J最小值的常用方法。其实它的思路非常简单,我们不断迭代,每次迭代令J向减小最快的方向(即梯度方向)移动,直到找到一个最小值(这个值可能是局部最小值)。
在梯度下降法的初始位置不同时,最后可能获得不同的最小值。
在实现梯度下降法时,应该同时更新每个theta的分量(否则就不是向着梯度的方向移动)。
2.6 Gradient Descent Intuition
在实现梯度下降法时,选取学习速率alpha是个技术活。alpha太小,则求解太慢。alpha太大,则可能造成发散(当由于alpha过大造成我们超过最小点时,新的位置的梯度如果更大,则会再次越过最小点,并往复下去,造成发散)。
尝试不同的alpha值,并画出相应的学习曲线选择合适的alpha的一种方法。一般采用3倍的方式选择alpha,比如0.3, 0.1, 0.03, 0.01
一个固定的alpha也可以让梯度下降法收敛于最小值,原因是随着位置趋近于最小值,梯度也趋近于0。
2.7 Gradient Descent for Linear Regression
线性回归的J是一个bowl shaped图形(弓形),更正式的名字是convex function(凸函数)。这种形状只有一个全局最优解,没有局部最优解。所以通过梯度下降法我们总是可以收敛到全局最优解。
到此位置我们所使用的Gradient Descent其实有一个更准确的名字–Batch Gradient Descent(批量梯度下降)。批量的意思是,每次迭代,我们都考虑所有样本的影响。
2.8 What`s next
接下来会复习下线性代数,因为线性代数非常适合处理机器学习中的大量参数问题。
3. Linear Algebra Review
3.1 Matrices and Vectors
3.2 Addition and Scalar Multiplication
3.3 Matrix Vector Multiplication
3.4 Matrix Matrix Multiplication
3.5 Matrix Multiplication Properties
A * B not eq B * A
A * B * C = A * (B * C)
A * I = I * A = A
3.6 Inverse and Transpose
只有方阵才可能有逆矩阵(换句话来说,有逆矩阵的矩阵一定是一个方阵)。
没有逆矩阵的矩阵叫做奇异矩阵或者退化矩阵。
4. Linear regression with multiple variables
4.1 Multiple features
4.2 Gradient Descent for Multiple Variables
4.3 Gradient descent in practice I: Feature Scaling
在应用梯度下降法时,我们需要先观察下各个特征的取值范围。如果各个特征的取值范围差距很大,会造成梯度下降法收敛很慢。这时候就需要对特征作缩放。
特征缩放的目的是将各个特征的取值范围映射到[-1,1]。不过也不是非得在这个区间合理。按照吴恩大的经验,[3,3]和[-1/3,1/3]这样的区间都是合理的。
特征缩放常采用如下方式映射:
x = x / x_max
这样就映射到了[-1,1]
其实更常规的方式是均值归一化(mean normalization)
x = (x - mu) / theta
这样就映射到[-0.5, 0.5]
4.4 Gradient descent in practice II: Learning Rate
选择一个合适的的学习速率是个技术活,一般按照X3的规律来选,例如:0.001,0.003,0.01,0.03,0.1 …
太小的alpha会导致收敛太慢
太大的alpha则有可能导致完全不收敛
那么如何来确认当前算法通过迭代有收敛呢?即如何来debug呢?
那就是画学习曲线。通过观察学习曲线我们可以确定算法在迭代后是否有收敛。同时也可以用来选择一个合适的学习速率。
当然也不是没有自动确认是否收敛的方法。那就是通过check每次J的变化量。如果变化量已经小于一个很小的值(比如1e-3),则认定当前算法已经收敛。但这个最小值的选择就有点困难了。
4.5 Features and Polynomial Regression
当处理多特征的回归时,我们面临一个问题----特征选择,即采用哪些特征,我们甚至可以由原特征创造新的特征来进行回归。
多项式回归就是源于这种思想。通过将各种特征组合,我们可以创造新的特征,并更好的拟合数据。
4.6 Normal Equation 标准方程法
在求解线性回归的参数时,除了梯度下降法,标准方程法是另外一种选择。而且相对于梯度下降法,标准方程法还有一些优点,比如
- 不需要设置alpha
- 不需要作均值归一化
但是它也有局限。当特征数n比较大时(比如大约1e4),标准方程法的计算会变得很慢(标准方程法的计算量是O(n^3)),而此时就不得不采用梯度下降法。
按照吴恩达的经验,1e4就是这个选择的分解点。
标准方程法的公式如下:
theta = ( X’X)inverse * X’ * y
其中X称作design matrix(即样本设计出来的矩阵)
4.7 Normal equation and non-invertibility
如果X‘X不可逆怎么办呢?
首先这种情况极少发生。
其次假设这种方法发生了,它通常可能是由于存在重复的特征(如倍数关系的特征),对于这种情况删除冗余特征就可以了。另外导致不可逆的原因也可能是因为m < n,即相对于样本数特征数太多了,这时可以删除一些特征或进行正则化处理。
在使用octave时,即使X‘X不可逆,pinv()的计算结果也是正确的。所以不可逆的为难题无需特别关注。
5. Octave Tutorial
5.1 Basic Operations
不等于的符号有点特殊 ~=
XOR 异或
disp 命令可以输出一些复杂的输出,比如
disp(sprintf(‘2 decimals: %0.2f’, a))
控制长短的命令:
format long
format short
矩阵和向量赋值:
;代表在矩阵中换行
1:6 % 1 2 3 4 5 6
1: 0.1 : 6 % 1 1.1 1.2 … 5.9 6
ones(2,3)
1 1 1
1 1 1
2*ones(2,3)
rand(3,3)
randn(1,3) % 高斯分布
hist()
eye(3)
1 0 0
0 1 0
0 0 1
5.2 Moving Data Around
size(A) % 例如1 2,说明A是一个1X2的矩阵
length(A) % 返回A最大维的长度
load .dat
load(’.dat’)
who % 显示当前工作空间所有变量
whos % 更详细的现实
clear * % 清除特定变量
clear % 清除所有变量
save *.mat v % 将变量v存储为一个mat文件(二进制的)
save hello.txt v - ascii % 存储为一个txt文件
A(3,2)
A(2,:)
A([1,3],: )
A( : ) % 所有元素输出为一个列向量
A = [ A B]
A = [ A ; B]
5.3 Computing on Data
A*B % 矩阵乘法
A.*B % 对应元素乘法
A+1 % 每个元素+1
A‘ % 转置
a= [ 1 15 2 0.5]
max(a) % 15
[val,ind] = max(a)
a<3 % 1 0 1 1
find(a<3) % 1 3 4
magic()
sum() % 求和
prod() % 去累乘
floor() %0.5 --> 0
ceil() % 0.5–> 1
max(A) % 每列最大值
max(A,[],1) % 每列最大值
max(A,[],2) % 每行最大值
max(max(A))
max(A(: ))
sum(A,1) % 每一列的总和
sum(A,2) % 每一行的总和
pinv(A) % 求伪逆
5.4 Plotting Data
plot()
xlabel()
ylabel()
legend()
title()
subplot()
axis()
print -dpng ‘myplot.png’
imagesc(A) % 图像化矩阵
colorbar
colormap gray