机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(五)

Octave Tutorial

Basic Operations 基本操作

基本操作

  1. 基本运算:+、-、*、/、^(指数)
  2. 逻辑运算:==、~=、&&、||、xor(a, b),0为False、1为True
  3. 注释:%注释内容
  4. 等待命令样式可使用PS1命令更改:PS1('>>')

变量

  1. 赋值:变量名 = 内容(数字、字符串、布尔值…)
    在赋值语句后加上;语句执行完后不会输出结果。

  2. 查看变量:输入变量名或者使用语句disp(变量名)

  3. format的用法:

    format long:输出字符串的默认的位数。

    format short: 输出少量小数点后位数。

  4. 格式化输出:用类似C语言风格的格式化字符串来控制打印结果。disp(sprintf('%.6f', tem))

向量与矩阵

直接创建

A = [1 2; 3 4; 5 6] %三行两列
B = [1 2;
3 4;
5 6]  %三行两列
V1 = [1 2 3] %一行三列
V2 = [1; 2; 3] %三行一列

使用增量

V3 = 1:0.1:2 %一个从0开始,增量为0.1,到2为止的行向量
V4 = 1:6 %不写增量,默认为1

使用内置函数

ones(n, m) %生成一个元素全为1的n行m列的矩阵
zeros(n, m) %生成一个元素全为0的n行m列的矩阵
eye(n) %生成一个n阶单位矩阵
rand(n, m) %生成一个元素符合高斯分布的n行m列矩阵

使用直方图演示高斯分布。

W = rand(1, 10000)
hist(W)
hist(W, 50)

查看帮助

使用方法:help 方法名

help eye
help help

退出命令

quitexit

Moving Data Around

如果你有一个机器学习问题,你怎样把数据加载到Octave中?怎样把数据存入一个矩阵?如何对矩阵进行相乘?如何保存计算结果?如何移动这些数据并用数据进行操作?

矩阵大小

size():返回矩阵的行数和列数

A = [1 2; 3 4; 5 6]
sz = size(A) %3 2
size(sz) %1 2

length():返回矩阵最大维度的大小

V = [1 2 3 4]
length(V) %4
length(A) %3
length([1;2;3;4;5]) %5

Octave路径

pwd %查看当前所处路径
cd 'C:UsersaDesktop' %更改路径

载入数据

load featuresX.dat
load ('featuresX.dat') %效果同上
load priceY.dat

查看&删除

who %显示出当前Octave存储的变量
whos %更详细的查看Octave存储的变量的内容
clear featuresX %删除变量featuresX
clear all %删除所有变量

储存矩阵

v = priceY(1:10) %截取矩阵
save hello.mat v %按照二进制(或者说是更压缩的二进制)形式存储
save hello.txt v -ascii %存为一个文档

矩阵进阶操作

索引

A = [1 2;3 4; 5 6]
A(3, 2) %返回A_32
A(2,:) %返回第二行所有元素
A(:,2) %返回第二列所有元素
A([1, 3], :) %返回第一、三行所有元素
A(:) %将A中所有元素按照一列输出

修改值/增广

A(:,2) = [10; 11; 12] %更改第二列元素的值
A = [A, [101; 102; 102]] %在原有基础上增加一列

矩阵间操作

A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [A B] %形成A左B右的新矩阵
C = [A, B] %同上
C = [A, B] %形成A上B下的新矩阵

Computing on Data 对数据的运算

A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [1 1; 2 2]
V = [1; 2; 3]

矩阵相乘

A * C %矩阵乘法

矩阵中元素的运算

A .* B %A中的每个元素与B中对应元素相乘
A .^ 2 %A中的每个元素的平方
1 ./ A %A中每个元素的倒数

内置函数

log()
exp()
abs()
floor()
ceil()

加法

V + ones(length(V), 1)
V + 1 %功能同上

转置

A'
(A')' %A

求最大值

a = [1 15 2 0.5]
val = max(a) %返回最大值
[val, ind] = max(a) %返回最大值及最大值的位置
max(A) %返回每一列的最大值
D = magic(3)
max(D,[],1) %求D中每一列的最大值
max(D,[],2) %求D中每一行的最大值

比较

a < 3 %返回每个值与3比较的结果
find(a < 3) %返回<3的值的元素下标
[r, c] = find(A >= 4) %返回值>=4的元素的位置

求和求积

sum(a) %a中元素求和
prod(a) %a中元素求积(仅适用于一行或一列的矩阵)
sum(A) %A中每一列元素求和
D = magic(9)
sum(D,1) %D中每一列的和
sum(D,2) %D中每一行的和

%求对角线元素的和
E = eye(9) %构造一个9阶单位矩阵
D .* E %保留对角线元素
sum(ans(:)) %求对角线元素的和

%求副对角线元素的和
P = flipud(E) %9阶反对交矩阵
D .* P %保留副对角线元素
sum(ans(:)) %求副对角线元素的和

矩阵求逆

pinv(A) 对矩阵A求逆

magic()

magic(n)会生成一个所有行和列加起来都等于相同的值的n阶方阵。

rand()

rand(n)会生成一个n阶矩阵,矩阵中的每个元素大小都在0~1之间。

Plotting Data 绘制数据

绘制图线

t = [0 : 0.01 : 0.98]
y1 = sin(2 * pi * 4 * t)
plot(t, y1)
y2 = cos(2 * pi * 4 * t) ;
plot(t, y2)

同时绘制两个曲线

plot(t, y1)
hold on
plot(t, y2, 'r')

添加其他信息

xlabel('time')
ylabel('value')
legend('sin','cos') %曲线说明
title('my plot')

保存图像

print -dpng 'myPlot.png'

清除/关闭图像

clf %清除图像内容
close %关闭打开的图像

同时绘制两幅图

figure 1; plot(t, y1)
figure 2; plot(t, y2)

在一个绘画框内绘制两幅图

subplot(1, 2, 1)
plot(t, y1)
subplot(1, 2, 2)
plot(t, y2)
axis([0.5 1 -1 1]) %修改x轴和y轴的范围

矩阵可视化

imagesc(A) %生成的图像中不同颜色代表不同数值
imagesc(A), colorbar, colormap gray; %生成一个灰度分布图
imagesc(magic(15)), colorbar, colormap gray;

Control Statements 控制语句

for

V = zeros(10, 1) %初始化
for i = 1:10
  V(i) = 2 ^ i;
end;
disp(V) %V[i]成为了2的i次方
indices = 1:10
for i = indices %i:1->10
  disp(i)
end

while

i = 1
while i <= 5
  V(i) = 100;
  i += 1;
end

break

i = 1;
while true,
  V(i) = 999;
  i += 1;
  if i == 6,
    break;
  end;
end;

if else

V(1) = 2
if V(1) == 1.
  disp('The value is one');
elseif V(1) == 2,
  disp('The value is two');
else
  disp('The value is not one or two');
end;

函数

  1. 在对应路径下定义一个函数名.m的文件,文件内容是函数功能。如squareThisNumber.m,文件内容:

    function y = squareThisNumber(x)
    
    y = x^2;
    

    运行函数及结果:

    squareThisNumber(5)
    ans =  25
    
  2. 函数可有多个返回值

    squareAndCubeThisNumber.m文件内容:

    function [y1, y2] = squareAndCubeThisNumber(x)
    
    y1 = x^2;
    y2 = x^3;
    

    运行函数及结果:

    [a, b] = squareAndCubeThisNumber(3)
    a =  9
    b =  27
    

尝试编写代价函数

costFunctionJ.m文件内容:

function J = costFunctionJ(X, y, theta)

% X is the "design matrix" containing our training examples.
% y is the class labels

m = size(X, 1); %number of training examples
predictions = X * theta; %predictions of hypothesis on all m examples
sqrErrors = (predictions - y) .^ 2; % squared errors

J = 1 / (2 * m) * sum(sqrErrors);

找组样例试试:

X = [1 1; 1 2; 1 3];
y = [1; 2; 3]
theta = [0; 1];
j = costFunctionJ(X, y, theta)

另一组样例:

X = [1 1; 1 2; 1 3];
y = [1; 2; 3]
theta = [0; 0];
j = costFunctionJ(X, y, theta)

Vectorization 向量化

Vectorization example

(h_ heta(x) = sum_{j = 0}^{n} heta_jx_j)

Unvectorized implemention

prediction = 0.0
for j = 1 : n+1,
  prediction = prediction + theta(j) * x(j)
end;

上式 = ( heta^Tx)

Vectorized implementation

prediction = theta' * x

Gradient descent

梯度下降算法公式:

[ heta_j := heta_j - alphafrac{1}{m}sum_{i = 1}^m(h_ heta(x^{(i)}) - y^{(i)})x_j^{(i)} ]

n = 3时的情况:

[left{ egin{aligned} heta_0 := heta_0 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_0^{(i)} \ heta_1 := heta_1 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_1^{(i)} \ heta_2 := heta_2 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_2^{(i)} end{aligned} ight. ag1 ]

将上式向量化后的结果为:

[ heta := heta - alphadelta ag2 ]

上式中( heta、delta)都为向量,(alpha)是实数,其中

[delta = frac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})X^{(i)} ag3 ]

推导一下:

一、将公式(1)进行整体向量化操作:

[egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} := egin{pmatrix} heta_0 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_0^{(i)} \ heta_1 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_1^{(i)} \ heta_2 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_2^{(i)} end{pmatrix} ]

二、拆分、提取公因式:

[egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} := egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} - alpha frac{1}{m} egin{pmatrix} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_0^{(i)} \ sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_1^{(i)} \ sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_2^{(i)} end{pmatrix} ]

三、将后一个矩阵展开:

[ heta := heta - alpha frac{1}{m} egin{pmatrix} (h_ heta (x^{(1)}) - y^{(1)})x_0^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_0^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_0^{(m)} \ (h_ heta (x^{(1)}) - y^{(1)})x_1^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_1^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_1^{(m)} \ (h_ heta (x^{(1)}) - y^{(1)})x_2^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_2^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_2^{(m)} end{pmatrix} ]

四、展开后的矩阵拆分:

[ heta := heta - alpha frac{1}{m} left[ egin{pmatrix} (h_ heta (x^{(1)}) - y^{(1)})x_0^{(1)} \ (h_ heta (x^{(1)}) - y^{(1)})x_1^{(1)} \ (h_ heta (x^{(1)}) - y^{(1)})x_2^{(1)} end{pmatrix} + egin{pmatrix} (h_ heta (x^{(2)}) - y^{(2)})x_0^{(2)} \ (h_ heta (x^{(2)}) - y^{(2)})x_1^{(2)} \ (h_ heta (x^{(2)}) - y^{(2)})x_2^{(2)} end{pmatrix} + ldots + egin{pmatrix} (h_ heta (x^{(m)}) - y^{(m)})x_0^{(m)} \ (h_ heta (x^{(m)}) - y^{(m)})x_1^{(m)} \ (h_ heta (x^{(m)}) - y^{(m)})x_2^{(m)} end{pmatrix} ight] ]

五、提取公因式:

[ heta := heta - alpha frac{1}{m} left[ left( h_ heta (x^{(1)}) - y^{(1)} ight) egin{pmatrix} x_0^{(1)} \ x_1^{(1)} \ x_2^{(1)} end{pmatrix} + left( h_ heta (x^{(2)}) - y^{(2)} ight) egin{pmatrix} x_0^{(2)} \ x_1^{(2)} \ x_2^{(2)} end{pmatrix} + ldots + left( h_ heta (x^{(m)}) - y^{(m)} ight) egin{pmatrix} x_0^{(m)} \ x_1^{(m)} \ x_2^{(m)} end{pmatrix} ight] ]

六、将(x)写为向量形式:

[ heta := heta - alpha frac{1}{m} left[ left( h_ heta (x^{(1)}) - y^{(1)} ight) X^{(1)} + left( h_ heta (x^{(2)}) - y^{(2)} ight) X^{(2)} + ldots + left( h_ heta (x^{(m)}) - y^{(m)} ight) X^{(m)} ight] ]

七、写成求和形式:

[ heta := heta - alpha frac{1}{m} sum_{i=1}^m(h_ heta (x^{(i)}) - y^{(i)})X^i ]

推导完毕。

Review

编程作业

  1. warmUpExercise.m

    A = eye(5);
    
  2. plotData.m

    plot(x, y, 'rx', 'MarkerSize', 10);
    ylabel('Profit in $10,000s');
    xlabel('Population of Coty in 10,000s');
    
  3. computeCost.m

    predictions = X * theta;
    sqrErrors = (predictions - y) .^ 2;
    J = 1 / (2 * m) * sum(sqrErrors);
    
  4. gradientDescent.m

    delta = 1 / m * X' * (X * theta - y);
    theta = theta - alpha * delta;
    
原文地址:https://www.cnblogs.com/songjy11611/p/12195521.html