まとめるのが難しいところ。
機械学習における数学
数学は学習すべきか
機械学習については、ライブラリやサービスを使用することによって導出のために必要な数学の知識は最低限で済ませることができると思います。
しかし、その仕組みは数学に基づいて動いているため、仕組みを理解したりより最適なパラメータの調整を行うためには数学の知識は必須であると思います。
とは言え、個人的には機械学習を特に独学でやる場合には必須ではないとも思っています。
なぜならほんとに実践的に有用なレベルの知識を0から身に着けるには学習コストが高すぎると思っているからです。
特に昨今は文系出身のエンジニアにも多く、数学的な知識のスタートラインにも差があるため、ここでもがき苦しみすぎて挫折するぐらいなら、とりあえず先に進んで実践的な部分を学んでもいいのではないでしょうか。
コンピュータを利用するのにその内部にある数式や物理法則を理解しているのか?という話でもあります。
私のブログ以外でも機械学習における数学をまとめたブログなどはあると思いますし、書籍等も出ていますが、おそらくそれは一読したぐらいでは元々の知識がある程度ない限り理解しきるのは困難でしょう。
高校や大学で数年かけて学ぶものを数日で学ぼうとするのは虫がいい話です。
逆に言えば、これまでに数学を学んできている人は一つのアドバンテージになるのかもしれません。アドバンテージは選択肢は増やします。
現状の理解度にもよりますが、数学に関する扱いの選択肢としては以下のようなところでしょうか。
①機械学習に必要な数学を腰を据えて学習する
②基本だけ抑えて、後は必要になったら戻ってくる
③無視して、実践部分に突入する
本ブログでの扱い
本ブログでは
②基本だけ抑えて、後は必要になったら戻ってくる
の方針で進めていきます。
妥当な選択にも思えますが、基本の理解というのは自分の裁量になりがちであるためどっちつかずの中途半端な状態になりやすい気がするのでそこは注意すべきだと思います。
少し時間をかけて勉強してみたがまるで役に立っていないという状態になりかねないです。
※もちろん私も結果的にそうなってしまう可能性は大いにあります。
最初の学習においては理解している部分としていない部分をしっかりと認識できた状態にしておく必要があるでしょう。
機械学習に必要な数学の知識は以下のようなものが言われていると思います。
・ベクトル
・行列
・線形代数
・微分
・確率
・統計
私は専門家ではないので、基本的には参考書に沿って進めていきます。
数学の詳細な知識については専門家にお任せして、ここではPythonを使いながらの学習を意識していきたいと思います。
まぁなんかいろいろいいましたが、理系出身ではありますが専門ではないし、学生時代以降はずっと離れていたので大したことはできません。
ベクトル
ベクトルについては、単語をベクトルで表現するWord2Vecという概念で使用されるようです。
また今回より、ちょこちょこ数式が登場するので、「MathType 」という数式エディタを試しに使用しています。
なんとなく分かってきたら記事にしたい。
ベクトルの基本
ベクトルとはなんでしょうか?
ベクトルとは向きと大きさをもった量と言われることが多いと思います。
ほんとにただのイメージですが、図面上ではそのまま矢印です。
矢印は方向性と大きさ(視覚的には長さ)をもっているため、図で表現するならばこの矢印でよいと思います。
数学的なベクトルの種類には大きく2種類あります。
・列ベクトル(縦ベクトル)
要素を縦に並べたベクトルを列ベクトルと言います。
・行ベクトル(横ベクトル)
要素を横に並べたベクトルを行ベクトルと言います
・ベクトルの表現
ベクトルを数式上で表現するときは変数上に「→」をつけた以下のような表現を行うのは一般的だと思います。
本ブログでも基本的にはこの表現でいこうと思います。
・ベクトルの基本用語
要素:ベクトル内の一つ一つの数値
次元:ベクトルがもつ要素の数
スカラー:ベクトルと比較したときの普通の数字のこと
転置:列ベクトルと縦ベクトルの相互変換のこと
Pythonでベクトルを表す
Pythonでのベクトル表現は過去記事の以下で一度やっています。
簡単な復習だけ。列ベクトルと行ベクトルの表現方法。
・例
import numpy as npy # 行ベクトルの定義 a = npy.array([1,2]) # 列ベクトルの定義 b = npy.array([[2],[4],[6]]) print("★行ベクトル") print(a) print("★列ベクトル") print(b)
・出力結果
★行ベクトル [1 2] ★列ベクトル [[2] [4] [6]]
Pythonでベクトル操作
・転置を行う
転置を行うにはベクトルには、ベクトルに対して「.T」を使います。
一次元の配列には使用できないみたいです。
・例
import numpy as npy # 行ベクトルの定義 a = npy.array([[1,2]]) print("★行ベクトル") print(a) print("★転置後の列ベクトル") print(a.T) print(a.T.T)
・出力結果
★行ベクトル [[1 2]] ★転置後の列ベクトル [[1] [2]] [[1 2]]
・ベクトルの加減算
ベクトルの加減算については普通に計算ができます。
計算自体はそのままなので、過去記事を参照。
・ベクトルのスカラー倍
スカラーとはつまり普通の数字のことです。
ベクトルのスカラーを掛けるとそのまま倍化される。矢印でいうとその分だけ長さが伸びます。
Pythonでの実装は同じく過去記事を参照。
ベクトルの内積
ベクトルの内積はベクトルの成分同士を掛け合わせた和を求めたものになります。
内積に関してはあまり意味を求めない方がよさそうです。
・計算例
Pythonで実際に試してみます。
・例
import numpy as npy # 行ベクトルの定義 a = npy.array([1,2]) b = npy.array([3,8]) print(a.dot(b))
・出力結果
19
・内積の定義
ベクトルaとbのなす角がθであるとき以下が成り立つ。
この条件があるため、2つのベクトルが直交に交わるとき内積は「0」になります。
内積でさらっとでてきましたが、ベクトルの大きさは||a||で表します。
公式的には以下の通りになります。
・Pythonでベクトルの大きさを求める
Pythonで大きさを求めるにはlinalg.norm(b)を使用します。
・例
import numpy as npy # 行ベクトルの定義 a = npy.array([1,2]) b = npy.array([3,4]) # ベクトルの大きさを求まる anum = npy.linalg.norm(a) bnum = npy.linalg.norm(b) print(a) print(anum) print(b) print(bnum)
・出力結果
[1 2] 2.23606797749979 [3 4] 5.0
その他のベクトル
法線ベクトル
二次元的にはある直線に垂直なベクトルのことを指します。
三次元的には面に対する垂直なベクトルを指します。
特に曲面では1点と法線ベクトルをとると、接平面が定まる。
ベクトルのノルム
ベクトルのノルムのという概念は学生のときはしりませんでした。
ベクトルのノルムというのは移動距離のことです。
ノルムはL1ノルムとL2ノルムが存在します。
L1ノルムはベクトルa(4,3)が存在するときに距離4と距離3の加算したもののことです。
L2ノルムは同様のベクトルで最短距離で距離5のことです。
ノルムは線形回帰モデルの正規化項として使用されるようです。
正規化項は訓練データに適合しすぎる過学習を防ぐ調整のために使用するらしいですが。。。
詳しくは今後説明できるようになれたらと思います。
コサイン類似度
これも初めての概念で高校数学でもでてこなかったはずですが、機械学習的には重要な概念になるのではないかと思います。
※ちゃんとしらない私の感覚になるのであまり信用はしないでください
2つのベクトルが存在するとき、2つの関係にはなす角θが存在します。
内積の公式でも登場したcosθはコサイン類似度と呼ばれています。
内積の公式を用いると以下のように求めることができます。
少し真面目に勉強すれば、おそらく公式を丸暗記しなくても内積があればすぐに求められるようになる気がします。
コサイン類似度はなす角θにより求められるcosθので、直交(θ=90)していると類似度=0になり類似性が低い。
平行(θ=0)していると類似度=1になり類似性が高い。
逆行(θ=180)だと類似度=-1になり類似性は????どうななんでしょう。
この辺は値と関係性は直感的に分かりやすいですね。
pythonで扱う場合には「math」ライブラリを使用しますが、実際の使用はまた今後で。
今回のソース
python_dev/Python_math1.ipynb at master · wantanblog/python_dev · GitHub