Supervised learning demo
监督学习案例
规范
- 假设函数: 使用h(hypothesis, 假设)表示
- 输入(input value)
- 向量或者实数: 使用小写字母x等
- 矩阵: 使用大写字母X等
- 输出(output value)
- 向量或者实数: 使用小写字母y等
- 矩阵: 使用大写字母Y等
- 参数(Parameters): \(\theta\)
- 样本的数量(列数): m
- 样本中特征(feature)的个数: n
- \(x_0^{(1)}\): 0表示第0个特征(为我们给出的样本中的特征是从1开始的,这里的0是我们自己添加上去的,所有的\(x_0^{(m)}\)都为1,其中1表示第几行数据, 它的一般式就是\(x_j^{(i)}\), 以后j表示第几个特征,i表示第几个样本
房价的Size和Price的预测
- X 为 房子的 Size
- 建立一个线性模型: \(h_\theta(x) = \theta_0 + \theta_1x\)
- 要让我们fit的model与y差异最小, 称之为最小化(minimize)
- 在这个案例中使用\[J(\theta_0, \theta_1) = {1\over2m}\sum_{i = 0}^m(h_\theta(x^{(i)}) - y^{(i)})^2\]
- 上面的就是我们的代价函数(cost function), 因为我们有让得到的和除以了2m, 所以我们的到函数也称之为平均误差函数(squared error function), 注意: cost function的自变量时theta_0和theta_1, 不在是我们熟悉的x了
- \[{minimize_{\theta_0\theta_1}} J(\theta_0, \theta_1)\]表示求出一个\(\theta_0\)和\(\theta_1\)使得\(J(\theta_0, \theta_1)\)的值最小, 我们称之为最小化的过程, 上面的这个表达式就是我们的优化目标(optimization objective), 也就是我们的目标函数
- 对于线性回归模型来说, 它的\(J(\theta_0, \theta_1)\)目标函数是一个凸函数(没有局部最优点, 只有一个全局的最优点), 在二维上是抛物线, 在三维上是一个碗状, 对于三维的(J有两个theta参数), 一般使用等高线图来替代三维凸函数
- 使用gradient regression梯度降维求出最优解, 梯度降维的公式为\(\theta_0 := \theta_0 - \alpha \times {\partial\over\partial\theta_0}J(\theta_0, \theta_1)\), 对于另一个\(\theta_1\)也是一样的, \(\theta_1 := \theta_1 - \alpha \times {\partial\over\partial\theta_1}J(\theta_0, \theta_1)\), 上面的是公式, 在实际更新我们的参数\(\theta_0, \theta_1\)的时候, 应该保证\(\theta_0, \theta_1\)同步更新, 所以应该这样子\[tmp0 := \theta_0 - \alpha \times {\partial\over\partial\theta_0}J(\theta_0, \theta_1)\] \[tmp1 := \theta_1 - \alpha \times {\partial\over\partial\theta_1}J(\theta_0, \theta_1)\] \[\theta_0 := tmp0\] \[\theta_1 := tmp1\], 在最后同步更新\(\theta_0\)和\(\theta_1\)的值
- 关于梯度下降公式的细节
- 公式中, \(\alpha\)表示学习率, \({\partial\over\partial\theta_0}J(\theta_0, \theta_1)\)表示梯度下降的方向, 所以\(\alpha \times {\partial\over\partial\theta_0}J(\theta_0, \theta_1)\)表示\(\theta_0\)要更新多少的值, 形象一点就是说, 一个人在一个山顶上, 他步子的大小为\(\alpha\), 他希望尽快下山的方向为\({\partial\over\partial\theta_0}J(\theta_0, \theta_1)\), 这样我们就可以更新\(\theta_0\)的值了
- 虽然我们在公式中规定了\(\alpha\)学习率, 但是并不代表我们走的每一步就是不变的, 因为导数是在变化的, 为最低点的时候为0, 在其他地方有时别的值
- 要应用梯度下降法, 我们需要为\(\theta_0\)和\(\theta_1\)进行初始化, 一般来说都初始化为0, 但是也要视情况而定
- 什么时候停止梯度下降?
- 我们可以规定一个阈值, 当我们的\(\alpha \times {\partial\over\partial\theta_0}J(\theta_0, \theta_1)\)小于这个阈值的时候停止, 这个是通过计算机自动停止迭代的, 但是不推荐使用
- 另外一种方式就是通过画出\(minimize_{\theta_0\theta_1}J(\theta_0, \theta_1)\)与迭代次数的图像来判断应该迭代多少次, 如果画出来的是一个抛物线则表示我们设置的\(\alpha\)学习率太大了, 应该减小\(\alpha\)的值
- 其他
- 对于这个房价的模型, 我们除了使用梯度下降的方法求出我们的目标函数之外还可以使用matrix的方法来求, 这个更加的简单
- 我们每求一次\(J(\theta_0, \theta_1)\)的值就要遍历一遍所有的数据, 因为the definition of the \(J(\theta_0, \theta_1)\) is \[\sum_{i=1}^{m}{1\over2m}{(h(x^{(i)}) - y^{(i)})^2})\], 这种方式我们称之为Batch梯度下降
房价的Size和Price的预测-其他解决方案
在上一节中我们已经得到了一个线性模型\(h_\theta(x) = \theta_0 + \theta_1x\),根据这个假设函数我们定义出了一个目标函数(也称之为损失函数)\[J(\theta_0, \theta_1) = {1 \over 2m}\sum_{i = 0}^{m}(h(x^{(i)}) - y^{(i)})^2\]接着通过梯度下降的方法计算出\(minimize_{\theta_0\theta_1}J(\theta_0, \theta_1)\), 我们知道这种方法需要对进行迭代,比较麻烦,那有没有更加简单的方法呢?能不能一次迭代就可以求出我们的\(\theta_0\)和\(\theta_1\)呢?答案就是正规方程
- 正规方程: \(\theta = (A^{T}A)^{-1}A^{T}y\)
- 其中\(\theta\)为一个列向量, 表示我们所有的参数
\[
\begin{bmatrix}
\theta_0 \\
\theta_1
\end{bmatrix}
\] A 表示输入的 x 组成的矩阵, 这里就是
\[
\begin{bmatrix}
1 & x_1^{(1)} \\
1 & x_1^{(2)} \\
\vdots & \vdots \\
1 & x_1^{(m)}
\end{bmatrix}
\]
上面的矩阵的原型就是
\[
\begin{bmatrix}
x_0^{(1)} & x_1^{(1)} \\
x_0^{(2)} & x_1^{(2)} \\
\vdots & \vdots \\
x_0^{(m)} & x_1^{(m)}
\end{bmatrix}
\]从上面我们可以知道\(x_0^{(n)}\)是值为1,这里的
\[
\begin{bmatrix}
x_0^{(1)} \\
x_0^{(2)} \\
x_0^{(3)} \\
\vdots \\
x_0^{(m)}
\end{bmatrix}
\]- 就是我们自己添加上去的新的特征值,这个特征比较特殊,因为它所有的值都为0,为什么要这样做?通过观察假设函数\(h(x^{(i)}) = \theta_0 \times 1 + \theta_1x^{(i)}\)我们发现,之后\(\theta_0\)没有自变量,为了数学上的统一,于是我们对其进行修改\(h(x^{(i)}) = \theta_0x_0^{(i)} + \theta_1x_1^{(i)}\),其中\(x_0^{(i)}\)为1。
其中y为一个列向量,它的值为
\[
\begin{bmatrix}
y^{(1)} \\
y^{(2)} \\
y^{(3)} \\
\vdots \\
y^{(m)}
\end{bmatrix}
\]
是\(x_j^{(i)}\)对象的标签值
- 其中\(\theta\)为一个列向量, 表示我们所有的参数
- 如果构建 A ?
首先,在书写假设函数的时候应该安装阶数的升序书序,如\(h(x^{(i)}) = \theta_0 + \theta_1x_1^{(i)} + \theta_2{(x_1^{(i)})}^2\)或者\(h(x^{(i)}) = \theta_0 + \theta_1x_1^{(i)} + \theta_2x_2^{(i)}\)分别从方便的式子中构建 A
第一个是
\[
\begin{bmatrix}
1 & x_1^{(1)} & {(x_1^{(1)})}^2 \\
1 & x_1^{(2)} & {(x_1^{(2)})}^2 \\
\vdots & \vdots & \vdots \\
1 & x_1^{(m)} & {(x_1^{(m)})}^2 \\
\end{bmatrix}
\]第二个是
\[
\begin{bmatrix}
1 & x_1^{(1)} & x_2^{(1)} \\
1 & x_1^{(2)} & x_2^{(2)} \\
\vdots & \vdots & \vdots \\
1 & x_1^{(m)} & x_2^{(m)} \\
\end{bmatrix}
\]
- 如果已经构建出了矩阵 A,接下来的y的构建是非常简单的,就是安装y给出的顺序构建一个列向量即可
带入公式就可以直接求出 \(\theta\)
- 正规方程的优点
- 不需要像梯度下降法一样麻烦,需要换出\(minimize_{\theta_0\theta_1}J(\theta_0, \theta_1)\)和迭代次数的图像来确定迭代的次数,除此之外还要确定出\(\alpha\)学习率的大小
- 不需要进行Feature Scaling, 也就是对数据进行标准化, 如果进行了标准化返回会降低准确度
- 正规方程的缺点
- 在公式中发现这个A矩阵包含了所有的输入,如果输入量非常的大,则A矩阵就会非常大,在计算\({(A^{T}A)}^{-1}\)矩阵的维度就会增大,并且求矩阵的逆在大数据的情况下是非常消耗计算机的性能的
- 使用的范围小,只适用于线性回归,而梯度下降使用的范围要广很多
房价的Size和Price的预测-多变量
在上两节中我们只考虑到了房子的大小和房子的关系,当然这个是不包括我们计自己添加上去的第0个特征,它们的值都为1。下面我们再添加一些特征,下面就添加 Age。
此时我们的假设函数为\(h(x^{(i)}) = \theta_0 + \theta_1x_1^{(i)} + \theta_2x_2^{(i)}\),其中\(x_1^{(i)}\)为size输入,\(x_2^{(i)}\)为age的输入,构建目标函数(cost function)\[J(\theta_0, \theta_1, \theta_2) = {1 \over 2m}\sum_{i = 0}^{m}(h(x^{(i)}) - y^{(i)})\],为了方便起见,通常我们会将向量输入到函数中而不是一个实数,因为在编程中我们就是输入向量或者矩阵的\[J(\theta) = {1 \over 2m}\sum_{i = 0}^{m}(h(x^{(i)}) - y^{(i)})\]其中,\(\theta\)是一个向量,它的值为\[
\begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2
\end{bmatrix}
\]接下来就是我们熟悉的步骤了通过画出\(minimize_{\theta_0, \theta_1, \theta_2}J(\theta_0, \theta_1, \theta_2)\)和迭代次数的图求出应该迭代几次,关于\(minimize_{\theta_0, \theta_1, \theta_2}J(\theta_0, \theta_1, \theta_2)\)$的值已经在前几节讲过了,使用梯度下降的方法
\[
tmp0 := \theta_0 - \alpha \times {\partial\over\partial\theta_0}J(\theta)
\]
\[
tmp1 := \theta_1 - \alpha \times{\partial\over\partial\theta_1}J(\theta)
\]
\[
tmp2 := \theta_2 - \alpha \times{\partial\over\partial\theta_2}J(\theta)
\]
\[
\theta_0 := tmp0
\theta_1 := tmp1
\theta_2 := tmp2
\]
在最后同步更新\(\theta_0\), \(\theta_1\)和\(\theta_2\)的值,道理都是一样的
另外的思考-房子的宽(width)和长(length)对房价进行预测
- 根据标题知道,题目给出了两个特征width和length,我们当然可以和上一节那样构建假设函数,上一节的假设函数绝对是首选,但是如果拟合的不好呢?这就意味着我们需要重新构建假设函数,现在我们构建一个新的假设函数\(h(x^{(i)}) = \theta_0 + \theta_1{x_1^{(i)}} + \theta_2{(x^{(i)})}^{2}\),我们发现这与我们之前的假设函数不一样的地方在于有2阶,这个地方就有技巧了,将\({x_1^{(i)}}\)看成一个新的特征\(xnew_1^{(i)}\) 和 \({(x_2^{(i)})}^{2}\)看成另外一个新的特征\(xnew_2^{(i)}\),这样子我们的假设函数就又成为了一阶了的,操作步骤就和之前的一样了
对数据的处理
在获取到需要训练的数据的时候,我们需要对数据进行去均值化
- 什么是去均值化
- 去均值化就是将我们的一列数据的范围固定到\(-1 \to 1\)$这个范围之间,但是这个范围不是硬性要求,可以在这个区间内波动
公式:
\[
v = {{x - avg} \over {max - min}}
\]- v 为去均值之后的数据样本列向量
- x 为待去均值的数据样本列向量
- avg 为 x 的均值
- max 为 x 的最大值
- min 为 x 的最小值
- 还是要提的是x是一个列向量,就是我们数据表中的一列,就是\(x_j^{(i)}\)中的第j个特征的所有的值
- 举例:
假设我们的房价中size的范围是在(0, 3000)区间内,可想而知有10,有200, 有3000,这样数据之间的差异太大了,对我们的拟合时候影响的,如果我们使用梯度下降发进行最小化,因为数据差异大,会导致最小化的速度变慢
使用公式
\[
v = {{x - avg} \over {max - min}}
\]
得到的v,它所有元素的大小都在\(-1 \to 1\)区间内
为什么要去均值
- 很简单,为了在使用梯度下降的方法进行最小化的时候加快速度
执行去均值之后,我们应该保存mean和std,因为我们使用的是去均值之后的数据拟合的模型,在使用这个模型的时候,我们也要对输入进行去均值,这样拟合出来的数据才是我们需要的。
所有在之前的案例中,我们应该加上去均值这一步
Supervised learning demo的更多相关文章
- A Brief Review of Supervised Learning
There are a number of algorithms that are typically used for system identification, adaptive control ...
- Machine Learning Algorithms Study Notes(2)--Supervised Learning
Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 本系列文章是Andrew Ng 在斯坦福的机器学习课程 CS 22 ...
- Supervised Learning and Unsupervised Learning
Supervised Learning In supervised learning, we are given a data set and already know what our correc ...
- A brief introduction to weakly supervised learning(简要介绍弱监督学习)
by 南大周志华 摘要 监督学习技术通过学习大量训练数据来构建预测模型,其中每个训练样本都有其对应的真值输出.尽管现有的技术已经取得了巨大的成功,但值得注意的是,由于数据标注过程的高成本,很多任务很难 ...
- 监督学习Supervised Learning
In supervised learning, we are given a data set and already know what our correct output should look ...
- 学习笔记之Supervised Learning with scikit-learn | DataCamp
Supervised Learning with scikit-learn | DataCamp https://www.datacamp.com/courses/supervised-learnin ...
- (转载)[机器学习] Coursera ML笔记 - 监督学习(Supervised Learning) - Representation
[机器学习] Coursera ML笔记 - 监督学习(Supervised Learning) - Representation http://blog.csdn.net/walilk/articl ...
- Introduction - Supervised Learning
摘要: 本文是吴恩达 (Andrew Ng)老师<机器学习>课程,第一章<绪论:初识机器学习>中第3课时<监督学习>的视频原文字幕.为本人在视频学习过程中逐字逐句记 ...
- supervised learning|unsupervised learning
监督学习即是supervised learning,原始数据中有每个数据有自己的数据结构同时有标签,用于classify,机器learn的是判定规则,通过已成熟的数据training model达到判 ...
随机推荐
- C#字符串要点(复习专用)
一.字符串 通过string定义一个字符串,或者通过String类来创建对象. 通过new String() 创建有一下几种构造函数(从元数据),以此顺序创建string: // // 摘要: // ...
- Python3下的paramiko模块
paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 默认Python没有,需要手动安装:pip install paramiko SSH密码认证远 ...
- Java基础之身份证验证
//简约版package test; import java.util.Scanner; public class ID { /** * 匹配算法 : 1) 得到17位身份证号码与下面给出的17位 2 ...
- Oracle复制表
Oracle复制表分为只复制表结构或者结构和数据均复制两种: 只复制表结构 create table newTableName as select * from oldTableName where ...
- 5分钟构建无服务器敏感词过滤后端系统(基于FunctionGraph)
摘要:开发者通过函数工作流,无需配置和管理服务器,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统.托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行,极大地提高了开发和运维效率,减小 ...
- Python中使用Beautiful Soup库的超详细教程
[参考文献] http://www.jb51.net/article/65287.htm
- P3167 [CQOI2014]通配符匹配 题解
题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...
- complex 类
//定义一个复数类Complex,使得下面的代码能够工作. //Complex c1(3,5)//用复数3+5i初始化c1 //complex c2=4.5//用实数4.5初始化c1 //comple ...
- Python迭代器生成器,模块和包
1.迭代器和生成器 2.模块和包 1.迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和__next__()方法. 其中__it ...
- fiddler抓包出现错误 creation of the root certificate was not successful
fiddler安装完要配置才可以抓取HTTP 1.首先 找到Tools——>Options,在弹出的菜单中 选择https项 勾选捕捉https,这样配置完OK之后 一般会弹窗提示安装证书,点击 ...