资讯专栏INFORMATION COLUMN

Andrew Ng机器学习记录(一)

fizz / 3308人阅读

摘要:机器学习记录共三篇。本篇是关于机器学习网易云公开课前章的总结。机器学习要做的就是通过给出的数据用算法自动找到最小值时的这个点,而不需要人为的计算参数。多元线性回归模型关于特征范围的预处理和学习率的选取。

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。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18363.html

相关文章

  • Andrew Ng-Machine Learning 准备篇

    摘要:介绍吴恩达在上的机器学习下称课程,是经典的课程之一,内容深入浅出,几乎是入门的必修课之一。的官方资源,主要是课堂笔记和课后练习的一些资料。后续后面将会尝试将每周以单位更新每周的笔记,作为自己学习的一个进度的记录和反思。 介绍 吴恩达(Andrew Ng)在Coursea上的机器学习(Machine Learning下称ML)课程,是经典的ML课程之一,内容深入浅出,几乎是入门ML的必修...

    sshe 评论0 收藏0
  • 机器学习-斯坦福大学 -Andrew Ng: 前两周课程小结

    摘要:前两周的课程主要数学知识点为矩阵乘法如若可以相乘必然有,最后的结果为的在线性回归中矩阵用处在于数据量有数据有实际值向量预测值向量监督学习与非监督学习监督学习我们的目标是从输入到输出的一种映射关系。 1、前两周的课程主要数学知识点为 矩阵 乘法 A m*n B k*y 如若 A*B 可以相乘 必然有 n=k,最后的结果为 m*y的matrix 在线性回归中矩阵用处在于: x10 x11...

    zgbgx 评论0 收藏0
  • Andrew NG 深度学习课程笔记:神经网络、有监督学习与深度学习

    摘要:神经网络有监督学习与深度学习深度学习正在逐步地改变世界,从网络搜索广告推荐这样传统的互联网业务到健康医疗自动驾驶等不同的行业领域。有监督学习神经网络的分类很多,不过截止到目前大多数的有价值的神经网络都还是基于机器学习中所谓的有监督学习。 神经网络、有监督学习与深度学习从属于笔者的Deep Learning Specialization 课程笔记系列文章,本文主要记述了笔者学习 Andr...

    魏明 评论0 收藏0
  • Andrew NG 深度学习课程笔记:神经网络、有监督学习与深度学习

    摘要:神经网络有监督学习与深度学习深度学习正在逐步地改变世界,从网络搜索广告推荐这样传统的互联网业务到健康医疗自动驾驶等不同的行业领域。有监督学习神经网络的分类很多,不过截止到目前大多数的有价值的神经网络都还是基于机器学习中所谓的有监督学习。 神经网络、有监督学习与深度学习从属于笔者的Deep Learning Specialization 课程笔记系列文章,本文主要记述了笔者学习 Andr...

    Snailclimb 评论0 收藏0
  • Andrew NG 深度学习课程笔记:神经网络、有监督学习与深度学习

    摘要:神经网络有监督学习与深度学习深度学习正在逐步地改变世界,从网络搜索广告推荐这样传统的互联网业务到健康医疗自动驾驶等不同的行业领域。有监督学习神经网络的分类很多,不过截止到目前大多数的有价值的神经网络都还是基于机器学习中所谓的有监督学习。 神经网络、有监督学习与深度学习从属于笔者的Deep Learning Specialization 课程笔记系列文章,本文主要记述了笔者学习 Andr...

    wemallshop 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<