はじめに
こんにちわ、swim-loverです。 Pythonで機械学習の一つである手書き数字認識を実装しています。Pythonを始めたばかりですが、「使いながら覚える」をコンセプトに勉強しています。 第3回は、 google colaboratory について書いてみました。今回、numpyで行列演算を学びたいを思っています。単に、行列演算をやっても、退屈なのは間違いありません。そこで、numpyの行列演算を学ぶと同時に、機械学習もついてでに学べたら効率的だと思いますので記事にしてみました。
参考書籍について
今回、機械学習の参考書籍として、”斎藤康毅著 ゼロから作るDeep Learning オライリージャパン 2016年9月”を使用しました。
ニューラルネットワークについて
ニューラルネットワークについて、Wikipediaの解説を参照してみます。ものすごく簡単に理解すると、神経細胞間のネットワーク(情報伝達)と言えるかと思います。そして神経細胞間には重み付けされて情報を受け取ります。
ニューラルネットワークという名称は歴史的に生物の神経に由来する。1つの神経細胞は他の神経細胞からの入力をシナプスで重み付けして受け取り、細胞体等での処理を介して、次の複数の神経細胞へと出力する。これらの結合により神経細胞群は全体としてネットワークを形成する。数理モデルとして見れば、ニューロンは入力の線形変換を含む1つの処理単位であり、これがネットワークを形成して神経をなしている。ゆえに神経的な(ニューラル)ネットワークモデルという意味でニューラルネットワークと名付けられた。
https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
そして、ニューラルネットワークと言えば、この図です。〇と〇が線でつながった図です。記事では、機械学習の内容について説明できるスキルはありませんが、進め方の都合で載せることにしました。
行列演算
numpyを用いて、行列演算を行います。演算の目的は、ニューラルネットを作ることにあります。最初に、以下のシンプルなニューラルネットワークです。中間層が無いニューラルネットと言えばよいのでしょうか?wは重み付けですが、yに向かう矢印に上から番号を割り振っています。
Python実行環境は、google colaboratotyを使用します。
import numpy as np
x = np.array([1,2])#1行2列
print("x={}".format(x))
w1=1;w2=2;w3=3;w4=4;w5=5;w6=6
w = np.array([[w1,w2,w3],[w4,w5,w6]])#2行3列
print("w={}".format(w))
入力行列xと重み行列wを定義しました。出力行列yを得るには、xとwの積を行います。dot(x,w)にて行います。行列式は次のような演算を想定しています。
y = np.dot(x,w)
print("y={}".format(y))
計算結果は、つぎのように表示されました。
x=[1 2] w=[[1 2 3] [4 5 6]] y=[ 9 12 15]
演算結果は、正しいようです。
ついてに学ぶ
C言語ではこうやるのをPythonではどのように記述するか、今回ついでに学びました。
- コード中のコメント行は、#で良い。C言語ならば、/* hoge */, //hoge
- コードの可読性を上げるため、一行中に複数のコードを書くには、’;’で区切る。C言語で int x,int y;というようなカンマ(,)で続ける書き方はエラーとなりました。
- 結果の書式付の出力のprintは、{}.format()で行う。
まとめ
今回、numpyを使って、行列演算を行ってみました。演算の目的はニューラルネットを作る!でした。単なるnumpyの勉強が、目的をもって学ぶと有意義に感じられました。
組み込み系ソフトエンジニアをしています。これまでフロントエンド技術は避けてきましたが、食わず嫌いをやめて、勉強を始めました。
趣味は、水泳、ロードバイク、ランニング、登山です。
組み込み系技術ネタ、勉強したフロントエンド技術、たまに趣味の運動について発信していきます。
どうぞよろしくお願いします。
コメント