机器学习笔记(吴恩达版)

img

All in AI

0x00 机器学习

Arthur Samuel:在没有明确设置的情况下,使计算机具有学习能力的研究领域。
Tom Mitchell:计算机从经验E中学习,解决某一任务T,进行某一性能度量P,通过P测定在T上的表现因经验E而提高。

0x01 监督学习

定义:我们给算法一个数据集,其中包含了正确答案,算法的目的就是给出更多的正确答案。

  • 回归问题:设法预测连续值的属性。
  • 分类问题:设法预测一个离散值的输出(0或者1,2…)。

0x02 无监督学习

定义:无监督学习是一种机器学习方法,它处理的是未标记的数据,目的是发现隐藏的结构、模式或数据内在的分布特征。

涉及的算法:

  • 聚类算法
  • 鸡尾酒会算法 $[W,s,v]=svb((repmat(sum(x.^*x,1),size(x,1),1).^*x)^*x’)$

0x03 线性回归

假设函数:
$$
h_\theta(x)=\theta_0+\theta_1x
$$

代价函数:
$$
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2
$$

通过计算全部样本得出的$h_\theta(x)$与y的差值的平均值,可以描述出当前$\theta$值与预期的偏移。

0x04 梯度下降算法

$$
\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)
$$

对$J(\theta_0,\theta_1)$求导,得到下面的公式(2在求导时会被消掉):

$$
\theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})
$$

$$
\theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)}){\cdot}x^{(i)}
$$

通过不断迭代,找出一组$\theta$值,使得$J(\theta_0,\theta_1)$值为最小。

img

0x05 矩阵的加减法

矩阵的维度需要一致,矩阵$A_{mn}$和矩阵$B_{xy}$,应该$m=x,n=y$。

0x06 数和矩阵的乘法(标量乘法)

数与矩阵中的每个数据相乘。

0x07 矩阵向量相乘

矩阵和向量相乘,矩阵$A_{mn}$,向量$x_{n*1}$,矩阵的列数需要等于向量的行数,也就是$n=n$,矩阵中第一行的元素分别与向量中的列的元素相乘,最后相加,得出向量y的第一行元素,以此类推,最终得出列向量y。

0x08 矩阵和矩阵的相乘

矩阵和矩阵相乘,矩阵$A_{mn}$,矩阵$B_{no}$,矩阵A的列数需要等于矩阵B的行数,也就是$n=n$,相乘后得出一个矩阵$C_{mo}$

计算的本质是把矩阵B拆分成多个列向量,按照矩阵和向量相乘的方式。最后在一起组合一个新的矩阵。

0x09 矩阵乘法特征

不能应用乘法交换律:$A*B\neq B*A$

可以使用乘法结合率:$A*B*C=(A*B)*C=A*(B*C)$

单位矩阵,对角线是1,其余单位都是0。

0x0A 矩阵的逆运算与转置运算

如果$A_{mm}$矩阵中$m=m$(也叫方阵),则存在它的逆矩阵,它们相乘得到一个单位矩阵。(如果矩阵中都是0则没有逆矩阵。)
$$
A(A^{-1})=A^{-1}A=I
$$
如果$A_{mn}$是一个$m*n$的矩阵,让$B=A^T$,则B是一个$n*m$的矩阵,并且$B_{ij}=A_{ji}$
$$
A=\left[\begin{matrix}1&2&0\\3&5&9\end{matrix}\right]\qquad
B=A^T=\left[\begin{matrix}1&3\\2&5\\0&9\end{matrix}\right]
$$

0x0B 多个特征量的线性回归

多元线性回归方程可以看作两个向量相乘的内积。
$$
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+…+\theta_nx_n
$$

$$
x_0=1\qquad x = \left[\begin{matrix}x_0\\x_1\\x_2 \\ …\\x_n\end{matrix}\right]\qquad\theta=\left[\begin{matrix}\theta_0\\ \theta_1\\ \theta_2\\ …\\ \theta_n\end{matrix}\right]\qquad h_\theta(x) = \theta^Tx
$$

0x0C 多元梯度下降

当特征值数量 $n\geq1$ 时
$$
\theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
$$

$$
\theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}
$$

$$
\theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_1^{(i)}
$$

$$
\theta_2:=\theta_2-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_2^{(i)}
$$

$$

$$

0x0D 特征缩放

将特征的取值约束到-1到+1的范围内,每个特征值除以最大值减去最小值的差。

均值归一化:
$$
x_1:=\frac{x_1-\mu_1}{s_1}
$$
$\mu_1$是x1的平均值,$s_1$ 是x1范围内最大值减去最小值。

特征缩放的目的是让梯度下降的速度更快。

0x0E 学习率

梯度下降的中的 $\alpha$ 表示学习率,可选值:0.001,0.003,0.01,0.03,0.1,0.3,1。学习率每次增大是前一次的3倍。

0x0F 多项式回归

$$
h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3
$$

$$
h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3
$$
$$
h_\theta(x)=\theta_0+\theta_1(size)+\theta_2(size)^2+\theta_3(size)^3
$$
$$
x_1=(size)
$$
$$
x_2=(size)^2
$$
$$
x_3=(size)^3
$$

0x10 正规方程

$$
\theta=(X^TX)^{-1}X^Ty
$$

在Octave中求解:pinv(X'*X)*X'*y,在正规方程中不需要特征缩放。

当特征量在10000左右时候考虑用梯度下降,逻辑回归也不适用正规方程求解。

0x11 正规方程不可逆的解决办法

  • 存在线性依赖的特征值:删除多余的线性依赖的特征
  • 样本少,特征值多:减少特征值或正则化

0x12 Octave基础用法

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
> %注释
> 1 ~= 2 %不等于
> xor(1,0) %异或
> PS1('>> '); %更改提示符
> a=3; %分号表示对当前的输入不进行回显
> disp(a); %打印变量a
> disp(sprintf('2 decimals: %0.2f',a)) %打印字符串
> format long %显示小数点后面更多位
> format short %显示小数点后面更少位
> A = [1 2;3 4;5 6] %创建一个3*2的矩阵
> A = [1 2;
> 3 4;
> 5 6] %跨行创建矩阵
> v = [1 2 3] %创建一个向量,1*3
> v = [1;2;3] %创建一个向量,3*1
> v = 1:0.1:2 %创建一组值,从1开始到2,每次增加0.1,最终是一个行向量
> v =1:6 创建一个1-6的行向量
> ones(2,3) %创建一个2*3的矩阵,每个元素的值都是1
> w = zeros(1,3) %创建一个1*3的矩阵(向量),每个元素都是0
> w = rand(1,3) %创建一个1*3的矩阵(向量),每个元素是介于0到1之间的随机值
> w = randn(1,3) %创建一个1*3的矩阵(向量),每个元素服从高斯分布的随机值
> sqrt(10) %开根号
> hist(w) %对w绘制直方图
> hist(w,50) %对w绘制直方图,显示50个数据
> eye(4) %生成一个4*4的单位矩阵
> size(A) %显示矩阵A的行列数,输出的形式是一个向量
> size(A,1) %得到矩阵A的行列数,行列数是一个向量,显示这个向量的第一个元素,实际上等同于得到矩阵A的行数
> size(A,2) %得到矩阵A的行列数,行列数是一个向量,显示这个向量的第二个元素,实际上等同于得到矩阵A的列数
> length(A) %矩阵A维度最大的,行或列
> pwd %当前路径
> ls %当前路径下文件
> load <filename> %加载文件数据
> load('filename') %加载文件数据,同上
> who %显示所以变量
> whos %显示所以变量,包括更详细的信息
> clear A %删除变量
> a = A(1:4) %从A中取4个变量赋值给a,顺序是从第一列开始,以此取值。
> save hello.mat a; %把a存储为hello.mat
> save hello.txt a -ascii; %把a存储为hello.txt,并指定编码格式
> A(3,2) %索引第3行第二列的元素
> A(2,:) %索引第2行的全部元素
> A(:,2) %索引第2列的全部元素
> A([1 3],:) %索引第1行和第3行的全部元素
> A(:,2)=[10;11;12] %索引第2列的全部元素,并对其重新赋值
> A=[A,[10;11;12]] %给A右侧额外增加一列
> A(:) %把A中全部元素,放在一个单独的列向量中
> C = [A B] %把A、B矩阵组成一个C矩阵,左右排列
> C = [A;B] %把A、B矩阵组成一个C矩阵,上下排列
> A = [1 2;3 4;5 6]
> B = [11 12;13 14;15 16]
> C = [1 1;2 2]
> A*C %矩阵相乘
> A.*C %矩阵A的元素与对应位置的矩阵B中的元素相乘,.一般表示元素的运算
> A.^2 %矩阵A中的每个元素都进行平方
> v = [1;2;3]
> 1./v %表示用1除以v中的每个元素
> log(v) %对v中所有的元素进行求对数运算
> exp(v) %以e为底数,以v中元素为指数的幂运算
> abs(v) %v中所有元素的绝对值
> -v %等于-1*v
> v+ones(length(v),1) %等同于 v+1
> A' %矩阵A转置
> val = max(v) %返回v中最大的元素,当max对矩阵使用时候,会得到每列的最大值
> [val,ind] = max(v) %返回v中最大的元素和它的索引
> v<3 %v中每个元素与3比较,返回0,1表示布尔值
> fidn(v<3) %找出v中所有小于3的元素,并返回它们的索引
> A=magic(3) %得到一个幻方矩阵,这个矩阵的任意行列对角线相加起来都是同样的数
> [r,c]=find(A>=7) %找到矩阵中大于7的元素,用r,c两个向量表示目标元素的索引位置
> sum(v) %v中所有元素求和
> prod(v) %v中所有元素求乘积
> floor(v) %向下取整
> ceil(v) %向上取整
> max(rand(3),rand(3)) %两个矩阵中最大的元素组成的矩阵
> max(A,[],1) %得到每列的最大值,这里的1表示从A第一维度取值
> max(A,[],2) %得到每行的最大值
> max(max(A)) %矩阵中最大的值
> sum(A,1) %得到每一列的和
> sum(A,2) %得到每一行的和
> flipud(A) %矩阵垂直翻转
> pinv(A) %矩阵A的逆矩阵

0x13 Octave绘制图形

1
2
3
4
5
> t = [0:0.01:0.98]
> y1 = sin(2*pi*4*t);
> plot(t,y1) %绘制一个正弦图
> y2 = cos(2*pi*4*t);
> plot(t,y2) %绘制一个余弦图
1
2
3
4
5
6
7
8
9
> plot(t,y1) 
> hold on;
> plot(t,y2,'r') %同时绘制正弦图和余弦图
> xlabel('time') %标记横坐标
> ylabel('time') %标记纵坐标
> legend('sin','cos') %增加图例
> title('my plot') %增加标题
> print -dpng 'myPlot.png' %保存图片
> close %关闭图片
1
2
> figure(1);plot(t,y1);
> figure(2);plot(t,y2); %同时展示两个图
1
2
3
4
5
> subplot(1,2,1) %将图像分为1*2,并使用第一个区域
> plot(t,y1)
> subplot(1,2,2) %将图像分为1*2,并使用第二个区域
> plot(t,y2)
> axis([0.5 1 -1 1]) %调整刻度,第一组表示x轴,第二组表示y轴
1
2
3
4
> clf %清除图形
> A = magic(5)
> imagesc(A) %将矩阵显示为一个色彩格子
> imagesc(A),colorbar,colormap gray; %将矩阵显示为一个灰度格子,并且使用灰度标记轴的变化,“,”可以连接多个命令同时执行。

1. for循环

1
2
3
4
> v = zeros(10,1)
> for i = 1:10
> v(i) = 2^i
> end;

2. while循环

1
2
3
4
5
> i = 1;
> while i <= 5,
> v(i) = 100;
> i=i+1;
> end;

3. break

1
2
3
4
5
6
7
8
> i = 1;
> while true
> v(i) = 999;
> i = i+1;
> if i == 6,
> break;
> end;
> end;

4. if-else

1
2
3
4
5
6
7
8
> v(1) = 2;
> if v(1) == 1,
> disp('The value is one')
> elseif v(1) == 2,
> disp('The value is two')
> else,
> disp('The value is not one or two')
> end;

5. 函数

在Octave下定义函数需要创建一个文件,用你的函数名来命名,用.m后缀结尾。

1
2
3
function y = squareThisNumber(x)

y=x^2

想要正确调用这个函数,需要这个函数文件在当前目录下。或者添加搜索路径:

1
> addpath('filepath')

Octave函数可以返回多个值

1
2
3
4
function [y1,y2] = squareAndCubeThisNumber(x)

y1=x^2
y2=x^3

Octave中的损失函数实现

1
2
3
4
5
6
7
8
function J = costFunctionJ(X,y,theta)

m = size(X,1);
predictions = X * theta;

sqrErrors = (predictions-y).^2;

J = 1/(2*m)*sum(sqrErrors);

0x14 分类

使用线性回归对分类问题来说不是一个好的方法,对于分类来说,Y应该是0或1,使用线性回归会出现$h_\theta > 1$ or $h_\theta < 0$的情况。对于分类问题,会采用logistic回归算法,它的特点在于输出范围是$0\leq h_\theta(x)\leq 1$。logistic回归是一种分类算法,名字带回归是因为一些历史原因,请不要对此产生疑惑。

0x15 假设陈述

对于二元分类来说,需要控制$0 \leq h_\theta(x) \leq 1$,对之前的线性回归做调整:

$$
h_\theta(x) = g(\theta^Tx)
$$
实际上g的函数如下:
$$
g(z) = \frac{1}{1+e^{-z}}
$$
g的函数被称为Sigmoid function或Logistic function,这两者的含义一样。

最终的假设的函数形式如下:

$$
h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}
$$

0x16 决策边界

决策边界是假设函数的一个属性。 使用高阶多项式可以让你得到非常复杂的决策边界。

0x17 logistic回归的代价函数

$$
J(\theta) = \frac{1}{m}\sum_{i=1}^{m}Cost(h_\theta(x),y)
$$

$$
Cost(h_\theta(x),y) =
\begin{cases}
-\log(h_\theta(x)), & \text{if y = 1} \\
-\log(1-h_\theta(x)), & \text{if y = 0}
\end{cases}
$$

0x18 简化的代价函数与梯度下降

当$y=0$或1时候,总是存在如下公式:

$$
Cost(h_\theta(x),y) =-y\log(h_\theta(x))-(1-y)\log(1-h_\theta(x))
$$

可以得到代价函数:

$$
J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\log(h_\theta(x^{(i)}))+(1-y^{(i)})\log(1-h_\theta(x^{(i)}))
$$

梯度下降求$\theta_j$:

$$
\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta)
$$

对$J(\theta)$求导:

$$
\theta_j:=\theta_j-\alpha\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
$$

这个时候可以发现logistic回归的梯度下降函数和线性回归的梯度下降函数一样

0x19 高级优化

高级优化算法能大大提高logistic回归运行的速度。

  • Gradient descent 梯度下降法
  • Conjugate gradient 共轭梯度法
  • BFGS Broyden–Fletcher–Goldfarb–Shanno
  • L-BFGS Limited Broyden–Fletcher–Goldfarb–Shanno

特点:

  • 不需要手动选择学习率$\alpha$
  • 收敛的速度远远快于梯度下降