入門②の続きでまだまだ基本編、少し機械学習っぽくなってきましたかね?
Pythonのベクトル
ベクトル操作だなんて機械学習っぽさがでてきましたね。
NumPyライブラリ
Pythonでのベクトル操作はNumPy(ナンパイ)というライブラリを使用するらしいです。
ライブラリを使用するにはインポートを行います。
Pythonライブラリのインポート
import numpy as npy
パイソンスクリプトの行頭に書かれてるのをみかけますね。
「as」で別名を定義するようです。別名定義は私が知っているものではSQLみたいですね。
ベクトルの定義を行ってみます。
ベクトルの定義にはNumpyのarray関数を使用します。
#ベクトルの定義 a = npy.array([1,10])
ベクトルの計算
さて、ベクトルの定義ができたので、いわゆる数学のあのベクトルのように計算できるか試してみます。
どこまでなにができるのかは全く知りません。
【加減算】
・例
import numpy as npy #ベクトルの定義 a = npy.array([1,10]) b = npy.array([2,4]) addvec = a + b subvec = a - b print("ベクトルの和は" + str(addvec)) print("ベクトルの差は" + str(subvec))
・出力結果
ベクトルの和は[ 3 14] ベクトルの差は[-1 6]
すごい、ちゃんとベクトルの計算になってる!
【乗除算】
・例
import numpy as npy #ベクトルの定義 a = npy.array([1,10]) b = npy.array([2,4]) multivec = a * b divvec = a / b print("ベクトルの積は" + str(multivec)) print("ベクトルの商は" + str(divvec))
・出力結果
ベクトルの積は[ 2 40] ベクトルの商は[0.5 2.5]
積は内積??かとも思ったんですが、普通に成分同士が掛け算されるみたいですね。
内積をどう表現するかはここでは深入りせずに今後学んでいきます。
【スカラー倍】
ベクトルにベクトルではなく普通の数字をかけた場合、スカラー倍となり各成分が乗算されるはずです。
さてどうなるでしょうか。
・例
import numpy as npy #ベクトルの定義 a = npy.array([1,10]) vec = 2*a print("ベクトルのスカラー倍" + str(vec))
・出力結果
ベクトルのスカラー倍[ 2 20]
これは数学で習った通りの結果となりました。
ベクトル成分の操作
計算ではなく、成分に対して操作を行う場合基本的には配列型と同じような感じになるようです。
とりあえず、参照と書き換え。
・例
import numpy as npy #ベクトルの定義 a = npy.array([1,10]) b = npy.array([2,4]) addvec = a + b #一番目の成分を取り出す num = addvec[0] #成分を書き換える addvec[0] = 100 print("取り出した成分=" + str(num)) print("書き換え後の成分=" + str(addvec[0]))
・出力結果
取り出した成分=3 書き換え後の成分=100
この辺は普通のリスト感覚ですね。
おまけ
リストのrangeと同様に連続した整数で生成することもできるみたいですね。
・例
import numpy as npy # 0から生成 a = npy.arange(5) # 2から4まで生成 b = npy.arange(2,5) print("a=" + str(a)) print("b=" + str(b))
・出力結果
a=[0 1 2 3 4] b=[2 3 4]
始点と終点を指定するときは0から並べて区切りの数を基準にする考え方でよさそうですね。
[0,1,2,3,4,5]
⇒2つ目のカンマから5つ目のカンマまでなので「2 3 4」の列が生成される。
しかしどのようなときに使うのかまだ使用シーンが想定できませんね。
ベクトルのコピー
ベクトルの値をコピーするときには「copy()」関数を用います。
・例
import numpy as npy #ベクトルの定義 a = npy.array([1,10]) b = npy.array([2,4]) # 参照先をコピーする a2 = a # 値をコピーする ac = a.copy() print("コピー直後 a=" + str(a)) print("コピー直後 a2=" + str(a2)) print("コピー直後 ac=" + str(ac)) # 処理 a2[0] = 2 ac[0] = 3 print("処理後 a=" + str(a)) print("処理後 a2=" + str(a2)) print("処理後 ac=" + str(ac))
・出力結果
コピー直後 a=[ 1 10] コピー直後 a2=[ 1 10] コピー直後 ac=[ 1 10] 処理後 a=[ 2 10] 処理後 a2=[ 2 10] 処理後 ac=[ 3 10]
参照型ってやつですかね?何が起きてるかというと普通にコピーをしようとすると、参照先がコピーされるためコピー先の変数に変更を加えるとコピー元の変数の値も変更が加わるんですね。
Pythonの行列
ベクトルに続いて行列ですね。皆さんは高校数学で行列、やりましたかね?
私はやりましたがもうほぼ覚えてないのでちょっと復習中です。
行列の定義
行列はベクトルと同じくnumpyを使用して、以下のように定義します。
a = npy.array([[1,10],[2,5]])
・例
import numpy as npy # 行列の定義 a = npy.array([[1,10],[2,5]]) print("行列a=" + str(a))
・出力結果
行列a=[[ 1 10] [ 2 5]]
行列はこんな風に出力されるのですね。
行列の基本操作
・行列サイズの確認
行列のサイズは「shape」により得られます。
行列なので、縦と横のサイズがあり、それぞれで取得することもできます。
・例
import numpy as npy # 行列の定義 a = npy.array([[1,10],[2,5],[1,1]]) h, w = a.shape print("行列サイズ=" + str(a.shape)) print("行列の高さ=" + str(h) + "、行列の幅=" + str(w)) print("行列サイズのタイプ=" + str(type(a.shape)))
・出力結果
行列サイズ=(3, 2) 行列の高さ=3、行列の幅=2 行列サイズのタイプ=<class 'tuple'>
・行列の参照と書き換え
ベクトル操作とほぼ同様な感じで扱えそうです。
import numpy as npy # 行列の定義 a = npy.array([[1,10],[2,5],[1,1]]) # 行列の取得参照 b = a[0] c = a[1,1] # 行列の書き換え a[2,0] = 100 print(a) print(b) print(c)
・出力結果
[[ 1 10] [ 2 5] [100 1]] [ 1 10] 5
特定行列の生成
使うシーンはまだいまいちわかりませんが、特定の行列は生成用の関数が存在するようです。
【0成分の行列】
0成分の行列を生成する場合にはzeros関数を使用します。
・例
import numpy as npy # 行列の定義 zeros = npy.zeros((2,3)) ones = npy.ones(7) print(zeros) print(ones)
[[0. 0. 0.] [0. 0. 0.]] [1. 1. 1. 1. 1. 1. 1.]
【ランダム成分の行列】
ランダムな行列を生成するにはrandom.rand関数を使用します。
整数の行列はrandintを範囲を指定して使用することで生成できました。
・例
import numpy as npy # ランダム行列の定義 rands = npy.random.rand(3,3) print(rands) # ランダムな整数値の行列 print(npy.random.randint(1,10,(2,3))) print(npy.random.randint(1,10,(2,3)))
・出力結果
[[0.69891983 0.57141852 0.62646802] [0.69179131 0.46572066 0.87677665] [0.10003993 0.51280035 0.76016474]] [[8 2 9] [2 5 5]] [[7 5 9] [1 8 3]]
結構いろいろでてきましたが、機械学習においては肝になりそうな部分でもあるので一つ一つ着実に理解していきましょう。
数列の算術演算
ベクトルと同じようにまずは四則演算から始めます。
【行列の加減算】
・例
import numpy as npy # 行列の定義 a = npy.array([[1,2],[3,4],[5,6]]) b = npy.array([[2,2],[2,2],[2,2]]) # 行列の算術 add = a + b sub = a - b # 結果出力 print("数列の和は" + str(add)) print("数列の差は" + str(sub))
・出力結果
数列の和は[[3 4] [5 6] [7 8]] 数列の差は[[-1 0] [ 1 2] [ 3 4]]
ベクトルと同じような感じでまぁ予想通りの結果という感じですね。
【行列の乗算】
行列には除算の概念はなかったはずですので、特に探さずに割愛します。
乗算については普通にやるのではなく、関数を用いるようです。※ベクトルにも同じようなものがあったのかな?
行列の乗算には「dot関数」を使用します。
・例
import numpy as npy # 行列の定義 a = npy.array([[1,2],[3,4]]) b = npy.array([[1,2],[3,4]]) c = npy.array([2,5]) # 行列の算術 result1 = a.dot(b) result2 = a.dot(c) # 結果出力 print("2×2同士の積= " + str(result1)) print("2×2と2×1の積= " + str(result2))
・出力結果
2×2同士の積= [[ 7 10] [15 22]] 2×2と2×1の積= [12 26]
行列の乗算は以下の要領で計算しますので、いわゆる行列の乗算と同様になっていますね。
※すっごい汚い図で見てくれている方には申し訳ない
その他の算術関数
Numpyに用意されている算術関数の基本的な一例を紹介します。
普段のjavaでは全然この手のもの使わないけどこんなにいろいろ用意されてるんだなぁって
・例
import numpy as npy # 行列の定義 a = npy.array([[1,2],[5,9]]) b = npy.array([[1,2],[3,4]]) c = npy.array([2,5]) # 行列の算術 result1 = npy.sqrt(a) result2 = npy.exp(a) result3 = npy.log(result2) result4 = npy.mean(a) result5 = npy.std(a) # 結果出力 print("平方根= " + str(result1)) print("指数関数= " + str(result2)) print("result2の対数関数= " + str(result3)) print("平均= " + str(result4)) print("標準偏差= " + str(result5))
・出力結果
平方根= [[1. 1.41421356] [2.23606798 3. ]] 指数関数= [[2.71828183e+00 7.38905610e+00] [1.48413159e+02 8.10308393e+03]] result2の対数関数= [[1. 2.] [5. 9.]] 平均= 4.25 標準偏差= 3.112474899497183
それぞれ解説するのはキャパオーバーです。
・平方根
sqrt関数
・指数関数
exp関数
・対数関数
log関数
・平均
mean関数
・標準偏差
std関数
今日はここまで。
やっぱりなぞるだけでも結構大変ですね。