Andrew Ng 机器学习记录共三篇。本篇是关于 Andrew Ng 机器学习网易云公开课前 6 章的总结。全部课程共 18 章。观看课程视频可点击 Coursera 和网易云课堂。网易云课堂目前仅翻译到正则化,这篇小结也只到正则化之前,点击 B 站获取完整版。
在进行小结之前,我们先看一下本次小结内容的目录(目录中文翻译源自网易云课堂):
· Introduction(绪论:初识机器学习)
· Linear Regression with One Variable(单变量线性回归)
· Linear Algebra Review(线性代数回顾)
· Linear Regression with Multiple Variables(多变量线性回归)
· Octave/Matlab Tutorial(Octave/Matlab教程)
· Logistic Regression(Logistic回归)
Introduction
- 监督学习:给出许多正确的值(标签),每一个例子(横坐标)都有一个对应的正确的值(纵坐标),当再给出一个新例(横坐标)时,预测它正确的值是多少(纵坐标)。即学习如何预测。
- 无监督学习:给出一堆数据,并不知道这些数据用来做什么,总之是一堆没有标签的数据,算法自己进行判断这些将这些数据分开,形成不同的类。例如把混在一起的声音分开就是一种无监督学习。
Linear Regression with One Variable
- 回归分析
用来分类,它的结果是一些离散值。
举个例子:判断肿瘤的恶性良性就可以视为一种分类,结果有良性 (0)、肿瘤类型 A (1)、肿瘤类型 B (2) 等。特征是指肿瘤大小、肿瘤厚度等(我们用机器学习算法不止是想处理3-5个特征,而是因为想要处理无穷个特征)。
- 聚类算法
举个例子:社交网络判断你们是否认识并推荐好友,如果你用 facebook 的话应该对这一点感觉很强烈。
- 代价函数
通过计算得出用哪种直线最贴合数据。
选择两个参数来得出直线,使平方差最小,J 就是代价函数(Cost function),代价函数也被称作平方误差函数 (Squared error function)。系数中 m 是样例个数,作用是求平均值。
代价函数的意义
假设函数 h(x) 是关于 x 的函数,代价函数 J 是关于系数 的函数。
一组 值对应一个假设函数 h(x),跟数据有一个直线关系,代价函数相当于对误差的评估,要做的就是找到一个 值,使得代价函数 J 的值最小,我用这时的 值所得到的假设函数 h(x) 来拟合数据。
机器学习要做的就是通过给出的数据用算法自动找到 J 最小值时的这个点,而不需要人为的计算参数。
- 梯度下降法 (Gradient descent)
- 给出和的初值
- 每次改变一点直到到达局部最优解
初值偏移的方位稍有不同可能会到达不同的局部最优解,达到局部最优解时斜率为0 即偏导为0,不在改变。
在运用梯度下降法时需注意:
· 同时更新和
· 为学习率,决定下山的一步迈多大(
每次移动多少),恒为正
·为偏导,有正有负。
将梯度下降法通俗的解释可以说:我站在山的某一处,要找到最快下山的路,一是我下一步迈向哪个方向;二是这一步迈多大,达成到达最低点的目的,这就是梯度下降法做的。
梯地下降法也可用于计算其他函数的代价函数,而不仅是以上作为例子介绍的回归函数。
- 将梯度下降法用在回归函数中
梯度下降法会陷入局部最优,而回归函数是一个凸函数(它的图像形状是一个碗状),只有一个全局最优解,这时用梯度下降法可以得到一个最小值,即要求的值。
梯度下降法是一种迭代算法,逐步计算更新回归函数里的,其中偏导项是斜率。
因此在上图中,右边红色的点每移动一下,左边的直线会随斜率的改变而改变,红色的点到达最低点时,直线最好的拟合了数据。
Linear Algebra Review
- 关于矩阵
在算法学习中需要有把数据在函数中的使用拆成矩阵的计算能力,向量也可视为列数为 1 特殊的矩阵,关于线性代数的知识这里不再赘述。
Linear Regression with Multiple Variables
- 多元线性回归模型
关于特征范围的预处理和学习率的选取。
· 从 1 个特征值拓展到多个特征值
· 上标表示第i个特征,下标表示第 i 个特征的第几个元素
· 多个特征在相近的范围内,梯度下降法才可快速收敛
· 采用均值归一化处理
· 可以用迭代次数和J()的函数来判断梯度下降法是否收敛,也可以用小于阈值的方法自动判断,但阈值一般难以设定,所以推荐用下图左边观察图像的方法。
· 学习率过小,收敛将变慢,过大会导致J()不是在下降,出现这种情况时(如下图左侧图像所示),解决方法是使用更小的,尝试一系列的值,Ng 使用 3 的倍数来逐个测试,在最大和最小的值范围内找大最大可能值的(或比它小一点也是可以的)。
- 多项式回归
关于用二次函数、三次函数等拟合。
此时注意特征缩放,适合数据走向的函数图形,你可以自己选择特征,可以自己设计特征(如房屋面积 = 长 * 宽) 。
- 正规方程
不同于梯度下降法,它不需要重复多次运算,可以一次性求出的解析解,原理是偏导数为 0 时求出最小值。
用上图红色框中的式子计算,再分别写出对应的 x 和 y 。
如果有特别多(百万级)的特征时则用梯度下降法(Ng 以一万为界考虑)。
当出现不可逆的情况时,可能是有多余的特征值或有过多的特征值(样本数 m < 特征数 n),解决方法是删除特征值或正则化。
用 Octave 里的 pinv 函数不会出现这种情况,因为 pinv 函数求的是伪逆(pesedo-inverse)。
Octave/Matlab Tutorial
这里用简单的语言介绍 Octave 的使用。推荐查看 Octave 文档学习使用。
逻辑运算
1 == 2 %表示注释,false,输出 ans = 0,用0来表示假
1~= 2 %1不等于2,不等号“~=”
xor(1, 0) 异或运算
PS1('>>>>');
修改提示符,引号内设置为你喜欢的提示符,我将提示符修改为 '>>>>'
。
Octave 变量
赋值 a = 3 会打印
a = 3; 有分号不打印 隐藏了
>>>>a = pi;
>>>>a %按a输出下面
a = 3.1416
disp(a) %disp是一个打印命令
>>>>disp(a)
3.1416
>>>>disp(sprintf('2 decimals: %0.2f', a )) %保留 2 位小数的写法 %0.2f
2 decimals: 3.14
>>>>format long %输入format long,让字符串显示默认位数
>>>>a
a = 3.14159265358979
>>>>format short %输入format short,输出小数点后少的位数
>>>>a
a = 3.1416
向量和矩阵
>>>>A = [1 2; %矩阵的写法1
> 3 4;
> 5 6]
A =
1 2
3 4
5 6
>>>>A = [1 2; 3 4; 5 6] %矩阵的写法2
A =
1 2
3 4
5 6
>>>>v = 1: 0.1: 2 %从 1 开始,步长为 0.1,一直增加到2
v =
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000
>>>>v = 1:6 %按整数输出
v =
1 2 3 4 5 6
>>>>ones(2,3) %生成矩阵的快速方式
ans =
1 1 1
1 1 1
>>>>c = 2*ones(2,3)
c =
2 2 2
2 2 2
>>>>w = zeros(1,3)
w =
0 0 0
>>>>w = rand(1,3) %随机生成一行三列的矩阵,介于0到1之间的随机值
w =
0.98343 0.79271 0.93922
>>>>w = randn(1,3) %服从高斯分布,均值为0标准差或方差为1
w =
0.50732 1.51904 -1.28292
hist(w) %绘制直方图?
hist(w,50) %有50个竖条的直方图
>>>>eye(4) %生成矩阵的特殊方式,生成单位矩阵
ans =
Diagonal Matrix
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>>>>help eye %显示eye函数的帮助文档
Octave的基本操作
>>>>size(A) % size 返回矩阵的大小
ans =
3 2
>>>>size(A,1) %返回A矩阵第一维度的大小,即A矩阵的行数
ans = 3
>>>>size(A,2) %列数
ans = 2
>>>>length(A) %返回最大维度的大小,可以对矩阵使用但是也会造成confusing
ans = 3
>>>>length([1;2;3;4;5]) %通常对向量使用
ans = 5
从文件中加载和查找数据
>>>>pwd
ans = /Users/Ocatave程序安装路径,显示当前所在路径
cd 更改路径,文件名不要包含空格会出错
>>>>who %显示Octave里现有的变量
Variables in the current scope:
A a ans c v w
>>>>load 文件名 %注意格式,我在这里导入失败了,视频里示例的是.dat文件
后面输入不加后缀的文件名,即显示文件里的内容
>>>> whos %显示变量更详细的信息
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
A 3x2 48 double
a 1x1 8 double
ans 1x39 39 char
c 2x3 48 double
v 1x6 24 double
w 1x10000 80000 double
Total is 10058 elements using 80167 bytes
>>>>clear A %删除变量
>>>>clear %只输入clear,则删除所有变量
>>>>v = priceY(1:10) %priceY是之前导入的文件,把它的前10个数据赋给v
>>>>save vector.mat v %将v存在当前路径命名为vector.mat的文件,压缩形式
>>>>save vector.txt v -ascii %储存为人能看懂的文本形式,-ascii必须要加
索引操作
>>>>A(3,2) %显示第三行第二列的那个元素
ans = 6
>>>>A(2,:) %显示第二行的所有元素
ans =
3 4
>>>>A(:,2) %显示第二列的所有元素
ans =
2
4
6
>>>>A([1 3], :) %显示第一行第三行的所有列元素
ans =
1 2
5 6
>>>>A(:,2) = [11,22,33] %索引也可以用来赋值
A =
1 11
3 22
5 33
>>>>A = [A,[90;80;70]] %给矩阵A新增加一列
A =
1 11 90
3 22 80
5 33 70
>>>>A(:) %把A中所有的元素按一列输出
ans =
1
3
5
11
22
33
90
80
70
>>>>C = [A B] %把A和B两个矩阵合起来(延伸:把矩阵看作一个数值元素进行操作,[A, B] [A;B])
C =
1 2 11 22
3 4 33 44
5 6 55 66
对矩阵中的元素进行运算
>>>>A * C %矩阵乘法,这里注意A的列数和B的行数相等
>>>>A .*B %A中的元素和B中对应位置的元素相乘,这里也默认它们size一样,这个点通常表示元素的运算,对矩阵和向量都可以用
ans =
11 24
39 56
75 96
>>>>A .^2 %对A中元素进行平方运算
ans =
1 4
9 16
25 36
>>>>log(v) %对v求对数
ans =
0.00000
0.69315
1.09861
>>>>exp(v) %求以e为底v次方的指数函数
ans =
2.7183
7.3891
20.0855
>>>>abs(v) %求v的绝对值
ans =
1
2
3
>>>>v + ones(length(v), 1) %给向量v的值都加1,v = [1; 2; 3]
ans =
2
3
4
>>>>v + 1 %也可以
ans =
2
3
4
>>>>A' %A的转置
ans =
1 3 5
2 4 6
>>>>val = max(a)
val = 15
>>>>[val, ind] = max(a) %ind是max(a)索引
val = 15
ind = 2
>>>>max(A) %默认输出每一列的最大值
ans =
5 6
>>>>a
a =
1.00000 15.00000 2.00000 0.50000
>>>>a < 3 %对应元素比较,返回真假
ans =
1 0 1 1
>>>>find(a < 3) %找到符合的值,返回索引,a是向量
ans =
1 3 4
>>>>[r, c] = find(A >= 7) %A是矩阵,r行c列
r =
1
3
2
c =
1
2
3
>>>>A = magic(3) %幻方,任意行列加起来的值相等(包括对角线),便捷的生成一个3*3的矩阵
A =
8 1 6
3 5 7
4 9 2
>>>>sum(a) %求和
ans = 18.500
>>>>prod(a) %求积
ans = 15
>>>>floor(a) %向下取整
ans =
1 15 2 0
>>>>ceil(a) %向上取整
ans =
1 15 2 1
>>>>max(rand(3), rand(3)) %由两个随机矩阵中较大的数值组成
ans =
0.50037 0.85282 0.86935
0.87063 0.82242 0.72379
0.75042 0.38446 0.72941
>>>>max(A,[],1) %输出每一列的最大值,1表示从第一维度取值
ans =
8 9 7
>>>>max(A, [], 2) %输出每一行的最大值
ans =
8
7
9
>>>>max(max(A)) %只是想知道整个矩阵的最大值
ans = 9
>>>>sum(A,1) %求A每一列的总和,第 1 维度是列;第 2 维度是行
ans =
369 369 369 369 369 369 369 369 369
>>>>A .*eye(9) %得到对角线元素的一个方法
ans =
47 0 0 0 0 0 0 0 0
0 68 0 0 0 0 0 0 0
0 0 8 0 0 0 0 0 0
0 0 0 20 0 0 0 0 0
0 0 0 0 41 0 0 0 0
0 0 0 0 0 62 0 0 0
0 0 0 0 0 0 74 0 0
0 0 0 0 0 0 0 14 0
0 0 0 0 0 0 0 0 35
>>>>A .*flipud(eye(9)) % flipud 使矩阵垂直翻转
ans =
0 0 0 0 0 0 0 0 45
0 0 0 0 0 0 0 44 0
0 0 0 0 0 0 43 0 0
0 0 0 0 0 42 0 0 0
0 0 0 0 41 0 0 0 0
0 0 0 40 0 0 0 0 0
0 0 39 0 0 0 0 0 0
0 38 0 0 0 0 0 0 0
37 0 0 0 0 0 0 0 0
>>>>pinv(A) %求伪逆
在运行一个学习算法后,最有用的是能够观察你的数据,或说使数据可视化。
根据数据绘制图像(plotting and visualizing Data)
>>>>plot(t, y2)
>>>>hold on; %保留原有图像,在其上面绘制,而不是直接替换掉
>>>>plot(t, y1, 'r') %'r'表示颜色
>>>>xlabel('time') %显示横纵坐标轴代表什么
>>>>ylabel('value')
>>>>legend('cos') %标记函数,在右上角,表示函数内容
>>>>title('my plot') %标题
>>>>print -dpng 'my-plot.png' %储存图像,先cd到储存路径
>>>>close %关掉图像
>>>>figure(2); plot(t, y2); %figure为图像标号
>>>>subplot(1,2,1); %分成两个小格子,显示第一个
>>>>plot(t, y1);
>>>>subplot(1,2,2)
>>>>plot(t, y2)
>>>>axis([0.5 1 -1 1]) %改变坐标轴刻度
>>>>clf; %清除图像
>>>>A = magic(5);
>>>>imagesc(A)
>>>>imagesc(A), colorbar, colormap gray; %用逗号连续调用函数
控制语句与函数
>>>>for i = 1:10 %for循环
> v(i) = 2^i;
> end;
>>>>v
v =
2
4
8
16
32
64
128
256
512
1024
>>>>indices = 1:10;
>>>>indices
indices =
1 2 3 4 5 6 7 8 9 10
>>>>for i = indices %另一种方法,用索引
> disp(i);
> end;
1
2
3
4
5
6
7
8
9
10
>>>>while i<=5 %while的使用
> v(i) = 100;
> i = i + 1;
> end;
>>>>v
v =
100 100 100 100 100
>>>>exit/quit %退出Octave
在 .m 文件里定义函数,然后在它所在的路径下可以调用。
>>>>addpath(' ') %把 .m 文件所在的路径添加后,即使跑到别的路径下也可以找到,方便查找
Octave 特有的定义函数功能,定义一个函数,可返回多个值,如下图所示:
在 .m 文件里写好函数,在 Octave 里有数据,调用即可。
线性代数库
用向量化的方法取代for
循环,会高效的多(将系数抽象为向量来表示)。
Logistic Regression
Logistic回归算法 (Logistic regression)
一种分类算法,Y 值为离散的 0 和 1(二元)(也可以是多元,即多个离散值)。它的优点是让预测值在 0 到 1 之间(之前的线性回归会让值小于0或大于1)。
Logistic 函数也称 Sigmoid 函数,它的假设函数如上图,用参数拟合我们的数据。举例来说,如在给定 x 的条件下 y = 1 的概率。
决策边界(Decision boundary)
关于 h(x) 怎么做出预测,通俗的来说可理解为大于决策边界这条线为正,小于这条直线则为负,从而完成了分类。
要注意的是,决策边界是假设函数的一个属性,由决定,而跟数据无关。
如上图用多项式得到更复杂的决策边界。
代价函数
解决如何求 Logistic 回归的参数。写出代价函数,用梯度下降法求 ,从而得到。
用线性回归的代价函数得到的是非凸函数,会有多个局部最优解。
Logistic 回归代价函数,预测y=1的概率。
线性回归和 Logsitic 回归 h(x) 的定义不同。同时,特征值归一化处理也可以用在 Loistic 回归中。
高级优化算法
它的优点是可自动选择学习率。
代码实现:
下图的方法用在 logstic 回归中,通过写代码计算代价函数值和梯度值,需注意 Octave 中下标从 1 开始。
逻辑回归:一对多分类
关于如何用逻辑回归解决多类别分类问题。
将其分成三个独立的二元分类问题。三个伪分类器,每一个计算的是 y=i 时的概率。
输入 x,选择 h 最大的类别,可信度最高效果最好,得到一个最高的概率值,为我们所要预测的 y 值。
后记:本篇总结可能没有覆盖全部知识点,仅根据我在学习过程中的理解所记录。如有疏漏还望指正。文中图片均来自 Andrew Ng 公开课的 PowerPoint。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。