https://study.163.com/course/introduction.htm?courseId=1004570029 吴恩达网易云课堂
简要步骤
1.收集出训练集,分析数据特征(监督学习)
2.绘制训练集图像,分析数据特征变量,得到假设函数
3.根据假设函数,得到代价函数(线性回归/逻辑回归函数)
4.用梯度下降法或正规方程+正则化minimize代价函数----Octave计算(专业)
5.得到参数,得到假设函数,即训练集的原始函数
6.编码实现
7.得到的函数程序,输入x会返回相应的y
例如,你可以写个乘法程序,输入为乘数和被乘数,输出为积。只不过,我们这个问题不是乘法这么简单,是个待求的算法。
章节1 绪论:初识机器学习
1.什么是机器学习
目的:采用学习算法,尝试模拟人类大脑的学习方式
例如,人类根据经验,可以从乌云漫天中,预测大雨的到来。机器学习正是这样一门学科,它目的是通过计算的手段,利用经验来改善系统自身性能。
在计算机系统中“经验”通常以“数据”的形式存在。因此,机器学习研究的主要内容,是关于在计算机上从数据中产生“模型”的算法,即“学习算法”。
有了算法,我们把经验数据提供给它,它就你就能基于这些数据产生的模型,在面对新情况时,例如,看到云的情况,模型会给我们提供相应的判断。
我们解决的问题是“判断下雨或不下雨”,例子的“云”是一个特征变量。一个问题可以有多个特征变量,有了变量,根据函数模型输出的结果,做出判断。
2.监督学习
我们教会计算机学习,即训练样本,有x也有y
3.无监督学习
计算机自己学习,即训练样本,只有x,没有y
章节2 单变量线性回归
1.模型描述
1.先拿到数据集图像
整个监督学习的过程:
某地区房价的数据集,及这些数据作的图(这些是训练样本,即都是已知的数据,不同房子的面积x和价格y。)
求,这地区买一个1250平方英尺房子的价格。你可以进行模型拟合。这组数据似乎适合直线:
根据这个直线模型,你可以告诉你朋友,1250平方英尺房子的价格大概是220,000美元。
这是一个监督学习算法的例子,因为数据集是实际的大小和价格。而且,这还是一个回归类型的问题,回归是指,我们预测一个具体的数值输出。另一种常见的监督学习问题是,分类问题,用来预测离散值输出。比如我们观察肿瘤,想判断它是良性还是恶性,这是只有0和1的离散输出,这就是一个分类问题。
在监督学习中,我们有个数据集,称之为训练集。以住房价格为例,我们有一个房价的训练集,我们的工作是从这些数据中学习如何预测房价。
一般,用m表示训练集里样本的数量;小写x表示,输入变量或特征;小写y表示输出,即预测值;(x, y)表示一个训练样本。(x^i, y^i)表示具体的第i个样本。
那么监督学习算法是如何工作的:我们向学习算法提供训练集,比如房价这个训练集;学习算法的任务,就是得到一个函数,通常是小写的h表示,h就是假设函数,假设函数hypothesis的作用是,把房子的大小x作为输入变量,它会给出房价的预测值y,假设函数h就是一个引导从x得到y的函数。
那么如何表示这个假设函数h呢?
先写一个简单的假设函数:h_Θ(x) = Θ_0 + Θ_1*x
有时会把h_Θ(x)缩写为h(x)
y是一个关于x的线性函数,为什么是一个线性函数呢?因为线性简单嘛,先从简单的说起,然后在此基础上讲复杂的。
这个特定的模型,我们叫它线性回归。这个例子是一个一元线性回归,变量是x,这是个单变量x的函数,我们称之为单变量线性回归。
2.代价函数
那么如何手动实现上节的模型呢?
再来看一下我们的假设函数:h_Θ(x) = Θ_0 + Θ_1*x
这是我们用来预测的函数,这些Θ_0和Θ_1叫模型参数,任务的关键是如何选择模型参数的值,即Θ_0 = ? 和Θ_1 = ?,选择不同的模型参数,会得到不同的假设函数:
这里我们把h_Θ(x)简写成h(x)
在解决线性回归问题时,我们有一个训练集,如下图,我们的假设函数,就是尽量去拟合我们的训练集,也就是:我们要对样本(x, y),有h(x)值 接近y值,这是的模型参数,就是我们要的参数,这时的假设函数,就是我们要的函数。
在线性回归问题中,我们要解决的是一个最小化问题,我想要h(x)与y之间的差异最小化。
用公式表示:(h(x)-y)^2 的值最小化(ps:至于为什么用平方差表示最小,别问我-。-)
已知,(x^I, y^i)表示是第i个样本,那么全部样本查之和就是:
h_Θ(x)是我们的假设函数,m是训练集的样本数量,
这时,我们定义一个代价函数:
我们要做的就是求代价函数J(Θ_0, Θ_1)的最小值
代价函数也被称为平方误差函数或平方误差代价函数
这里代价函数的选择,不要问为什么。
现在捋一捋整个思路:
首先,我们想要一个假设函数,来拟合训练集;假设函数由模型参数决定;代价函数值最小时的模型参数,就是正确的假设函数的参数。
所以:求得代价函数最小值时的模型参数Θ,即可得到我们想要的函数。假设函数是关于x的函数;代价函数是关于Θ的函数。
然后,我们简化函数,使其只有一个Θ,即h(x) = Θx;相应的代价函数变为J(Θ)。
接着,我们通过不断假设Θ的值,来画出代价函数J(Θ)的图像大概这个样子,这种叫凸函数。这里注意。它就是这个样子的,别问为什么。
再看一下我们的公式:
假设函数、参数、代价函数、优化目标
这次优化目标,也就是求代价函数最小值时,我们保留Θ_0,代价函数如下图:
为了方便展示,我们用等高线,等高图像。
得到代价函数的最小值,就得到假设函数的算法原型。但是,我们想要的是自动得到代价函数的最小值啊,如何实现?
3.梯度下降
我们之前已经定义了代价函数,并且优化目标:代价函数最小值
梯度下降法,用来将代价函数最小化。
梯度下降法的思路:要知道,J函数是凸函数。
1给模型参数设定初始值:Θ_0=0, Θ_1=0
2不停的一点点改变模型参数的值,来使J(Θ_0, Θ_1)变小,直到我们找到J的最小值。
下面是梯度下降算法的定义(实现步骤):
我们要更新参数Θ_j ,Θ_j更新公式和同步更新步骤,
学习率决定梯度下降的幅度;这里的导数项是一个偏导数标记,即求J(Θ_0, Θ_1)中参数Θ_j的偏导数;注意,更新必须同步。
学习率太大,甚至无法收敛至最小值。
同时注意,随着导数项,即斜率变小,下降幅度会越来越小,直到到达最低点。
4.线性回归的梯度下降
之前分别学习了线性回归、梯度下降,今天把两个概念合并使用。
梯度下降 线性回归
先不考虑学习率,只集中处理导数项:
更新过程:
这个算法也叫Batch梯度下降
章节3 线性代数回顾
1.矩阵和向量
表示矩阵的特定元素:
下面是个4维向量(矩阵也叫向量):
注意,默认开始下标是1,而且,用大写字母,比如A,B,C表示矩阵
2.加法和标量乘法
只有相同维度的两个矩阵才可以相加,且会得到一个相同维度的向量:
向量与标量相乘(标量即实数):标量与个元素相乘
3.矩阵向量乘法
3x2维 x 2x1维 = 3x1维
下面是一个例子:假设有4个房子,有一个函数可以预测房价,如何快速计算房价呢?
可以利用矩阵向量相乘的方法:先构造一个矩阵,再构造一个向量,然后让矩阵和向量相乘
这意味着,用Octave,你可以直接一行代码搞定,就可以得到4个房子的预测价格,即一次性解4个方程。当然,你也可以用for循环写,但是,如果房子数量很多时,效果会很差。
4.矩阵乘法
矩阵与矩阵相乘,取出第二个矩阵的每一列,单独去计算:
关于矩阵和矩阵乘法更简洁的技巧:
一次矩阵操作,你就得出了12中预测结果。
5.矩阵乘法的特性
矩阵符合结合律不符合交换律
实数乘法有交换律:3x5 = 5x3
但是矩阵没有交换律:A x B ≠ B x A
实数乘法的结合律:3x(5x2) = (3x5)x2
矩阵也符合结合律
单位矩阵
矩阵A乘以单位矩阵等于A,I表示单位矩阵
6.逆和转置
实数的倒数:3x(3-1) = 1 ,当然0没有倒数。
矩阵也有逆:Ax(A-1) = I
方阵是行列数相等的矩阵,只有方阵才有逆矩阵。
元素都为0的方阵也没有逆矩阵
矩阵的转置运算:
假设B是A的转置矩阵,那么:
章节4 多变量线性回归
1.多特征变量
多个特许量的线性回归
之前我们房价的例子中,只有一个变量x,即房子面积
多个特征变量时:面积,卧室数量,楼层,房子年代
训练样本数量:m
特征变量数量:n
第i条样本全部输入变量:xi
我们有了多个特征变量后,假设函数也需要改变:因为我们要让特征变量影响预测。
新的假设函数:
h_Θ(x) = Θ0 + Θ1*x1 +Θ2*x2 +Θ3*x3 +…+Θn*xn
再化简这个函数:设x0 = 1
那么假设函数变为:
h_Θ(x) = Θ0 *x0+ Θ1*x1 +Θ2*x2 +Θ3*x3 +…+Θn*xn
那么选择用矩阵X表示所有特征x;矩阵Θ表示所有Θ,得到新的假设函数:
这就是多特征变量时的假设函数,称之为多元线性回归
2.多元梯度下降法
如何使用梯度下降法来处理多元线性回归?
多元线性回情况分析:其中x0=1
我们可以把参数看做一个n+1维的向量Θ,同时把代价函数看做J(Θ)
梯度下降算法如下:
特征变量n=1时的梯度下降算法:
新的梯度下降算法:特征变量n>=1
3.多元梯度下降法演练-特征缩放
梯度下降法运用中的技巧:特征缩放,来提高下降效率
这里举例两个特征变量x1,x2 ,由于两个特征变量的取值范围差距较大,导致代价函数图像很奇特:
这时,我们可以用特征缩放,来解决这一问题:
这个例子中,我们通过特征缩放,使得两个变量的取值范围都是0~1,当然,不一定非要是0~1,专家推荐的范围是-3~3,-1/3~1/3,即不能太大,也不能太小。
均值归一化:让特征变量得到相近的取值范围
特征缩放的值不需要太精确,只是为了加快梯度下降而已。
4.多元梯度下降法演练-学习率
这主要讨论学习率α,如何选择学习率?
下面是梯度下降算法的更新规则:
首先确保梯度下降正常工作,梯度下降就是找到Θ,使J(Θ)值最小。
正常来说,每一次迭代之后,J(Θ)都应该下降,当下降很缓慢时,或者迭代不再引起J(Θ)下降时,说明下降算法差不多已经收敛了。要知道的是,不同的问题,迭代次数,不一样,有的30次,有的3000次,有的300W次。
我们可以画上面的曲线,来判断梯度下降的收敛,事实上,专家都经常这么做。。。
也可以用另一种算法,来确定下降是否已经收敛。
当你画的J(Θ)曲线,出现上升的情况时,可能因为你的学习率太大导致的。
通常,我们使用较小的学习率,因为,只要学习率足够小,每次迭代一定会下降,只不过,可能会很慢很慢。所以,学习率也不能太小。
那么该如何选择学习率呢?
尝试不同的学习率α,然后画曲线图观察,取值推荐,从两头交替尝试,然后选择使得J(Θ)快速下降的α值,即一个不错的学习率,差不多,就用它吧。
0.001,0.003,0.01,0.03,0.1,0.3,1
5.特征和多项式回归
技巧1:特征的选择
以预测房价为例,比如我们有房子的长x1和宽x2的作为特征变量,那么我们的假设函数就有两个变量。
但是实际上,我们可以用房子面积x这个特征,来代替长x1、宽x2,这两个特征,即我们的假设函数,只有一个变量就够了。
这只是一种思路,就是尽量用少的变量,这样假设函数会简单,整个实现学习的效率也就高点。
技巧2:多项式回归:
还是以房价问题为例
假设函数1虽然很好的拟合了现有的数据,但是,二次函数最终是个抛物线,不符合房价问题的逻辑。所以,我们用假设函数2。
假设函数2,使用梯度下降法时,特征缩放很重要,因为涉及到x3,导致取值范围很3次方的放大,所以要特征缩放,来解决。
技巧3:
上述的例子,除了三次函数做假设函数,我们还有别的选择。比如平方根函数
平方根函数的图像:
这个例子的意思是说,假设函数有多种选择,答案不唯一,选择一个比较合适的即可。
6.正规方程-区别于迭代法直接解法
之前学的梯度下降算法,是一种迭代算法,即需要多次迭代,一点一点求出代价函数的最小值。
正规方程,它可以直接一次求解,得出代价函数的最小值。
正规方程,实现过程:
#求导,导数等于0时,即是原函数的最小值;
$对添加导数项,求导,令导函数=0,此时,得到代价函数最小值。
把样本构造成矩阵X,向量y
正规方程公式,得到的Θ即是J(Θ)最小值的Θ。
Octave实现正规方程的语法
那么何时用梯度下降,何时用正规方程呢?当特征变量数量<10000时,用正规方程即可;但当特征变量数量很大时,比如上万,上百万时,就得用梯度下降了。
当然,如果使用正规方程的话,也就不需要使用特征缩放了。
7.正规方程在矩阵不可逆情况下的解决方法
不要担心矩阵不可逆,一般很少遇见这种情况。即使要操作的矩阵不可逆,也可以在Octave里用命令实现正规方程:
章节5 Octave教程
1.基本操作
Octave可以帮助我们更高效的学习和工作,更快的写出算法原型。
加,减,乘,除,次方
逻辑运算:等于,不等于,与,或,亦或
隐藏提示符:
变量
在命令后面加分号-不打印
sprintf命令-生成一个字符串;disp命令-显示
format long 可以long形式将变量打印出来
矩阵操作
size-矩阵维度:3行2列;第一个维度大小;第二个维度大小
length-最大维度的大小
生成向量v
生成一个2x3的矩阵,且矩阵中每个元素都为1
ones元素都为1;zeros元素都为0
rand元素都是随机的介于0~1的数
randn元素服从高斯分布-均值为0,标准差和平方差为1
hist绘制直方图
eye生成单位矩阵
help命令;help eye;help help
Q退出命令;quit/exit退出程序
2.移动数据
1.把文件加载到Octave中;把外部数据存到矩阵中;如何对矩阵进行操作;保存计算结果;如何移动这些数据
pwd-查看当前路径
cd-切换路径;同样支持ls命令
load 文件名-从文件系统中加载文件
who-显示当前Octave工作空间中所有变量; whos-更详细的显示
clear 变量名-删除变量;clear –删除所有变量
将变量priceY的前10个元素赋给变量v:
将变量存入硬盘:
save文件名 变量名--将变量v保存为一个名为hello.mat的文件;文件路径在当前目录;文件格式根据需求,比如.txt等
矩阵的索引
不仅可以取,还可以给指定位置的元素赋值:
给矩阵A附加元素:
A(:) -–将矩阵A中的元素,以一列的形式全部输出
矩阵组合操作:分号换行
3.计算数据
矩阵准备:
A*C—矩阵乘法;A .*B—相应元素相乘;点号,表示元素的运算。
exp--以e为底,v中元素为指数;abs(v)—v中所有元素的绝对值
矩阵的转置:
矩阵a中最大的元素;最大的元素及其下标;直接max(A)—每一列的最大值
magic幻方矩阵:每行,每列,每条对角线元素之和相等。
每列的最大值:1表,从A的第一维度取值;每行的最大值:2,从A的第二维度取值
sum(A,1)—
sum()—求和函数;prod()—求积函数;floor()—向下取整函数;ceil()—向上取整函数
求每行每列的最值:
每列的和;sum(A,2)—每行的和
理解为:从每一行中取一个元素,不就得到列和嘛。
max(A):默认是求每列的最大值;整个矩阵的最大值:max(max(A))或max(A(:))
逆矩阵
4.数据绘制
之前的梯度下降法中说到,需要画J(Θ)曲线图,来观察下降算法是否收敛。
矩阵准备:
命令hold on – 在就图像的基础上画图。
lgend(‘sin’, ‘cos’) title(‘my plot’)
print –dpng ‘myPlot.png’ -- 保存成.png格式,到当前目录,也可以cd到目标目录。
Close –关闭图像
subplot(1,2,1)—生成一个1*2的格子,并使用第1格
plot到第1格上
subplot(1,2,2)—生成一个1*2的格子,并使用第2格
plot到第2格上
改变左边轴刻度:
axis([0.5 1 -1 1])---x轴的范围是0.5~1;y轴的范围是-1~1
清除图像-clf
生成格图,不同值对应不同颜色:
逗号——多个命令,一个个执行,链接命令。
5.控制语句:for,while,if 语句
For循环:
如何定义和调用函数:
自己定义函数时,先在当前目录创建一个squareThisNumber.m文件
错误例子:说是函数未定义,其实应该是路径问题,Octave找不到文件;或者是文件名和命令行输入的不对应。
而且Octave的一个函数,可以有多个返回值:
一个更复杂的函数的例子:
6.矢量
向量化—高效
使用合适的向量化方法,可以使代码更简单,高效。
向量化,就是将函数中的多个参数和变量,向量化成向量,来计算:
下面是一个更复杂的例子:
如何用向量化的代码实现:
Theta和lamuda都是向量
章节6 Logistic回归(逻辑回归)
1.分类
预测变量y是个离散值的分类问题,logistic回归算法,比较流行。 对于分类问题,我们希望我们的分类器输出在0~1之间,这样可以更好的对结果分类。
先看二分类:
此图合理,阀值右边为正,左边为负。
别用线性函数去解决分类问题。上一个图看看起来很正常,但是当出现新数据时,为了拟合数据,函数会变动,出现新阀值点,导致预测失灵。
此图新阀值左边有两个预测错误的点。那这个线性函数就很差劲了。显然我们要找的是第一个阀值点,但是为了拟合数据,函数会得到错误的阀值点。所以,别用线性函数去解决分类问题。
我们用logistic回归算法来解决分类问题:
其特点是,算法的输出一直介于0和1之间
线性回归时的假设函数为:hΘ(x) = ΘTX
Logistic回归的假设函数:hΘ(x) = g(ΘTX) ; g(z) = 1 /1+e-z à hΘ(x) = 1 /1+e-ΘTX
即,分类问题的logistic回归算法的假设函数为:
这里的g(z)叫sigmoid函数,也叫logistic函数。
2.假设陈述
3.决策界限/决策边界
意思是:有确定的假设函数(之后会讲如何求参数);
根据logistic函数图像,和我们设定的阀值0.5,我们知道
-3+x1+x2>=0 à g(z)>=0.5 à y=1
即x1+x2=3这条线为决策边界,划分y=0和y=1区域。
决策边界是假设函数的一个属性,是根据决策函数求出的,而不是看着数据图画出来的。
例子:
4.代价函数
我们总希望代价函数是一个凸函数,这样很好求其最小值。
5.简化代价函数与梯度下降
如何运用梯度下降法来拟合出logistic回归的参数?
如何完整的实现一个logistic回归
合并:
整理后的代价函数:
现在,我们得到logistic回归的代价函数了,接着就是求代价函数的最小值。
用梯度下降法来最小化代价函数:
所以,线性回归和logistic回归是完全不一样的。
同时,在重复下降操作时,最好用向量化的方法去实现,要比循环来的更简介、更高效。
6.高级优化
比梯度下降更高效。
再来看一下梯度下降的思路:
所以,我们主要做的就是计算偏导数
这三种高级优化,可以根据内置循环自动得到学习率。用java编程时,可能需要多试几个函数库来找更合适的函数。
调用高级的优化算法,fminunc无约束最小化函数
7.多元分类:一对多
多类别分类:
一对多的分类:思路是这样的,不管 类别有多少个,都可以分为目标类和其他类两类,将这样一个个目标类的方法,把多个类一一分出来。
总结一下:我们训练一个逻辑回归分类器,预测i类别y=i的概率。最后为了做出预测,我们给出一个新的输入值x,期望获得预测。我们要做的就是,在比如三个分类器运行输入x,然后选择h最大的类别,也就是要选择分类器,选择出三个中可信度最高,效果最好的那个,无论i值是多少,我们都能得到一个最高的概率值,我们预测y就是那个值。
章节7 正则化
1.过拟合问题
正则化用于解决过拟合问题
概括的说,过拟合会在变量过多的时候出现。如果我们拟合出一个高阶多项式,那么这个假设函数,能拟合几乎所有的数据,这函数就可能,太过庞大、变量太多,我们没有足够的数据来约束它,这就是过拟合。它千方百计去拟合训练集,导致它泛化到新的样本中。类似的说法同样可以应用到逻辑回归中。
下面是一个逻辑回归的例子:
那么,过拟合问题发生时,怎么解决?
前面的例子,我们可以绘制图像来判断,我们先绘制拟合训练集的假设函数的图像。但是,当参数特别多,阶数特别高时,绘图会很难。
方法1:尽量减少选取变量的数量,即人工检查变量清单,删选变量。但有时会很难抉择。
方法2:正则化。保留所有的特征变量,但是要减少量级或参数thetaj的大小。
2.代价函数
进行正则化时,还需要写出相应的代价函数。
一些直观的例子去理解正则化:
修改一下,在函数中加入惩罚项,使得参数theta3和theta4都非常小:
现在,要使这个函数最小化的方法只有一个,那就是theta3和theta4要尽可能小,甚至是0最好,因为它俩的系数项很大,会使得整个函数变得很大,所以想最小化这个函数,需要将俩theta尽量接近于0,就像我们直接去掉这两项一样。
也就是这样:
这样,这个函数还是相当于二次函数。这就是正则化的思想。这种思想就是,如果我们的参数值特别小,意味着,这是一个特别简单的假设函数。如果将这些参数都加上惩罚项,这相当于尽量去简化这个假设函数模型,因为这些参数都接近0,,实时证明,这样可以避免过拟合的出现。你可以不用理解原因。再看一下房价的例子,有100个特征变量:
我们并不知道,那个参数是高阶项,所以每个都让它接近于0。即修改代价函数,来缩小所有的参数。加入一个新的项。新加项即为正则化项,可以缩小所有参数。
下面是正则化的优化目标:
3.线性回归的正则化
你要使用正则化,式子就要改变为:
4.Logistic回归的正则化
如何在更高级的优化算法中,使用正则化;对于这些高级算法,我们要做的是,自己定义一个costFunction函数,这个函数以参数变量theta作为输入(theta0z在Octave中写成theta(1) ,依次类推)。
我们需要做的就是建立一个叫costFunction的函数,然后将它赋给fminunc函数中,
fminunc---函数在无约束条件下的最小值,所有,fminunc会将costFunction最小化;而costFunction函数会返回两个值,第一个返回值:jVal,我们需要写代码来计算代价函数J,正则化求这个代价函数,需要加入正则化项;第二个返回值:梯度gradient(1)=J(theta)对theta0的偏导数;gradient(2)=J(theta)对theta1的偏导数;以此类推