一、基本操作

本课程有编程作业,编程作业需要使用Matlab或Octave,本文章使用Octave。下载地址:http://www.gnu.org/software/octave/#install。安装完成后,打开GNU Octave (GUI)开始写代码。

1、基本运算

值得注意的是Octave使用“^”符号表示次幂,而不是向其他语言一样表示异或,而异或运算使用xor()函数。并且不等于使用“~=”而不是“!=”。

% 基本运算
5 + 6
3 - 2
5 * 8
1 / 2 % 0.5
2 ^ 6 % 2的6次方 1 == 2 % false,返回0
1 ~= 2 % 1不等于2,true,返回1 1 && 0 % AND
1 || 0 % OR
xor(1, 0) % 异或 PS1('>> ') % 修改提示符

2、变量、打印

注意:当Octave变量声明语句后面不带分号(“;”)时,Octave会打印该变量,故不需要打印的务必加分号。

disp方法也可以用于打印,该方法支持较复杂打印,可以组合字符串和数字。如 disp(sprintf('2 decimals: %0.2f', a));。

% 变量
a = 3; % 数字变量,double。加分号不打印出来
b = 'hi'; % 字符串变量
c = (3 >= 1); % 返回1
a = pi; % 打印
disp(a);
disp(sprintf('2 decimals: %0.2f', a));% C风格
disp(sprintf('6 decimals: %0.6f', a));
% 显示长变量
format long % 打印小数点后15位
a
% 显示短变量
format short % 打印小数点后四位
a

format long打印小数点后15位数字(注意是总共打印15位,而不是最后15位的意思),format short打印小数点后4位数字。

3、矩阵、向量

一般用大写字母表示矩阵,例如A、B、X等;用小写字母表示向量,例如v、w。

% 矩阵和向量
A = [1 2; 3 4; 5 6] % 3×2矩阵
v = [1 2 3] % 1×3向量
v = [1; 2; 3] % 3×1向量 v = 1: 0.1: 2 % 1到2,步长为0.1
v = 1: 6 ones(2, 3) % 生成一个2×3且全部元素为1的矩阵
C = 2 * ones(2, 3) % 矩阵和数 数乘运算 w = zeros(1, 3) % 1×3向量且全部元素为0
w = rand(1, 3) % 1×3的随机矩阵,数据大小在0-1之间
rand(3, 3) % 3×3随机矩阵 w = randn(1, 3) % 高斯随机变量?
w = -6 + sqrt(10) * (randn(1, 10000));
% 绘制直方图
%hist(w);
hist(w, 50) eye(5) % 生成5×5的单位矩阵(对角线元素为1,其余全为0)

注意到声明矩阵的每一行时,用空格分隔每个元素,其实使用逗号也是可以的。语句v = 1:0.1:2表明按照步长0.1生成一个行向量,元素为[1 1.1 1.2 ....... 2]。语句v = 1:6的步长为1,不指定步长默认为1,生成[1 2 3 4 5 6]向量。

二、移动数据

1、获取大小、长度

A = [1 2; 3 4; 5 6]
sz = size(A) % 返回[3 2],分别表示行数和列数 size(A, 1) % 返回行数
size(A, 2) % 返回列数
% 返回长度4,length函数返回最大维度的大小
% 若矩阵为10×1,则长度为10。通常对向量使用length函数
v = [1 2 3 4]
length(v)

使用size函数可求得矩阵的行数与列数,使用size(A,1)取得行数,使用size(A, 2)取得列数。

length函数会返回长度最长的长度,如length(A)返回3,通常对向量使用length函数。

2、一些常用命令

pwd % 查看当前所在目录
% cd 'path' % 改变当前目录
ls % 列出当前所有文件
clc % 清空控制台输出 who % 查看工作空间所有变量
whos % 查看工作空间所有变量的细节 % clear data % 清空(删除)data变量
% clear % 清空所有变量 load hello.txt % 加载数据并赋值,注意:这样加载不能赋值到变量中
data = load('hello.txt') % 也可以这样加载 save hello.mat v % 将变量v存入hello.mat文件中

一些命令的运行结果如下:

3、访问、修改矩阵和向量

A(3, 2) % 取第3行第2列的数据
A(3, 2) = 10 % 将第3行第2列赋值为10
A(2, :) % 取出第2行数据, :表示某一行或某一列的所有数据
A(:, 2) % 取出第2列数据
A([1 3], :) % 取出第1行和第3行所有数据
A([1;3], :) % 一样,取出第1行和第3行所有数据 A(:, 2) = [10; 11; 12] % 修改第2列
A = [A, [100; 101; 102]] % 附加1列作为最后一列
A(:) % 将A所有元素按列形成一个列向量 A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [A B] % A和B按列连接形成C(3×4)矩阵
C = [A; B] % A和B按行连接形成C(6×2)矩阵

使用冒号可以很方便的取出某一行或某一列的数据。访问和修改数据只需要使用下标即可。值得注意的是,在修改矩阵某一列或添加一列的时候赋值的向量一定要和矩阵的行数相同,否则报错。同理,修改一行时需要和列数相同。

三、矩阵、向量运算

1、基本运算

A = [1, 2; 3, 4; 5, 6] % 3x2矩阵
B = [11, 12; 13, 14; 15, 16] % 3x2矩阵
C = [1, 1; 2, 2] % 2x2矩阵 A * C % 矩阵乘法
A .* B % 矩阵对应元素相乘
A .^ 2 % 矩阵每个元素都做平方运算 A' % A的转置
v = [1; 2; 3]
1 ./ v % 向量每个元素取倒数 log(v) % 每个元素取对数
exp(v) % 每个元素进行指数运算
abs(v) % 每个元素取绝对值

矩阵乘法需要左矩阵的列数与右矩阵的行数相同,例如A矩阵为3x2,C矩阵为2x2,他们相乘后得到3x2矩阵。

点乘运算为“.*”,两个矩阵点乘需要为同型矩阵,同型矩阵就是行数和列数都一样的矩阵。同理还有“.+”、“.-”、“./”等运算,当两边都是矩阵时需要同型。

若点乘的时数字,如A .^ 2,这个运算就是矩阵中的每个元素都做平方运算。同理A.-2就是每个元素减2。

log函数、exp函数、abs函数对每个元素分别就行求对数、求指数、求绝对值。

2、查找、求和

使用max函数查找最大值,使用find函数查找满足条件的元素下标。

a = [1, 15, 2, 0.5]
[val, ind] = max(a) % 返回最大值以及最大值的下标 a < 3 % 返回所有值的比较结果,小于则返回1, 大于则返回0
find(a < 3) % 仅返回那些小于3的值的下标 A = magic(3) % 返回魔术矩阵,该矩阵每行、每列、对角线、副对角线之和均相等
[rows, cols] = find(A >= 7) % 返回行下标和列下标 sum(a) % 求和
prod(a) % 所有元素相乘
floor(a) % 向下取整
ceil(a) % 向上取整
round(a) % 四舍五入 max(rand(3), rand(3)) % 对应元素对比,较大者存入新矩阵
max(A, [], 1) % 找到每一列的最大值组成向量
max(A, [], 2) % 找到每一行的最大值组成向量
max(A) % 等价于max(A, [], 1) max(max(A)) % 找到矩阵最大值,等价于max(A(:)) A = magic(9)
sum(A, 1) % 求出每一列之和
sum(A, 2) % 求出每一行之和
sum(A) % 等价于sum(A, 1) A .* eye(9) % 取对角线元素
sum(sum(A .* eye(9))) % 求对角线元素之和 flipud(eye(9)) %翻转形成副对角
sum(sum(A .* flipud(eye(9)))) % 副对角元素求和 A = magic(3)
pinv(A) % 求逆矩阵

a<3将a向量中每个元素与3比较,小于的返回1,大于的返回0,这样每个元素的真假值组成一个向量。而find函数则是返回符合条件的所有元素的下标。

四、绘制图像

绘制图像使用plot函数,plot函数绘制的是曲线图。绘制函数主要是使用向量(行向量或列向量均可)给出x轴和y轴的一系列点,每个点(x,y)绘制在二维坐标系上,再将这些点连线。

t = [0: 0.01: 0.98];% x轴

y1 = sin(2 * pi * 4 * t); % sin函数,函数值,y轴
plot(t, y1); y2 = cos(2 * pi * 4 * t); % cos函数
plot(t, y2); % 绘制后sin函数会被cos替代

上图的函数一起绘制的话sin函数会被cos函数覆盖。

要使得两个函数绘制在同一个窗口中,需要使用hold on命令。此外使用xlabel、ylabel、legend、title分别制动x轴标签、y轴标签、图例和标题。

plot(t, y1);
hold on; % 在同一个坐标系上绘制
plot(t, y2, 'r'); % 绘制为红色
xlabel('time') % x轴标签
ylabel('value') % y轴标签
legend('sin', 'cos') % 图例
title('my plot') print -dpng 'myPlot.png' % 保存为图片文件
close; % 关闭图像

还可以使用figure命令打开多个窗口,用数字对窗口编号。

% 打开两个窗口
figure(1); plot(t, y1);
figure(2); plot(t, y2);

还可以使用subplot函数将窗口分为多个格子,指定在某一格子绘图。用axis指定x轴的范围和y轴的范围。

subplot(1, 2, 1) % 将画板分为1×2的格子,并使用第1个格子绘制
plot(t, y1);
subplot(1, 2, 2) % 使用第2个格子
plot(t, y2, 'r') axis([0.5 1 -1 1]) % 前两个是x的范围,后两个是y的范围 clf; % 清除所有绘制图像

还可以对矩阵绘制,每一格表示一个数值,元素数值越大越接近黄色。对于绘制灰色图像,数值越大越接近白色。这可以帮助我们直观了解矩阵内元素的大小关系。

A = magic(5);
imagesc(A), colorbar; % 可视化矩阵,绘制为彩色
imagesc(A), colorbar, colormap gray; % 绘制为灰白色

五、控制语句

和其他语言基本一样,不一样的是没有花括号包住语句,取而代之的是缩进和end。

v = zeros(10, 1);
% for
for i = 1 : 10,
v(i) = 2 ^ i;
end
v % 打印,下面的同理 indices = 1:10;
for i = indices,
disp(i);
end % while
i = 1;
while i <= 5,
v(i) = 100;
i = i + 1;
end
v % if break
i = 1;
while true,
v(i) = 999;
i = i + 1;
if i == 6,
break;
end
end
v % if、elseif、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;

函数的编写与其他语言差别较大,Octave函数可以返回多个返回值。多返回值用逗号隔开。y1和y2是返回值,Octave不使用return语句返回,而是在函数体内直接对返回变量赋值。

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

调用函数

[val1, val2] = squareThisNumber(10) % 调用函数

打印输出

六、向量化

若我们要求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x45x5。为向量化的实现可能是使用for循环实现。

但如果使用向量化将令θ = [θ0;  θ1;  θ2;  θ3;  θ4;  θ5](l列向量),令 x = [x0; x1; x2; x3; x4; x5](列向量)。

这样只需要用θTx就可求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +θ5x5。极大方便了我们的运算。称之为向量化

吴恩达机器学习(四) 使用Octave的更多相关文章

  1. ML:吴恩达 机器学习 课程笔记(Week1~2)

    吴恩达(Andrew Ng)机器学习课程:课程主页 由于博客编辑器有些不顺手,所有的课程笔记将全部以手写照片形式上传.有机会将在之后上传课程中各个ML算法实现的Octave版本. Linear Reg ...

  2. 吴恩达机器学习笔记(四) —— BP神经网络

    主要内容: 一.模型简介 二.一些变量所代表的含义 三.代价函数 四.Forward Propagation 五.Back Propagation 六.算法流程 待解决问题: 视频中通过指出:当特征变 ...

  3. 吴恩达机器学习-octave笔记

    隐藏前缀提示符:PS1('>>') 不显示打印内容:;结尾 字符串:a=’hi’ 屏幕输出:disp(sprint(‘2 decimals:%0.2f’,a)) 生成集合(矩阵):V=1: ...

  4. 吴恩达机器学习笔记39-误差分析与类偏斜的误差度量(Error Analysis and Error Metrics for Skewed Classes)

    如果你准备研究机器学习的东西,或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统,拥有多么复杂的变量:而是构建一个简单的算法,这样你可以很快地实现它. 构建一个学习算法的推荐方法为:1 ...

  5. 吴恩达机器学习笔记(六) —— 支持向量机SVM

    主要内容: 一.损失函数 二.决策边界 三.Kernel 四.使用SVM (有关SVM数学解释:机器学习笔记(八)震惊!支持向量机(SVM)居然是这种机) 一.损失函数 二.决策边界 对于: 当C非常 ...

  6. 吴恩达机器学习(二) 单变量线性回归(Linear Regression with one variable)

    一.模型表示 1.一些术语 如下图,房价预测.训练集给出了房屋面积和价格,下面介绍一些术语: x:输入变量或输入特征(input variable/features). y:输出变量或目标变量(out ...

  7. Coursera 吴恩达 机器学习 学习笔记

    Week 1 机器学习笔记(一)基本概念与单变量线性回归 Week 2   机器学习笔记(二)多元线性回归 机器学习作业(一)线性回归——Matlab实现 机器学习作业(一)线性回归——Python( ...

  8. Machine Learning|Andrew Ng|Coursera 吴恩达机器学习笔记

    Week1: Machine Learning: A computer program is said to learn from experience E with respect to some ...

  9. Coursera-AndrewNg(吴恩达)机器学习笔记——第三周

    一.逻辑回归问题(分类问题) 生活中存在着许多分类问题,如判断邮件是否为垃圾邮件:判断肿瘤是恶性还是良性等.机器学习中逻辑回归便是解决分类问题的一种方法.二分类:通常表示为yϵ{0,1},0:&quo ...

随机推荐

  1. Entity Framework Core 迁移命令

    Add-Migration init Update-Database init 修改model后,执行迁移的命令 更新数据库 每次更新都要{update}修改 Add-Migration {updat ...

  2. pdf转换

    namespace Utilities { public static class PDFHelper { /// <summary> /// Html转Pdf /// </summ ...

  3. [转] Siamese network 孪生神经网络--一个简单神奇的结构

    转自: 作者:fighting41love 链接:https://www.jianshu.com/p/92d7f6eaacf5 1.名字的由来 Siamese和Chinese有点像.Siam是古时候泰 ...

  4. 在vue项目中添加一个html页面,开启本地服务器

    在vue项目里新增一个不需要登录的页面,那么我只能新增一个html页面了,不经过路由,直接在浏览器输入路径打开,那么就需要用到本地服务器, 1.vue里面的html页面最好放过在public文件夹里面 ...

  5. GDB简单调试

    最近在开始刷LeetCode,也开始在Linux上写代码,直接gcc编译,在调试的时候,需要用到gdb调试,所以在这里会不定期更新我学习到的gdb调试. 先编译成可执行文件 首先我们使用g++或者gc ...

  6. JIRA7.13版本创建项目:问题类型管理(一)

    1.1 创建项目 一个项目是对一系列相关问题的综合管理.在Jira 中,可以通过以下方式创建项目.首先,需要具有项目创建权限的人登录后台管理界面,然后选择项目,通过创建项目按钮进入到项目创建的界面. ...

  7. phpfor函数和foreach函数

    PHP for 循环 PHP While 循环 PHP 函数 PHP for 循环执行代码块指定的次数. PHP for 循环 如果您已经提前确定脚本运行的次数,可以使用 for 循环. 语法 for ...

  8. [CSP-S模拟测试]:陶陶摘苹果(线段树维护单调栈)

    题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个 ...

  9. 并发编程--Concurrent-工具类介绍

    并发编程--Concurrent-工具类介绍 并发编程--Concurrent-工具类介绍 CountDownLatch CylicBarrier Semaphore Condition 对象监视器下 ...

  10. set集合 ,深浅拷贝

    一 之前内容的补充 1.join() 将列表转换成字符串 2.split()将字符串转换成列表 3列表和字典在进行For循环时是不可以删除的(准确的说是删除的不彻底)  删除操作需要先创建一个新的空列 ...