shivaseの日記

SIer→Web→教師→SIer→ベンチャー(SRE)と異色な人生を歩んでいるエンジニアの日記

Machine Learning Week 2 - Octave Tutorial - 基本操作

Lesson2からOctaveを使った課題提出がでてきます。このOctave Tutorialをやることで、これまでの数式を実際にソースコードに落とす方法がわかり、数式の意味が一気に理解できるようになりました。

やっぱりソースコード弄りながら実際にグラフを表示するってのは一気に理解度があがりますね。

という事で課題をやる上で覚える必要のあるOctaveの操作メモ

代入系

代入の基本

a=3とかの代入式は他の言語と同じなので問題無いのですが、入れる変数が指定されてない場合に、自動的にans変数に入るのは驚いた.

# aという変数に3という値を入れる
❯❯ a = 3
a =  3
# 代入が無くそのまま値を書くと、ansという変数に格納される
❯❯ 5
ans =  5

2次元配列

# 2次元配列の宣言
❯❯ a = [1 2; 3 4; 5 6]
# 配列の大きさはsizeでわかる(この場合2次元なので2つ値がかえってくる
❯❯ size(A)
# 行数だけ数える
❯❯ size(A,1)
# :でその行or列全部指定できる
❯❯ A(2,:)
# 最初の要素の1 and 3行目の、データ全部という指定もできる
❯❯ A([1 3], :)
# 連結もできる
❯❯ A(:)

❯❯ A = [1 2; 3 4; 5 6];
❯❯ B = [11 12; 13 14; 15 16];
# 横に連結 3 * 4になる
❯❯ C = [A B] 
# 縦に連結 6 * 2になる
❯❯ C = [A; B] 
# 行列の掛け算
❯❯ A * B
# 要素毎に掛け合わせる
# .(ピリオド)は要素単位で操作するときに使う
❯❯ A .* B
# Aの要素をそれぞれ2乗する
❯❯ A .^ 2

❯❯ v = [1;2;3]
# 逆行列
❯❯ 1 ./ v
# 転置行列
❯❯ v'

連続値代入

繰り返しにこの書き方ができるのは楽で良いね。

# vに1から6を入れる
❯❯ v = 1:6
# vに0.1きざみで1から2まで入れる
❯❯ v = 1:0.1:2
# 2次元配列の0or1初期化用にzerosとonesが用意されてる
❯❯ zeros(2,3)
❯❯ ones(2,3)
#もちろんこんな感じで全部の値に2をかけることも
❯❯ c = 2 * ones(2,3)

単位行列

数III+Cをやってない文系人間なので、単位行列という用語で詰まった(´ω`) 線形代数を学ぶプログラマは以下の本が良く紹介されるのですが

プログラミングのための線形代数

プログラミングのための線形代数

とりあえず近場の図書館で見つけた下の本で、行列の仕組みについては十分理解でき、単位行列の意味も理解できた

線形代数がわかる (ファーストブック)

線形代数がわかる (ファーストブック)

単位行列 | JSciencer

# eyeコマンドで単位行列は生成できる
❯❯ eye(5)
ans =

Diagonal Matrix

   1   0   0   0   0
   0   1   0   0   0
   0   0   1   0   0
   0   0   0   1   0
   0   0   0   0   1

変数管理

# 定義された変数は`who`と`whos`で見れる。違いは出力の量
❯❯ who
Variables in the current scope:

a    ans  c    w

❯❯ whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           3x2                         48  double
        ans         5x5                         40  double
        c           2x3                         48  double
        w           1x3                         24  double

Total is 40 elements using 160 bytes

# 変数はclearで消せる
❯❯ clear a

入出力系

画面出力

変数の数値だけを出力したいときはdisp。書式指定したい時はsprintf(使い方はC言語と同じ模様)

❯❯ a = 3.1415;
❯❯ disp(a)
 3.1415
❯❯ disp(sprintf('2 decimals: %0.2f', a))
2 decimals: 3.14

出力桁数制御

# defaultは後述するformat shortの状態
❯❯ a = pi
a =  3.1416

# 桁数を増やす
❯❯ format long
❯❯ a = pi
a =  3.14159265358979

# 桁数short
❯❯ format short
❯❯ a = pi
a =  3.1416

# 桁数は指定もできる模様
❯❯ output_precision(8)
❯❯ a = pi
a =  3.1415927

画面出力抑止

出力を抑止したい場合は「;」(セミコロン)を末尾に入れる.結果だけ欲しい時用

❯❯ a = 3;
❯❯

ファイル入出力

読み込みはloadで、吐き出しはsave。octaveを起動した時のディレクトリのファイルを基本読み込む

# octaveを起動するフォルダのファイル構成
 ❯ ls
ex1          ex1.pdf      featureX.dat hello.mat    priceY.dat
# octave起動
 ❯ octave

# フォルダ見るのはLinuxと同じでls
❯❯ ls
ex1             ex1.pdf         featureX.dat    hello.mat       priceY.dat
# featureX.datを読み込み
❯❯ load featureX.dat
# 読み込んだファイルはファイル名の変数で保存される
❯❯ featureX
featureX =

   2104      3
(以下略)

# 保存はsaveで。テキストで保存したい場合はasciiを指定する必要有り
❯❯ save hello.mat v;
❯❯ save hello.txt v --ascii

# 現在どこのフォルダに居るのか、ディレクトリの移動等はLinuxと同じコマンドでできる
❯❯ cd hogehoge
❯❯ pwd

その他

細かい関数

❯❯ a = [ 1 15 2 0.5 ]
# Maxを取る
❯❯ val = max(a)
# 条件にあったデータだけ取得する
❯❯ [r, c] = find(A >= 7)
# 合計
❯❯ sum(a)
# 乗算(product)
❯❯ prod(a)

ランダム値の代入

❯❯ w = rand(1,3)
w =

   0.25161   0.52246   0.58472

魔法陣行列

縦・横・ななめの合計がそれぞれ同じな特殊な行列である魔法陣行列はmagicで作れる

❯❯ A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

後はグラフ処理系だけど、長くなったので次で

【スポンサーリンク】