吳恩達機器學習(四) 使用Octave

1、基本操做

本課程有編程做業,編程做業須要使用Matlab或Octave,本文章使用Octave。下載地址:http://www.gnu.org/software/octave/#install。安裝完成後,打開GNU Octave (GUI)開始寫代碼。編程

一、基本運算

 值得注意的是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('>> ') % 修改提示符

二、變量、打印

注意:當Octave變量聲明語句後面不帶分號(「;」)時,Octave會打印該變量,故不須要打印的務必加分號。spa

disp方法也能夠用於打印,該方法支持較複雜打印,能夠組合字符串和數字。如 disp(sprintf('2 decimals: %0.2f', a));。3d

% 變量
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位數字。orm

三、矩陣、向量

通常用大寫字母表示矩陣,例如A、B、X等;用小寫字母表示向量,例如v、w。blog

% 矩陣和向量
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]向量。圖片

2、移動數據

一、獲取大小、長度

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)取得列數。ip

length函數會返回長度最長的長度,如length(A)返回3,一般對向量使用length函數。ci

二、一些經常使用命令

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文件中

一些命令的運行結果以下:字符串

三、訪問、修改矩陣和向量

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)矩陣

使用冒號能夠很方便的取出某一行或某一列的數據。訪問和修改數據只須要使用下標便可。值得注意的是,在修改矩陣某一列或添加一列的時候賦值的向量必定要和矩陣的行數相同,不然報錯。同理,修改一行時須要和列數相同。

3、矩陣、向量運算

一、基本運算

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函數對每一個元素分別就行求對數、求指數、求絕對值。

二、查找、求和

使用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函數則是返回符合條件的全部元素的下標。

 

4、繪製圖像

繪製圖像使用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; % 繪製爲灰白色

 

5、控制語句

和其餘語言基本同樣,不同的是沒有花括號包住語句,取而代之的是縮進和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) % 調用函數

打印輸出

 

6、向量化

若咱們要求解θ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。極大方便了咱們的運算。稱之爲向量化

相關文章
相關標籤/搜索