1. Qiita
  2. 投稿
  3. Octave

機械学習を1ヵ月で実践レベルにする #6 (Octave 実践編)

  • 0
    いいね
  • 0
    コメント

    6日目

    理論を理解しても、それをOctave で実装するときにつまづくことが結構ありました。特に実数(スカラー)での定義をベクトルや行列に拡張するときに、式では理解できても、Octave で表現するときにつまづくことが多かったです。

    Vectorial implementation という考え方があると少し理解しやすくなると思いましたので、ここで1日使って、このVectorial implementation を説明したいと思います。

    過去記事一覧

    Octave によるVectorial implementation

    例によって、英語しかみていないので「Vectorial implementation」日本語の該当する用語がわかりません。Google によると「ベクトル化実装」らしいです。どうもピンと来ませんが、Octave で数値計算するときに大事な考えかたなので、さっとまとめておきます。

    早速

    image
    image

    このように要素数が同じ配列が2つあったとします。そこでいま

    image

    これを計算したいと思います。∑ を使って書くとこうなります。

    image

    愚直に考えてループ

    Python

    a = [1, 2, 3]
    b = [2, 3, 4]
    ans = 0
    for i, v in enumerate(a):
        ans = ans + a[i] * b[i]
    print(ans)
    

    Octave

    a = [1;2;3]
    b = [2;3;4]
    ans = 0
    for j = 1:length(a)
        ans = ans + a(j) * b(j);
    end
    display(ans)
    

    ∑ の計算はfor ループで書くのは直感的かと思います。

    行列の積として考える

    しかし、

    image

    この形は行列の積で表すこともできます。

    image

    Octave は行列の計算に長けていますから、さきほどのコードにあるa やb は行列としても扱えます。Octave の場合、配列はベクトルで、要素nのベクトルというのは n x 1 の行列に過ぎませんから、a, b はそれぞれこうなっています。

    image

    image

    両方 3 x 1 では行列の積が作れませんので、片方を転置(T)して

    image

    このようにも表現できることがわかります。これをOctave のコードに落とすと

    a = [1;2;3]
    b = [2;3;4]
    ans = a' * b
    display(ans)
    

    実際に計算している部分はa を転置してb に掛けるだけ。

    a` * b
    

    これでできます。これがベクトル化実装です。
    コード自体がすっきりかけるだけでなく、Octave の内部で効率の良い行列計算がなされますから、実行効率もよくなります。機械学習では∑ の計算は結構でてきますので、効率の良いベクトル化実装がすぐに思い浮かぶようになるといいですね。

    Comments Loading...