课时05 Octave教程(Octave Tutorial)

Octave 与 Matlab 的区别

  • 语法方面:Octave 最初便是模彷 Matlab 而设计,语法基本上与 Matlab 一致,严谨编写的代码应同时可在 Matlab 及Octave 运行,但也有很多细节上差别。一些软件开发小组也使用两者兼容的语法,直接开发可以同时在 Matlab 和 Octave 使用的程序。
  • 占用空间:Octave 比较小,安装程序只有几十兆;而 Matlab 非常庞大,是因为有大量的面向各种应用领域的工具箱,Octave 无法相比的。
    所以,本人采用 Matlab 软件完成这节课的学习。

基本操作

运算符

  • 现在打开 Matlab,这是 Matlab 命令行:在这里插入图片描述
  • 输入3 – 2、5×8、1/2、2^6 等等,得到相应答案。
    在这里插入图片描述
  • 也可以做逻辑运算,计算结果为假,这里用 0 表示;计算结果为真,这里用 1 表示。
    在这里插入图片描述
    • 请注意,不等于符号的写法是这个波浪线加上等于符号 ( ~= ),而不是等于感叹号加等号( != ),这是和其他一些编程语言中不太一样的地方。
  • 逻辑运算 1 && 0,使用双 & 符号表示逻辑与,1 && 0判断为假,1 和 0 的或运算 1 || 0,其计算结果为真。
    在这里插入图片描述
  • 异或运算,如 xor ( 1, 0 ),其返回值为 1。
    在这里插入图片描述

变量

  • 写一个变量,对变量 a 赋值为 3,并按下回车键,显示变量 a 等于 3。
    在这里插入图片描述
  • 如果你想分配一个变量,但不希望在屏幕上显示结果,你可以在命令后加一个分号,可以抑制打印输出,敲入回车后,不打印任何东西。
    在这里插入图片描述
  • 现在举一个字符串的例子:变量 b 等于 “hi”。
    在这里插入图片描述
  • c 等于 3 大于等于 1,所以,现在 c 变量的值是真。
    在这里插入图片描述
  • 设置 a 等于圆周率,如果我要打印该值,那么只需键入 a 像这样,就打印出来了。
    在这里插入图片描述
  • 对于更复杂的屏幕输出,也可以用 disp 命令显示(显示一个数组或字符串的内容): 在这里插入图片描述
  • fprintf :执行格式化写入到屏幕或文件。
    在这里插入图片描述
  • 也有一些控制输出长短格式的快捷命令:
    在这里插入图片描述

向量和矩阵

  • 建立一个矩阵 A、行向量 v、列向量v;
    在这里插入图片描述在这里插入图片描述
  • 这个集合 v 是一组值,从数值 1 开始,增量或说是步长为 0.1,直到增加到 2,按照这样的方法对向量 V 操作,可以得到一个行向量,这是一个 1 行 11 列的矩阵,其矩阵的元素是1 1.1 1.2 1.3,依此类推,直到数值 2。
    在这里插入图片描述
  • 也可以建立一个集合 v 并用命令 “1:6” 进行赋值,这样就 V 被赋值了 1 至 6 的六个整数。
    在这里插入图片描述
  • 还有一些其他的方法来生成矩阵;
    在这里插入图片描述
  • 元素都为 2,两行三列的矩阵,就可以使用这个命令:
    在这里插入图片描述
  • w 为一个一行三列的零矩阵,一行三列的矩阵 w 里的元素全部是零:
    在这里插入图片描述
  • 用 rand 命令建立一个一行三列的矩阵,因为使用了 rand 命令,则其一行三列的元素均为随机值,如 “rand(3,3)” 命令,这就生成了一个 3×3 的矩阵,并且其所有元素均为随机。数值介于 0 和 1 之间,所以,正是因为这一点,我们可以得到数值均匀介于 0 和 1 之间的元素。
    在这里插入图片描述
  • 高斯随机变量,正态分布的随机变量,可以设置 “w = randn(1,3)”,你会得到三个数值,他们服从高斯分布,均值为 0 ,标准差或者方差为 1;
    在这里插入图片描述
  • 还可以设置更复杂的,用直方图表示出来;
    在这里插入图片描述
    在这里插入图片描述
    • 均值为 -6 的高斯分布直方图,这个高斯随机变量的方差为 10,标准差为 10 \sqrt{10} 10
      在这里插入图片描述
  • 生成矩阵的特殊命令:eye命令:表示生成单位矩阵。
    在这里插入图片描述
  • 如果对命令不清楚,建议用help命令:
    在这里插入图片描述
  • size() 命令返回矩阵的尺寸。我输入,得到我们之前构建的矩阵 A,所以 size(A) 命令返回3 2,3 2分别表示矩阵的维度。
    在这里插入图片描述
    • 实际上,size() 命令返回的是一个 1×2 的矩阵,我们可以用 sz 来存放。你也可以键入 size(A, 1),将返回 3,这个命令会返回矩阵的第一个元素,矩阵的第一个维度的尺寸,也就是 A 矩阵的行数。同样,命令 size(A, 2),将返回 2,也就是 A 矩阵的列数。
      在这里插入图片描述
  • length(),这个命令将返回最大维度的大小,
    • length(v) v 是一个向量:
      在这里插入图片描述
    • length(A) A 是一个 3*4 的矩阵,最大的维度应该是3,因此该命令会返回3:
      在这里插入图片描述

移动数据

在系统中加载数据和寻找数据

  • 当我们打开 Matlab 时,我们通常已经在一个默认路径中,这个路径是 Matlab 的安装位置,pwd 命令可以显示出 Matlab 当前所处路径。
    在这里插入图片描述
  • cd 命令,意思是改变路径,我可以把路径改为 C:\Users\Administrator\Desktop,这样当前目录就变为了桌面。如果键入 ls,ls 来自于一个 Unix 或者 Linux 命令,ls 命令将列出我桌面上的所有路径。
    在这里插入图片描述
  • featuresX 是我存放数据的文档,那么应该怎样把数据读入 Matlab 呢?我们只需要键入 load featuresX.dat,这样我将加载了 featuresX 文件。还可以把命令写成字符串的形式load(‘featureX.dat’),也是可以的,这跟刚才的命令效果是相同的,只不过是把文件名写成了一个字符串的形式,现在文件名被存在一个字符串中。
    在这里插入图片描述
  • 另外 who 命令,能显示出在我的 Matlab 工作空间中的所有变量:
    在这里插入图片描述
    • 所以我可以键入 featuresX 回车,来显示 featuresX:
      在这里插入图片描述
    • 还可以键入 size(featuresX),得出的结果是 10 2,代表这是一个 10×2 的矩阵。
      在这里插入图片描述
  • who 函数能让你看到当前工作空间中的所有变量,同样还有另一个 whos 命令,能更详细地进行查看。同样也列出我所有的变量,不仅如此,还列出了变量的维度。double 意思是双精度浮点型,这也就是说,这些数都是实数,是浮点数。
    在这里插入图片描述
  • 如果你想删除某个变量,你可以使用 clear 命令,我们键入 clear featuresX,然后再输入 whos 命令,你会发现 featuresX 消失了。
    在这里插入图片描述

储存数据

  • 我们设变量 v = priceY(1:10),这表示的是将向量 priceY 的前10个元素存入 v 中。
    在这里插入图片描述
  • 假如我们想把它存入硬盘,那么用 save hello.mat v 命令,这个命令会将变量 v 存成一个叫 hello.mat 的文件,回车在我的桌面上就出现了一个新文件,名为 hello.mat。
    在这里插入图片描述
  • 现在我们清除所有变量,直接键入clear,这样将删除工作空间中的所有变量,所以现在工作空间中什么都没了。
    在这里插入图片描述
  • load hello.mat 文件,又可以重新读取变量 v,所以 save 命令就是把数据按照二进制形式储存,或者说是更压缩的二进制形式,因此,如果是很大的数据,那么压缩幅度也更大,占用空间也更小。
    在这里插入图片描述
  • 如果你想把数据存成一个人能看懂的形式,那么可以输入:save hello.txt v -ascii 这样就会把数据存成一个文本文档,或者将数据的 ascii 码存成文本文档。
    在这里插入图片描述
    在这里插入图片描述
  • 输入了这个命令以后,我的桌面上就有了 hello.txt 文件。如果打开它,我们可以发现这个文本文档存放着我们的数据。这就是读取和储存数据的方法。

操作数据

  • 假如 A 还是那个矩阵,加上索引值,比如输入 A(3,2),表示矩阵的第三行和第二列对应的元素,因此也就对应 6。
    在这里插入图片描述
  • 也可以输入 A(2,:) 来返回第二行的所有元素,输入 A(:,2),返回矩阵第二列的所有元素,冒号表示该行或该列的所有元素。
    在这里插入图片描述在这里插入图片描述
  • 较为复杂的索引,输入 A ( [ 1    3 ] , : ) A([1\ \ 3], :) A([1  3],:),这个命令意思是取矩阵第一个索引值为1或3的元素,也就是取的是A矩阵的第一行和第三行的每一列,冒号表示的是取这两行的每一列元素,即:
    在这里插入图片描述
  • 也可以为它赋值,取 A 矩阵的第二列,然后将它赋值为10 11 12,实际上就是取出了 A 的第二列,然后把一个列向量 [10;11;12] 赋给了它,因此现在 A 矩阵的第一列还是 1 3 5,第二列就被替换为 10 11 12。
    在这里插入图片描述
  • 把 A 设为 A = [A,[100;101;102]],这样做的结果是在原矩阵的右边附加了一个新的列矩阵,就是把 A 矩阵设置为原来的 A 矩阵再在右边附上一个新添加的列矩阵。
    在这里插入图片描述
  • 还有一个很特别的语法结构,输入 A ( : ) A(:) A(:),意思是把 A 中的所有元素放入一个单独的列向量,这样我们就得到了一个 9×1 的向量,这些元素都是 A 中的元素排列起来的。
    在这里插入图片描述
  • 把 A 重新设为 [1 2; 3 4; 5 6],我再设一个 B 为[11 12; 13 14; 15 16],新建一个矩阵 C,C = [A B],这个意思就是把这两个矩阵直接连在一起,矩阵 A 在左边,矩阵 B 在右边,这样组成了 C 矩阵,就是直接把 A 和 B 合起来。
    在这里插入图片描述
    注意:这个 [A B] 命令跟 [A, B] 是一样的,这两种写法的结果是相同的。
  • 还可以设C = [A; B],这里的分号表示把分号后面的东西放到下面。所以,[A;B] 的作用依然还是把两个矩阵放在一起,只不过现在是上下排列,所以现在 A 在上面 B 在下面, C 就是一个 6×2 矩阵。
    在这里插入图片描述

计算数据

快速地初始化一些变量。比如设置 A 为一个 3×2 的矩阵,设置 B 为一个 3 ×2 矩阵,设置 C 为 2 × 2 矩阵。
在这里插入图片描述

  • 计算两个矩阵的乘积,比如说 A × C,只需输入 A × C,这是一个 3 × 2 矩阵乘以 2 × 2 矩阵,得到这样一个 3 × 2 矩阵。
    在这里插入图片描述
  • 也可以对每一个元素,做运算,方法是做点乘运算 A.*B,这么做 Matlab 将矩阵 A 中的每一个元素与矩阵 B 中的对应元素相乘:A.*B
    在这里插入图片描述
  • 通常来说,在Matlab 中,点号一般用来表示元素位运算。输入A.^2,这将对矩阵 A 中每一个元素平方。
    在这里插入图片描述
  • 设 v 为 [1; 2; 3] 是列向量,你也可以输入1./v,得到每一个元素的倒数
    在这里插入图片描述
  • 求对数运算,也就是对每个元素进行求对数运算。
    在这里插入图片描述
  • 自然数 e 的幂次运算,就是以 e 为底,以这些元素为幂的运算。
    在这里插入图片描述
  • abs(v) 对 v 的每一个元素求绝对值;-v,给出 v 中每个元素的相反数;
    在这里插入图片描述
  • 对 v 中的每个元素都加1,首先构造一个 3 行 1 列的 1 向量,然后把这个 1 向量跟原来的向量相加,因此 v 向量从 [1 2 3] 增至 [2 3 4]。用 length(v) 命令,这样 ones(length(v) ,1) 就相当于 ones(3,1),然后做 v + ones(3,1),也就是将 v 的各元素都加上这些 1。
    在这里插入图片描述
    • 另一种更简单的方法是直接用 v + 1,v + 1 也就等于把 v 中的每一个元素都加上 1。
      在这里插入图片描述
  • 用A’,将得出 A 的转置矩阵。
    在这里插入图片描述
  • a=[1 15 2 0.5],这是一个 1 行 4 列矩阵,val=max(a),这将返回矩阵中的最大值 15。
    在这里插入图片描述
  • 还可以写 [val, ind] =max(a),这将返回 a 矩阵中的最大值存入 val,以及该值对应的索引 ind。
    在这里插入图片描述
  • 特别注意一下,如果用命令 max(A),A 是一个矩阵的话,这样做就是对每一列求最大值。
    在这里插入图片描述
  • 输入 a < 3,这将进行逐元素的运算,对矩阵 a 的每一个元素与 3 进行比较,然后根据每一个元素与 3 的大小关系,返回 1 和 0 表示真与假。
    在这里插入图片描述
  • find( a < 3),可以找到 a 中的哪些元素是小于 3 的。
    在这里插入图片描述
  • magic 函数将返回一个矩阵,称为魔方阵或幻方 (magic squares),它们具有以下这样的数学性质:它们所有的行和列和对角线加起来都等于相同的值(每一行、每一列、每一个对角线三个数字加起来都是等于同一个数)。
    在这里插入图片描述
  • [r,c] = find(A>=7),这将找出所有矩阵中大于等于 7 的元素,因此, r 和 c 分别表示行和列,这就表示,第一行第一列的元素大于等于 7,第三行第二列的元素大于等于 7,第二行第三列的元素大于等于 7。
    在这里插入图片描述
  • 求和函数,输入 sum(a),就把 a 中所有元素加起来了。
    在这里插入图片描述
  • 乘法函数,输入 prod(a),prod 意思是product(乘积),它将返回这四个元素的乘积。
    在这里插入图片描述
  • floor(a) 是向下四舍五入,因此对于 a 中的元素 0.5 将被下舍入变成 0。
    在这里插入图片描述
  • ceil(a),表示向上四舍五入,所以 0.5 将上舍入变为最接近的整数,也就是 1。
    在这里插入图片描述
  • 输入 max(rand(3),rand(3)),这样做的结果是返回两个 3×3 的随机矩阵,并且逐元素比较取最大值。
    在这里插入图片描述
  • max(A,[],1),这样做会得到每一列的最大值;输入 max(A,[],2),这将得到每一行的最大值。
    在这里插入图片描述
  • 默认情况下 max(A) 返回的是每一列的最大值,如果你想要找出整个矩阵 A 的最大值,你可以输入 max(max(A))。或者将 A 矩阵转成一个向量,然后输入 m a x ( A ( : ) ) max(A(:)) max(A(:)),这样做就是把 A 当做一个向量,并返回 A 向量中的最大值。
    在这里插入图片描述
  • 把 A 设为一个 9 行 9 列的魔方阵,魔方阵具有的特性是每行每列和对角线的求和都是相等的。 sum(A,1),就得到每一列的总和,这也验证了一个 9 × 9 的魔方阵确实每一列加起来都相等,都为 369。
    在这里插入图片描述
    • 求每一行的和,输入 sum(A,2),这样就得到了 A 中每一行的和加起来还是 369。
      在这里插入图片描述
    • 算 A 的对角线元素的和。先构造一个 9 × 9 的单位矩阵,输入 eye(9),然后用 A 逐点乘以这个单位矩阵,除了对角线元素外,其他元素都会得到0。输入 sum(sum(A.*eye(9)) ,求得 A 矩阵对角线元素的和也是 369。
      在这里插入图片描述
    • 也可以求另一条对角线的和也是 369。flipup/flipud 表示向上/向下翻转。
      在这里插入图片描述
  • 求这个矩阵的逆矩阵,输入 pinv(A),通常称为伪逆矩阵。设 temp = pinv(A),然后再用 temp 乘以 A,实际上得到的就是单位矩阵,对角线为 1,其他元素为 0。
    在这里插入图片描述
    在这里插入图片描述

绘图数据

绘制成本函数 J ( θ ) J(\theta) J(θ),可以帮助确认梯度下降算法是否收敛。通常情况下,绘制数据或学习算法所有输出,也会启发你如何改进你的学习算法。Matlab 的工具可以帮助你来绘制和可视化你的数据。

  • 先来快速生成一些数据用来绘图。绘制正弦函数,横轴是变量 t,纵轴是 y1,只需要输入 plot(t,y1),并回车,就出现了这个图:
    在这里插入图片描述
  • 绘制余弦函数:输入 plot(t,y2); Matlab 会消除之前的正弦图,并且用这个余弦图来代替它。
    在这里插入图片描述
  • 同时表示正弦和余弦曲线。要做的就是,输入:plot(t, y1),得到正弦函数,使用函数 hold on,hold on函数的功能是将新的图像绘制在旧的之上。以不同的颜色绘制余弦函数,所以在这里输入带引号的 r 绘制余弦函数,表示所使用的颜色:plot(t,y2,’r’),再加上命令 xlabel(‘time’), 来标记 X 轴即水平轴,输入 ylabel(‘value’),来标记垂直轴的值。还可以标记两条函数曲线,用这个命令 legend(‘sin’,‘cos’) 将这个图例放在右上方,表示这两条曲线表示的内容。最后输入 title(‘myplot’),在图像的顶部显示这幅图的标题。
    在这里插入图片描述
  • 保存这幅图像可以输入 cd C:\Users\Administrator\Desktop; print -dpng ‘myPlot.png’,png 是一个图像文件格式。Matlab 也可以保存为很多其他的格式,可以输入 help plot。最后如果想删掉这个图像,用命令 close 会让这个图像关掉。
    在这里插入图片描述
    *输入 figure(1); plot(t, y1);将显示第一张图,绘制了t、y1变量 。输入 figure(2); plot(t, y2); 将显示第二张图,绘制了变量 t、y2。
    在这里插入图片描述
    在这里插入图片描述
  • subplot命令,使用 subplot(1,2,1),它将图像分为一个 1*2 的格子,也就是前两个参数是意义,然后它使用第一个格子,也就是最后一个参数 1 的意思。现在使用第一个格子,如果输入 plot(t,y1),现在这个图显示在第一个格子。接着输入 subplot(1,2,2),意味着就要使用第二个格子,输入 plot(t,y2);现在 y2 显示在右边,也就是第二个格子。
    在这里插入图片描述
  • 一个命令,可以改变轴的刻度,比如改成 [0.5 1 -1 1],输入命令:axis([0.5 1 -1 1]) 也就是设置了右边图的 x 轴和 y 轴的范围。具体而言,它将右图中的横轴的范围调整至 0.5 到 1,竖轴的范围为 -1 到 1。
    在这里插入图片描述
  • clf(清除一幅图像)。
  • 设置A等于一个 5×5 的 magic 方阵:用一个巧妙的方法来可视化矩阵,也就是 imagesc(A) 命令,它将会绘制一个 55 的矩阵,一个 55 的彩色格图,不同的颜色对应 A 矩阵中的不同值。
    在这里插入图片描述
  • 使用函数 colorbar,用一个更复杂的命令 imagesc(A),colorbar,colormap gray。这实际上是在同一时间运行三个命令:运行 imagesc,然后运行 colorbar,然后运行 colormap gray。它生成了一个颜色图像,一个灰度分布图,并在右边也加入一个颜色条。所以这个颜色条显示不同深浅的颜色所对应的值。
    在这里插入图片描述
  • 逗号连接的命令或函数调用:如果我键入 a = 1,b = 2,c = 3 然后按 Enter 键,其实这是将这三个命令同时执行,或者是将三个命令一个接一个执行,它将输出所有这三个结果。
    在这里插入图片描述

控制语句:for,while,if 语句

for 控制语句

  • 我要将 v 值设为一个 10 行 1 列的零向量。一个 “for" 循环,让 i 等于 1 到 10,写出来就是 i = 1:10。设 v(i) 的值等于 2 的 i 次方,循环最后写上 “end”。
    在这里插入图片描述
    在这里插入图片描述
  • 还可以通过设置 indices (索引) 等于 1 一直到 10,来做到这一点。
    在这里插入图片描述
    在这里插入图片描述

while 控制语句

  • 让 i 取值从 1 开始,当 i 小于 5时,就让 v(i) 等于 100,i 递增 1,直到 i 大于 5 停止。这就是一个while循环的句法结构。
    在这里插入图片描述
    在这里插入图片描述
  • 使用 if 语句和 break 语句。让 i 等于 1 然后开始下面的增量循环,while语句重复设置 v(i) 等于 999,不断让 i 增加,然后当 i 达到6,做一个中止循环的命令,尽管有 while 循环,语句也就此中止。所以最后的结果是取出向量 v 的前 5 个元素,并且把它们设置为 999。
    在这里插入图片描述
    在这里插入图片描述
    • 这就是 if 语句和 while 语句的句法结构。并且要注意要有 end,上面的例子里第一个 end 结束的是 if 语句,第二个 end 结束的是 while 语句。

if 控制语句

在这里插入图片描述

  • 键入 exit 命令然后回车就会退出 Matlab,或者命令 quit 也可以。

函数 (functions)

在 Matlab 里定义一个文件名为 “squarethisnumber.m” 的文件。定义函数如下:这个函数有一个参数,就是参数 x,还有定义的函数体,也就是 y 等于 x 的平方,该函数返回一个值被存放于变量 y 里。
在这里插入图片描述

  • 有一种高级的功能,使用 addpath 命令添加路径,添加路径 “C:\Users\Administrator\Desktop” 将该目录添加到 Matlab 的搜索路径,这样即使跑到其他路径底下,Matlab 依然知道会在 Users\Administrator\Desktop 目录下寻找函数。这样,即使现在在不同的目录下,它仍然知道在哪里可以找到 “squarethisnumber” 这个函数。
    在这里插入图片描述
  • Matlab 的语法结构就不一样,可以返回多个值。定义一个函数叫:“SquareAndCubeThisNumber(x)” (的平方以及的立方)。函数返回值有两个:y1 和 y2。
    在这里插入图片描述
    输入 [a,b] = SquareAndCubeThisNumber(5),然后,a 就等于 25, b 就等于 5 的立方 125。
    在这里插入图片描述
  • 更复杂一点的函数的例子。比方说,有一个数据集,像这样,数据点为[1,1],[2,2],[3,3],定义一个 Matlab 函数来计算代价函数 J ( θ ) J(\theta) J(θ),就是计算不同 θ \theta θ 值所对应的代价函数值 J。
    在这里插入图片描述
    • 把数据放到 Matlab 里,把矩阵设置为 X = [1 1; 1 2; 1 3];y 也为 [1;2;3];thata 为 [0;1]。
      在这里插入图片描述
      在这里插入图片描述
    • 当我在 Matlab 里运行时,输入 J = costFunctionJ (X, y, theta),它就计算出 J 等于 0,这是因为如果数据集 x 为 [1;2;3],然后设置 θ 0 \theta_0 θ0 等于0, θ 1 \theta_1 θ1 等于 1,得到恰好 45 度的斜线,这条线是可以完美拟合我的数据集的。
      在这里插入图片描述
    • 而相反地,如果我设置 θ \theta θ 等于 [0;0],那么这个假设预测所有的值都为0,也就是 θ 0 \theta_0 θ0 等于 0, θ 1 \theta_1 θ1也等于 0,然后计算的代价函数,结果是 2.333。实际上,它就等于 1 的平方,也就是第一个样本的平方误差,加上 2 的平方,加上 3 的平方,然后除以 2m,也就是训练样本数的两倍,这就是 2.33。
      在这里插入图片描述
    • 因此这也反过来验证了我们这里的函数,计算出了正确的代价函数。

向量化

  • 无论你是用 Octave,还是别的语言,比如 MATLAB 或者你正在用 Python、NumPy 或 Java C、C++,所有这些语言都具有各种线性代数库,这些库文件都是内置的,容易阅读和获取,他们通常写得很好,已经经过高度优化,通常是数值计算方面的博士或者专业人士开发的。
  • 有很多例子可以说明,如果使用了合适的向量化方法,代码会简单得多,也有效的多。

计算常见的线性回归假设函数的两种不同实现方式

这是一个常见的线性回归假设函数: h θ ( x ) = ∑ j = 0 n θ j x j h_\theta(x) =\sum_{j=0}^{n}\theta_j x_j hθ(x)=j=0nθjxj
⑴ 如果想要计算 h θ ( x ) h_\theta(x) hθ(x),注意到右边是求和,那么你可以自己计算 j = 0 到 j = n 的和。
⑵ 但换另一种方式来想想,把 h θ ( x ) h_\theta(x) hθ(x) 看作 θ T x \theta^Tx θTx,那么就可以写成两个向量的内积,其中 θ \theta θ 就是 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2,如果你有两个特征量,如果 n = 2,并且如果你把 x x x 看作 x 0 x_0 x0 x 1 x_1 x1 x 2 x_2 x2
这两种思考角度,会给你两种不同的实现方式。
在这里插入图片描述

  • 比如说,这是未向量化的代码实现方式:
    在这里插入图片描述
    • 首先要初始化变量 prediction 的值为 0.0,而这个变量 prediction 的最终结果就是 h θ ( x ) h_\theta(x) hθ(x),然后我要用一个 for 循环,j 取值 1 到 n+1,变量 prediction 每次就通过自身加上 θ j \theta_j θj 乘以 x j x_j xj 更新值,这个就是算法的代码实现。
    • 注意:这里的向量我用的下标是0,所以我有 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2,但因为 Matlab 的下标从 1 开始,在 Matlab 中,我们可能会用 theta(1) 来表示。所以,for 循环,j 取值从 1 直到 n+1,而不是从 0 到 n 。
  • 作为比较,接下来是向量化的代码实现:
    在这里插入图片描述
    • 你把 x 和 θ \theta θ 看做向量,而你只需要令变量 prediction 等于 theta 转置乘以 x,就可以计算。与上面用的 for 循环的代码,你只需要一行代码。这样向量化的实现更简单,它运行起来也将更加高效。

对线性回归算法梯度下降的更新规则进行向量化

θ j : = θ j − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) )     ( f o r   a l l   j ) \theta_j := \theta_j - \alpha\frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)}_j)}\ \ \ (for \ all \ j) θj:=θjαm1i=1m((hθ(x(i))y(i))xj(i))   (for all j)


θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x 0 ( i ) ) \theta_0 := \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)}_0)} θ0:=θ0αm1i=1m((hθ(x(i))y(i))x0(i))
θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x 1 ( i ) ) \theta_1:= \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)}_1)} θ1:=θ1αm1i=1m((hθ(x(i))y(i))x1(i))
θ 2 : = θ 2 − α 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x 2 ( i ) ) \theta_2:= \theta_2 - \alpha\frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)}_2)} θ2:=θ2αm1i=1m((hθ(x(i))y(i))x2(i))
                                                 ( n = 2 ) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (n = 2)                                                 (n=2)

  • 打算把 θ 看做一个向量,然后用 θ - α 乘以某个别的向量 δ 来更新 θ 。这里的 δ 等于:
    δ = 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) ) \delta = \frac{1}{m}\sum_{i=1}^{m}{((h_\theta(x^{(i)}) -y^{(i)})\cdot x^{(i)}_j)} δ=m1i=1m((hθ(x(i))y(i))xj(i))
  • 要把 θ 看作一个向量,有一个 n + 1 维向量, α 是一个实数,δ 在这里是一个向量。
    在这里插入图片描述
  • 所以这个减法运算是一个向量减法,因为 α 乘以 δ 是一个向量,所以就是 θ - αδ 得到的向量。
  • 那么什么是向量 δ 呢 ?
    在这里插入图片描述
    • X ( i ) X^{(i)} X(i) 是一个向量, 求和公式相当于只是一个实数乘以向量 X ( 0 ) X^{(0)} X(0) ,加上另一个实数乘以向量 X ( 1 ) X^{(1)} X(1),再加上另一个实数乘以向量 X ( 2 ) X^{(2)} X(2) …加上其他向量,这就是为什么最后这整个东西 δ 就是一个向量。
      在这里插入图片描述
      在这里插入图片描述
    • 这就是为什么,根据 θ - αδ,更新 θ 时,我们能够准确的同步更新,完全符合最上方更新规则,向量化地实现线性回归的原因。
  • 总结:如果你在实现线性回归的时候,使用一个或两个以上的特征量,有时我们使用几十或几百个特征量来计算线性回归,当你使用向量化地实现线性回归,通常运行速度会比使用 for 循环(自己写代码更新 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2)快的多。因此使用向量化实现方式,是能够得到一个高效得多的线性回归算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥玥&编程学习记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值