0%

机器学习-笔记

Coursera:Stanford University-Andrew Ng-Machine Learning 笔记。
代码库:对应的学习资料,以及自己写的代码。
持续更新。

Introduction

Supervised machine learning
给定数据集,并且已知正确的输出应该是什么样子的,对于输入和输出的关系有了一个基本的想法。

有监督的学习通常被分为回归和分类两个问题,在一个回归的问题中,我们尝试在连续的输出中预测结果,意味着我们试着在把输入的变量映射到连续的函数中。
在一个分类的问题中,我们试着在离散的输出的预测结果,换句话说,我们试着把输入映射到离散的分类中。

Unsupervised machine learning
无监督的学习允许我们对可能的结果并没有预期。聚类:需要从没有人工标记的数据中自己发现规律并且把他们分成不同的部分。非聚类:特征识别。

Linear Regression with One Variable

线性回归是一种监督学习,因为我们对每个x给了正确的y值对应(例如房价预测,其结果是一个连续变量,是回归问题。而肿瘤是否恶性,是分类问题)。

一元线性回归:$h_\theta = \theta_0 + \theta_1x$ ,给定m个已知的数据对,拟合一个y关于x的一次方程,对每个单独的x,能预测一个对应的y值。

均方误差损失函数:$J(\theta_0, \theta_1) = {1 \over 2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2$ ,在整个给定的数据集的基础上,判断我们拟合的一次方程与实际值之间偏差的大小。我们的目标是找到合适的$\theta_0$和 $\theta_1$使得损失函数最小,也就是模型与实际拟合的最好。两个变量的损失函数可以在一个三维的坐标系画3D图。或者在二维的坐标系中画一个等高线图,图上每同一根线上的点代表损失函数的值相同。

梯度下降算法:for j = 1 and j = 0, repeat until convergence: $\theta_j := \theta_j - \alpha {∂ \over ∂\theta_j} J(\theta_0, \theta_1)$。我们已经有了一个假设的函数模型,然后有了一个方法(均方误差损失函数)来判断这个模型拟合的好坏程度。接下来我们要估计函数模型中的参数,使模型与实际拟合的最好。梯度下降算法每次循环实际上是每个参数减去对应参数偏导数和一个常数α(下降步幅)的乘积,最终会收敛在局部最优。但如果这个常数α过大会导致无法收敛甚至发散,过小则运行过慢。特别要注意的一点是所有的参数要同时更新。另:这里用的batch gradient descent:即每次都会使用全部的训练数据。

梯度下降算法会收敛在局部最优。但是线性回归的损失函数是凸函数(convex quadratic function),局部最优即全局最优,所以通过梯度下降算法找到最优解。

Linear Algebra Review

矩阵,向量的标记体系。
矩阵间的加减法,矩阵和常量间的四则运算。
矩阵和向量的乘法。矩阵间的乘法。
矩阵间的乘法没有交换律,不能随意交换前后位置。有结合律,可以先计算后面的部分。
单位矩阵:行列数相等(方阵),对角线全为1。
逆矩阵:矩阵(方阵)和矩阵的逆相乘结果为单位矩阵。
转置矩阵:行列互换。
MATLAB中矩阵相关的基本操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
% Initialize matrix A 
A = [1,2,0;0,5,6;7,0,9]

% Transpose A
A_trans = A'

% Take the inverse of A
A_inv = inv(A)

% Initialize a 3 by 3 identity matrix
I = eye(3)

% Get the dimension of the matrix A where m = rows and n = columns
[m,n] = size(A)

% Now let's index into the 2nd row 3rd column of matrix A
A_23 = A(2,3)

Linear Regression with Multiple Variables

多元线性回归和一元线性回归的一些差别。符号标记体系的异同。
多变量的梯度下降实际上也就是对每个参数分别进行,每次都对单个参数求偏导数。
梯度下降的几个技巧:

特征缩放(Feature Scaling):当不同的变量取值范围差异过大的时候,各参数每次梯度下降的步幅也差异很大,例如反应在二元线性回归的损失函数的等高线图上就是一个很扁的椭圆,会使得梯度下降的步骤增加,效率降低。实际应用中,变量取值上下限向外取±3或是向内取±1/3(相较于1而言)是安全的,超过这个范围可以考虑对数据进行缩放。缩放的方法:1. 特征缩放,每个变量取值除以该变量取值的范围(最大减最小)(或是标准差,若使用标准差的话结果有差异)。2. 均值归一化,每个变量减去该变量所有取值的平均值。可以两个结合使用。

学习率的选择(Learning Rate):学习率也就是梯度下降中的α参数。这个参数过小会导致学习的速度过慢,如果过大则并不会在每次循环中使得损失函数减小,甚至最终损失函数并不会收敛。选择一个合适的α值需要多次尝试,并且结合损失函数-循环次数的图来判断。例如给定一个α的序列0.001, 0.003, 0.01, 0.03, 0.1, 0.3这样,每次增加3倍,同时结合图判断损失函数是否收敛。(这里还有一个点,即判断损失函数是否收敛的标准,可以自动测试,也就是每次循环下降的幅度小于某个值,但是这个阈值很难判断,最终还是靠图来自己判断)。

特征和多项式回归
构建模型的过程中不一定只用到一元的变量,我们可以用已有的变量的二次方,三次方,甚至平方根等作为新的变量加到模型中来对结果进行拟合。重要的是如果采用了这种方式那么对变量的缩放就十分重要。

正规方程(Normal Equation)
$\theta = (X^T X)^{-1} X^T y$ 可以用正规方程直接计算每个参数的最优解。推导过程:线性回归之Normal Equation(矩阵求导与线性代数视角)

梯度下降与正规方程两种方法对参数进行优化的比较:梯度下降需要选择学习率α并且需要多次迭代,正规方程不用选择学习率也不用迭代,直接可以计算得到最优解。最重要的差别在于:梯度下降算法的时间复杂度为$O(kn^2)$,而正规方程算法的时间复杂度为$O(n^3)$,需要计算$X^T X$这个矩阵的逆。所以在n超过100000时就可考虑从正规方程改为梯度下降。

正规方程的不可求逆的问题:若$X^T X$是奇异矩阵,不可逆怎么办?Octave中的函数pinv()会在矩阵不可逆时依然给出一个解(严格求逆的函数为inv())。具体的数学问题暂不讨论。会出现$X^T X$不可逆的情况有两种:1. 有多余的变量(部分变量存在共线性),所以去掉共线性的变量。2. 对于给出的训练数据来说,变量的数量太多了,即$m \le n$,这个时候要么删除部分变量,要么对变量进行正则化。

MATLAB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
% 加 减 乘 除(非取整) 指数 圆周率
+ - * / ^ pi

% 逻辑运算:相等 不等 与 或
== ~= && ||

% 变量直接赋值,动态变量,不用定义

% 打印变量,也可直接输入变量名,自动返回
disp(v)

% 格式化输出变量
disp(sprintf("2 decimals: %0.2f", a))

% 调整小数位数
format long / short

% 设置矩阵 分号表示分行
A = [1, 2, 3; 4, 5, 6]

% 取a和b之间的等差c序列
v = a : b :c

% 全为1的矩阵 全为0的矩阵 单位矩阵
ones(m, n) zeros(m, n) eys(m, n)

% 随机数矩阵 高斯分布随机数
rand(m, n) randn(m, n)

% 查看帮助
help eye

% 查看矩阵的维度 查看矩阵(向量)较大的维度
size(A) length(A)

% 查看变量 变量详细信息 清除变量 取部分变量(冒号表示连续取,逗号表示维度)
who whos clear A(1: 2) A(1, 3)

% 读入数据 存入数据(文件名可以不用加引号)
load save 文件名 变量名

% 向量间对应位置元素的计算 在运算符前面加上一个点
.* ./

% 取自然对数 取指数函数 取绝对值
log(v) exp(v) abs(v)

% 按逻辑表达式取值(取索引号)
find(A < 3)

% 生成一个每行每列对角线的和都一样的矩阵 把矩阵水平翻转
magic(n) flipud(A)

% 求和 求积 向上取整 向下取整
sum(A) prod(A) ceil(A) floor(A)