打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Andrew Ng机器学习记录(一)

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)
  1. 给出
    的初值
  2. 每次改变一点直到到达局部最优解

初值偏移的方位稍有不同可能会到达不同的局部最优解,达到局部最优解时斜率为0 即偏导为0,

不在改变。

在运用梯度下降法时需注意:
· 同时更新

·

为学习率,决定下山的一步迈多大(
每次移动多少),恒为正

·

为偏导,有正有负。

将梯度下降法通俗的解释可以说:我站在山的某一处,要找到最快下山的路,一是我下一步迈向哪个方向;二是这一步迈多大,达成到达最低点的目的,这就是梯度下降法做的。

梯地下降法也可用于计算其他函数的代价函数,而不仅是以上作为例子介绍的回归函数。

  • 将梯度下降法用在回归函数中

梯度下降法会陷入局部最优,而回归函数是一个凸函数(它的图像形状是一个碗状),只有一个全局最优解,这时用梯度下降法可以得到一个最小值,即要求的值。

梯度下降法是一种迭代算法,逐步计算更新回归函数里的

,其中偏导项是斜率。

因此在上图中,右边红色的点每移动一下,左边的直线会随斜率的改变而改变,红色的点到达最低点时,直线最好的拟合了数据。

Linear Algebra Review

  • 关于矩阵

在算法学习中需要有把数据在函数中的使用拆成矩阵的计算能力,向量也可视为列数为 1 特殊的矩阵,关于线性代数的知识这里不再赘述。

Linear Regression with Multiple Variables

  • 多元线性回归模型

关于特征范围的预处理和学习率的选取。

· 从 1 个特征值拓展到多个特征值

·

上标表示第i个特征,下标表示第 i 个特征的第几个元素

· 多个特征在相近的范围内,梯度下降法才可快速收敛

· 采用均值归一化处理

· 可以用迭代次数和J(

)的函数来判断梯度下降法是否收敛,也可以用小于阈值的方法自动判断,但阈值一般难以设定,所以推荐用下图左边观察图像的方法。

· 学习率

过小,收敛将变慢,
过大会导致J(
)不是在下降,出现这种情况时(如下图左侧图像所示),解决方法是使用更小的
,尝试一系列的
值,Ng 使用 3 的倍数来逐个测试,在最大和最小的
值范围内找大最大可能值的
(或比它小一点也是可以的)。

  • 多项式回归

关于用二次函数、三次函数等拟合。

此时注意特征缩放,适合数据走向的函数图形,你可以自己选择特征,可以自己设计特征(如房屋面积 = 长 * 宽) ​​​​。

  • 正规方程

不同于梯度下降法,它不需要重复多次运算,可以一次性求出

的解析解,原理是偏导数为 0 时求出最小值。

用上图红色框中的式子计算

,再分别写出对应的 x 和 y 。

如果有特别多(百万级)的特征时则用梯度下降法(Ng 以一万为界考虑)。

当出现不可逆的情况时,可能是有多余的特征值或有过多的特征值(样本数 m < 特征数="">

用 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 变量

>>>format long %输入format long,让字符串显示默认位数>>>>aa = 3.14159265358979>>>>format short %输入format short,输出小数点后少的位数>>>>aa = 3.1416' title='' data-original-title='复制'>
赋值 a = 3 会打印a = 3; 有分号不打印 隐藏了>>>>a = pi;>>>>a %按a输出下面a = 3.1416disp(a) %disp是一个打印命令>>>>disp(a)3.1416>>>>disp(sprintf('2 decimals: %0.2f', a )) %保留 2 位小数的写法 %0.2f2 decimals: 3.14>>>>format long %输入format long,让字符串显示默认位数>>>>aa = 3.14159265358979>>>>format short %输入format short,输出小数点后少的位数>>>>aa = 3.1416

向量和矩阵

>>>>A = [1 2; %矩阵的写法1> 3 4;> 5 6]A = 1 2 3 4 5 6>>>>A = [1 2; 3 4; 5 6] %矩阵的写法2A = 1 2 3 4 5 6>>>>v = 1: 0.1: 2 %从 1 开始,步长为 0.1,一直增加到2v = 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标准差或方差为1w = 0.50732 1.51904 -1.28292hist(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) %返回最大维度的大小,可以对矩阵使用但是也会造成confusingans = 3>>>>length([1;2;3;4;5]) %通常对向量使用ans = 5

从文件中加载和查找数据

>>>>pwdans = /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 doubleTotal 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

对矩阵中的元素进行运算

>>>val = max(a)val = 15>>>>[val, ind] = max(a) %ind是max(a)索引val = 15ind = 2>>>>max(A) %默认输出每一列的最大值ans = 5 6>>>>aa = 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 2c = 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) %求伪逆' title='' data-original-title='复制'>
>>>>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 = 15ind = 2>>>>max(A) %默认输出每一列的最大值ans = 5 6>>>>aa = 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 2c = 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)

>>>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; %用逗号连续调用函数' title='' data-original-title='复制'>
>>>>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;>>>>vv = 2 4 8 16 32 64 128 256 512 1024>>>>indices = 1:10;>>>>indicesindices = 1 2 3 4 5 6 7 8 9 10>>>>for i = indices %另一种方法,用索引> disp(i);> end;12345678910>>>>while i<>5 %while的使用> v(i) = 100;> i = i + 1;> end;>>>>vv = 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。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
机器学习之如何完成矩阵的参数求导?
主成分分析、线性回归-简要说明
机器学习中的最优化算法总结
机器学习萌新必备的三种优化算法 | 选型指南
深度学习模型的构建
ML,DL核心数学及算法知识点总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服