前言
- 本文内容来自b站吴恩达机器学习视频的总结,按知识点进行总结,并标注出知识点在哪个视频
- 目的是进行复习使用,争取达到不看视频就能回想起视频里的内容
- 视频链接:吴恩达机器学习
监督学习与无监督学习(P3-P4)
-
监督学习
- “right answer” given, 即在房价数据集中的每个样本,都给出正确的房价。也被称为回归问题(regression problem),房价虽然是一个离散值,但是可以预测其连续的属性。简而言之就是我们知道某组离散的数据对(x,y),然后去预测这个函数的图像,从而预测其他x所对应的y。
监督学习
- “right answer” given, 即在房价数据集中的每个样本,都给出正确的房价。也被称为回归问题(regression problem),房价虽然是一个离散值,但是可以预测其连续的属性。简而言之就是我们知道某组离散的数据对(x,y),然后去预测这个函数的图像,从而预测其他x所对应的y。
-
无监督学习
-
我们只被告知这里有一组数据集,尝试在其中找到某种结构。也叫做分类问题。
无监督学习
-
代价函数(P5-P8)
-
模型描述
监督学习模型 - 代价函数
- 首先是H函数,也就是预测(x,y)数据对的函数;
- 其中和是参数,我们要做的是找到合适的参数和,从而找到合适的H函数;
- 需要对参数构造一个函数,这个关于参数的函数就叫做代价函数;
- 当代价函数取最小值时,这时的参数往往是所要求的参数值。
简而言之,代价函数是辅助我们找到最合适的参数的一个函数
梯度下降(P9-P11)
-
下图已经很好的解释了什么是梯度下降
梯度下降 - 而梯度下降是什么原理?(首先从单个参数的情况解释)
- 如下图,是学习率,即下降的速率。我们的目的是下降到曲线的最低点,这时后面的偏导项为0(理想情况下),那么就不会更新,也就得到了我们需要的参数(理想情况下)。
- 当有两个参数时,同时更新参数和,那么和一个参数的情况类似(之前代价函数是一个二维曲线,更新到到达最低点为止),这里的是一个三维曲面,目的是到达曲面最低点,这是的偏导项都为0,两个参数也不再更新。
注意一点,梯度下降算法的参数是同时更新的
两个参数梯度下降
多元梯度下降(P18-P19)
- 下图是多元特征的表示方法:其中n是指特征的个数4;中的 i 是指第i行,是包含四个特征值的向量;j 则是第 j 列, 指第i行第j列的特征。
表示方法 -
当有多个特征时,依次对每个特征所对应的参数进行更新即可,之前是同时更新。
多元梯度下降
特征缩放(P20)
- 一般是将特征值缩放到 -1至1之间(只要不是与这个区间相差很大都能接收),视觉上的作用是让轮廓图更圆,实际的作用是加快收敛速度
Mean normalization(均值归一化)
- 实际上是一种更标准的特征缩放,具体公式如下:
其中是第i个特征值,是第i个特征值的平均值,是特征值取值范围的长度,例如对房价进行预测,其中包含特征值是房子的大小,范围为。那么,,所以的取值范围变为了,即完成了特征缩放。
学习速率(P22)
- 梯度下降算法中趋势都是向下的,当学习速率很小时,则收敛的速率比较慢;当很大时会出现下面的情况:
当学习速率太大时出现异常
此时只需适当调小即可。
特征多项式回归(P22)
特征多项式回归公式如下:
即这里的参数不再是一阶的,含有高次项。
正规方程(P23)
- 标准方程法是一种一次就求得所有参数的方法,例如只含单个参数时,代价函数所以很容易由一阶导为0得到时,代价函数取最小值
同理,对于含有多个参数的回归方程,分别求出所有参数的偏导,并令所有偏导为0,得到其中X是一个包含所有特征值的矩阵。且第一列赋值为1,因为参数里有个常数项;y矩阵为实际结果组成的列向量。 - 梯度下降法与标准方程法的比较
梯度下降法:适合特征值很多的情况;需要选择的值,有时拟合过程会比较慢
标准方程法:操作很方便;但是当特征值很多时,矩阵转置的算法复杂度很高,约为
- 所以当参数较少时选用标准方程法,大概一万参数以上可以考虑使用梯度下降算法。
正规方程不可逆(P24)
- 即矩阵不可逆的问题
- 通常不可逆有两种原因
redundant features : 存在线性相关的特征值
Too many features : ,m是训练数据的组数,n是特征值的个数
Octive基本操作(P26)
下载Octave,以下是Octive的一些基本操作
>>1==2
ans = 0
>>1~=2 %不等于是~=,而不是!=
ans = 1
>>1&&0 %与
ans = 0
>>1||0 %或
ans = 1
>>xor(1,0) %异或
ans = 1
>>PS1('>>'); %命令提示行会变简洁
>>a=3 %赋值并打印
a = 3
>>a=3; %加分号则不会打印
>>b='hi';
>>b %打印b
b = hi
>>a=pi;
>>disp(a); %另一种打印方法
3.1416
>>disp(a) %发现这里加不加分号都一样
3.1416
>>disp(sprintf('2 decimals: %0.2f', a)) %打印,有点像c语言,但是用的是单引号
2 decimals: 3.14
>>format long %打印长度为long
>>a
a = 3.141592653589793
>>format short %打印长度为short
>>a
a = 3.1416
>>A=[1 2;3 4;5 6] %输出一个3*2的矩阵
A =
1 2
3 4
5 6
>>A=[1 2; %另外一种输入方法
3 4;
5 6]
A =
1 2
3 4
5 6
>>A=1:0.2:2 %以0.2的步长从1到2打印矩阵,是一个行矩阵
A =
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
>>ones(2,3) %打印一个2*3的矩阵,其中所有值都是1
ans =
1 1 1
1 1 1
>>A=2*ones(2,3) %将上面的矩阵所有值乘2,赋给A
A =
2 2 2
2 2 2
>>A=rand(2,3) %随机打印0-1之间的数
A =
0.393924 0.046474 0.309188
0.109174 0.188602 0.628519
>>A=randn(2,3) %随机打印标准正态分布产生的数,均值为0,方差为1
A =
-0.23444 -0.35377 0.36930
-0.78721 0.57167 1.22516
>>hist(A) %打印直方图
>>A=-6+sqrt(pi)*(randn(1,10000));
>>hist(A,100) %将A按照100条的直方图打印出来
>> A=eye(3) %eye命令打印单位矩阵
A =
Diagonal Matrix
1 0 0
0 1 0
0 0 1
>> size(A) %返回A的大小
ans =
3 3
Octive移动数据(P27)
- 还是一些Octive的操作命令,这里是移动数据的命令
>> load featuresX.dat %将数据导入Octive
>> who %显示当前有哪些变量
Variables in the current scope:
a
>> whos %显示当前变量的详细信息
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
a 1x1 8 double
Total is 1 element using 8 bytes
>> clear a %删除a变量
>> clear %删除所有变量
>> A= 1:0.1:2;
>> save hello.mat A; %存入磁盘,clear无法删除该变量
>> clear
>> whos %clear无法删除磁盘中的变量
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
A 1x11 24 double
Total is 11 elements using 24 bytes
>> A=[1 2;3 4;5 6]
A =
1 2
3 4
5 6
>> A(3,2) %输出矩阵中的当个值
ans = 6
>> A(2,:) %:表示该行或者该列所有数据
ans =
3 4
>> A([1 3],:) %输出第1,3行
ans =
1 2
5 6
>> A(:,2)=[10;11;12] %可以用:直接对第二列直接赋值
A =
1 10
3 11
5 12
>> A=[A,[11;12;13]] %在A的右边新加一列
A =
1 10 11
3 11 12
5 12 13
>> A(:) %按列输出A
ans =
1
3
5
10
11
12
11
12
13
>> A=[1 2;3 4;5 6];
>> B=[11 12;13 14;15 16];
>> C=[A B] %将AB合并
C =
1 2 11 12
3 4 13 14
5 6 15 16
>> C=[A;B] %将AB合并,加分号为列合并
C =
1 2
3 4
5 6
11 12
13 14
15 16
计算数据(P28)
>> A.*B %点表示对每个元素进行操作
ans =
11 24
39 56
75 96
>> A' %单引号表示转置
ans =
1 3 5
2 4 6
>> A=[1 2;3 4;5 6];
>> [r,c]=find(A<3) %找出A矩阵中小于3的数
r = %返回行
1
1
c = %返回列
1
2
%find有其他更多的功能,可以通过help find来查询
>> a=[1:0.2:2];
>> sum(a) %求和,若是二维矩阵,则返回每一列的和
ans = 9
>> prod(a) %求乘积,若是二维矩阵,则返回每一列的乘积
ans = 9.6768
>> floor(a) %向下四舍五入
ans =
1 1 1 1 1 2
>> ceil(a) %向上四舍五入
ans =
1 2 2 2 2 2
>> M=magic(3) %magic生成一个数独矩阵
M =
8 1 6
3 5 7
4 9 2
>> max(M,[],1) %这里的1表示维度,1是列
ans =
8 9 7
>> max(M,[],2) %同理,2也是代表维度,表示行
ans =
8
7
9
>> max(M,[],3) %3以及3以上则会输出整个矩阵
ans =
8 1 6
3 5 7
4 9 2
>> max(max(M)) %输出二维矩阵中的最大的一个数
ans = 9
>> max(M(:)); %也是输出最大的一个数,这里是先变为列向量再找最大值
>> flipud(eye(3)); %flipud为矩阵的转置命令
>> pinv(A); %求伪逆矩阵
数据绘制(P29)
>> t=[0:0.01:0.98];
>> y1=sin(2*pi*4*t);
>> plot(t,y1); %将y1函数绘图
>> y2=cos(2*pi*4*t);
>> plot(t,y2);
%将y2函数绘图,但y1函数图像会消失
>> plot(t,y1);
>> hold on; %hold on命令会让y1图像不会消失
>> plot(t,y2,'r'); %然后在y1的基础上再画y2的图像,且这里用红色绘制y2
>> xlabel('time'); %标明横坐标为time
>> ylabel('value'); %标明纵坐标为value
>> legend('sin','cos'); %标明那个是sin曲线,哪个是cos曲线
>> title('my plot'); %取标题名字
>> cd 'C:\Users\Administrator\Desktop', print -dpng 'my plot.png'
%将绘制的图像保存至桌面,这里的路径可以改变
>> cd F:\Octaveprint %也可以在F盘下创建一个Octaveprint文件夹,先用cd切换到该文件夹
>> print -dpng 'my plot.png' %然后使用打印命令
>> figure(1); plot(t,y1); %单独绘制图一
>> figure(2); plot(t,y2); %单独绘制图二,这时会同时出现两个图
%不会像之前一样绘制图2时图1消失
>> subplot(1,2,1); %分为一行两列来绘图,先绘制第一列
>> plot(t,y1); %第一列绘制图1
>> subplot(1,2,2); %第二列绘制图2
>> plot(t,y2);
>> axis([0.5 1 -1 1]) %改变坐标刻度,横轴改为[0.5,1],纵轴改为[-1,1]
>> A=magic(5);
>> imagesc(A) %将矩阵可视化
>> imagesc(A),colorbar,colormap gray
>> close %关闭绘图工具
控制语句(P30)
>> V=zeros(5,1)
V =
0
0
0
0
0
>> for i=1:5, %for循环语句,从1到5
V(i)=2^i;
end
>> V
V =
2
4
8
16
32
>> i=1;
>> while i<=3, %while循环
V(i)=100;
i=i+1;
end;
>> V
V =
100
100
100
16
32
%在F盘的function文件夹下创建一个函数
%function y =squareThisNumber(x);
%y=x^2;
>> cd F:\octave\function %必须先切换到该文件夹下,才能调用该函数
>> squareThisNumber(5) %调用该函数,可以求出函数值
ans = 25
%也可以添加默认路径,也就是配置环境变量,以后不用切换到指定的文件夹下也可以操作
>> addpath('F:\octave\function');
%再创建一个函数,注意Octive可以一个变量输出多个函数值
%此外可以用Windows自带的写字板创建函数,定义好之后保存到function文件夹下,注意加上后缀名 .m
>> [y1,y2]=squareAndCubeThisNumber(5);
>> y1
y1 = 25
>> y2
y2 = 125
%下面定义一个代价函数
%function J = costFunctionJ(X,y,theta);
%m=size(X,1);
%predictions=X*theta;
%sqrErrors=(prediction-y).^2;
%J=1/(2*m)*sum(sqrErrors);
>> X=[1 1;1 2;1 3]; %特征值矩阵
>> y=[1;2;3]; %实际取值
>> theta=[0;1]; %参数theta的取值
>> j=costFunctionJ(X,y,theta) %代价函数的值
j = 0
>> theta=[1;1]; %调整参数theta
>> j=costFunctionJ(X,y,theta)
j = 0.50000 %代价函数值发生改变
向量化(P31)
- 因为Octave含有线性代数的函数库,且实现了高度的优化,所以将一组值转化成向量,会使用更少的代码实现更快的计算速度
假设陈述(P33)
- 在分类问题中用什么函数来表达假设?
- 二分类中希望最终得到一个0,1值的结果,所以就需要一个这样的函数来表示
- 线性回归中的假设函数形式是,但是这种假设函数是线性的,当有一个值很大时就会很影响分类:
线性的假设函数
上图的粉红色线为较好的分类;当出现一个很大的值时,就会出现蓝色线的情况,出现较差的分类 - 所以引入S型函数,进行更好的分类(也叫Sigmoid function/logistic function),S型函数的表达式为,然后。所以最终的假设函数是
其图像如下:
二分类最终的假设函数:S型函数
这里会给出一个概率,假设,那么患病的概率为0.7,给出的y=1时的概率
引入S函数的目的是为了二分类,因为S函数的特性:输入可以取所有值,输出在0-1之间
决策边界(P34)
- 决策边界其实就是分类的那条线,可以是直线,圆,椭圆,不规则的曲线等等。影响决策边界的是参数,可以进行调参来得到更好的分类效果
- 参数是怎么影响到决策边界的?
可以从S型函数看出,当时,;此时可以认为预测结果,反之为0。
线性的决策边界
如上图,可以看到时的决策边界可以有效的进行分类,那么就要使,才能得到分类结果,所以此时取参数,这样能得到如图所示的分类 - 总之,可以通过调节参数,得到更好的边界决策
代价函数(P35)
- 这一节的主要是讲如何求参数,之前是用梯度下降算法求解,如下:
但是会出现一个问题,因为是非线性的,所以求得的是一个非凸函数(non-convex),也就是说梯度下降无法保证能到达最低点,所以这种方法就存在一些问题。
是指1/m之后的部分,所以需要一个更好的代价函数来替代这一部分,如下:
非凸函数与凸函数
简化代价函数和梯度下降(P36)
- 下面是之前的逻辑回归的代价函数
- 现在对其进行简化,其实就是加上系数 y 和 y-1,将 y=0 和 y=1 两类情况合并
- 注意此时用梯度下降方法求参数时,与线性回归的公式相同,但是此处的是不同的,线性回归中是,逻辑回归中是,所以对求导之后是不同的结果
多分类(P38)
-
这里是用二分类的方法解决多分类问题,比如要分三类,那么就设置三个不同的二分类器。实际进行分类时,就将x代入不同的H函数,选择可信度最高的分类器。
多分类
过拟合(P39)
- 过拟合就是训练的时候表现很好,但是缺乏泛化能力,预测阶段表现很差。
- 欠拟合就是训练的模型没训练好。
- 理想情况是训练数据和预测数据都能很好的和训练出的模型相拟合。
正则化(P40-P42)
-
正则化的目的是防止过拟合的出现
-
在原有的代价函数后加上调节项,如下图:
正则化 -
其中是起调节作用的正则化参数,参数取平方是为了扩大参数改变后的影响,使结果更平滑
-
注意正则项中参数是从
神经网络(P44-P46)
-
下面是一个简单的神经网络,包含输入层,隐藏层,输出层;其中是偏置单元,值为1;然后每条传输路径是一个参数,在神经网络中也叫权重。
神经网络
-
的上标 j 表示层数 ,下标表示每一层的第几个单元。下面是具体的计算。
多元分类(P49)
-
多元分类的神经网络有多个输出,可以看做一个向量,具体看那一行的值接近1,那么就是对应的分类结果。
多元分类
神经网络的代价函数(P50)
神经网络的代价函数反向传播算法(P51-52)
-
神经网络在之前曾没落过一段时间,因为单层的神经网络连同或和异或等简单计算都无法完成;而多层的神经网络虽然能够计算,但是因为隐藏层的存在,就无法计算中间层的损失,也就是说不能通过损失函数来进行参数的优化,这也就导致了多层神经网络没有实际作用(无法调参)。直到反向传播算法的出现,神经网络又重新复兴起来。
简而言之,就是反向传播算法可以实现多层神经网络的调参 -
反向传播算法的思想是从最后的结果出发,一步一步反向计算每个隐藏层的损失,从而调优。
-
下图是正向传播的计算过程
正向传播 -
反向传播:可以看到是用输出层结果 减去实际值 y 得到最后一层的误差,然后反向计算隐藏层的误差。
-
下面是整个算法的计算过程
反向传播
梯度检验(P54)
-
梯度检验可以验证反向传播算法的实现是否正确。
-
下图是当只有一个参数时的计算方法
单个参数
-
含多个参数时,这是参数为一个向量
多个参数 -
下面是检验过程:
- 先计算反向传播的导数DVec
- 然后通过数值计算得到梯度gradApprox
- 比较二者,若很接近则说明算法没有问题
- 注意检验后,关闭梯度检验,因为计算过程耗时较多
精准率与召回率(P67-P68)
- 单一的输出概率(比如y=99.2%和99.5%),有时会很接近,并不能很好的反应预测结果,所以引入更多的高阶数据进一步说明结果。
-
其中精准率表达式为:
-
其中召回率表达式为:
-
以癌症预测为例,其实际的意义分别是:精准率越高表示希望预测癌症的正确率更高;召回率表示希望找到更多的癌症患者
-
当要取二者之间的平衡时,平均值并不能很好的反应出来,所以又有了F1值
SVM(P70-P75)
-
数学上的定义
数学图形
反向传播算法
正向chuanbo
迁移学习
迁移学习端到端的神经网络
端到端卷积神经网络
-
卷积运算
- 左侧是原始矩阵
- 中间的是一个3*3的过滤器(poling池化)
- 右侧得到的矩阵
-
卷积运算的作用
- 可以看到滤波后可以检测垂直边缘(Vertical edge)
-
滤波器的参数学习
- 通过改变滤波器的参数可以得到完全不同的效果
- 例如Sobel滤波器,Scharr滤波器
-
可以通过反向传播算法来计算参数,得到不同角度的边缘感知
参数学习
-
Padding(填充)
- 卷积计算存在两个缺点:边缘信息损失;每次卷积计算后矩阵变小
- 所以对边缘进行填充
- Valid表示无填充;Same表示填充前后矩阵大小不变
- p为填充大小,所以可以看出滤波器大小始终为奇数
-
步长
- 步长就是每次与滤波器相乘后移动的距离
-
三维卷积
- 三维计算后是一个二维的,图中是27个数相加后得到一个值
- 若卷积后的是一个三维矩阵,那么第三个维度数是滤波器的数量,如下图442中的2表示有两个滤波器
- 这里可以看到,当输入矩阵很大时,卷积神经网络很大程度上减少了参数的个数
-
卷积神经网络layer
- 包含卷积层
- 池化层
- 全连接层
-
池化层
-
池化层是为了缩减计算数据量
-
计算方法(没有权重和参数,只是做一个数学计算)
-
- Average pooling则是计算平均值
网友评论