機械学習勉強ログ

機械学習に関連した勉強を記録していこうと思います。

線形代数はじめました!

前回、今年は数学を勉強すると決めてから14日経過してしまいました。

案の定続かないと思いきや、はじめてみたら結構面白くて意外に続いています。

新しく購入した Surface Pro6 がかなり便利で、 One Note と組み合わせて使っていますが、これは素晴らしいですね。

線形代数の意義は何だろうか?

学生のころ、なぜ勉強が頭に入らなかったかを考えると、明確に理由があるんですよね。

たぶん、誰もが1度は自問自答したであろうことだと思いますが、

「これは、いったい何の役に立つんだ?」 と疑問を抱えたまま、目的なく勉強を続けようとしたからだと思います。

なので、まずはそのあたりから入ろうと思います。

個人的線形代数の存在意義とは(笑)

線形代数は何のためにいるのか?をまず個人的に考えました。

ググればいろいろ出てくるのですが、ブログは個人の考えをつづるメディアだと思うので、

思いっきりバイアスがかかった意見を綴っていきます。

一言でいえば、 「多次元の値を扱いやすくするための概念を作ったぜ!」

ということなんじゃないかと思います。

ベクトルと行列で多次元を表現する

僕はエンジニアなんで、プログラムで例えていきます。

(あくまで、僕は、数学もプログラムも道具としてみているので正しいかどうかは置いておきますw。)

そうすると、ベクトル行列ハッシュ配列に相当するものなのではないかと思います。

例えば、次のようなプログラムで

users = [
  { 
     'name' : 'bob',
     'age'    : 20,
     'gender' : 'male'
  },
  {
     'name' : 'alice',
     'age'    : 19,
     'gender' : 'female'
  }
]

def print_users(users):
    for user in users:
      print('name={}'.format(user['name']))
      print('age={}'.format(user['age']))
      print('name={}'.format(user['gender']))
  • もし、ハッシュや配列がなかったとしたら、どう ユーザー群 という概念を表現すればいいのでしょうか?
  • また、仮に users というハッシュと配列で表現されるデータ構造がなかったら、 print_users という操作をどう定義すればいいのでしょうか?

いずれも、 難しい という結論になるのではないでしょうか?

たぶん、数学においてもスカラー変数だけでは、複雑な問題は解けないどころか、表現すらできません。

そのために、多次元の表現手段が必要となり、ベクトルや行列が生まれたのではないかと思います。

なので、プログラムでいえば、基本的なデータの表現の仕方やデータの操作を学ぶことと同じぐらいの大切さが線形代数にはあると思います。

ベクトルと行列を使って、ユーザー群を表現してみる

仮にベクトルを使って

  { 
     'name' : 'bob',
     'age'    : 20,
     'gender' : 'male'
  }

を表現するなら、


b=(bob, 20, male) ^T

たぶん、こんな感じですかね?

文字列は、数学では出てこないと思うので、あくまでイメージです。

ちなみに、ベクトルは下記のように縦で表記するのが一般的のようです。


b=\begin{pmatrix}
bob \\\
20 \\\
male
\end{pmatrix}

では、次にユーザー群を表してみたいと思います。

f:id:fugafigs:20190326001717p:plain:w500

こんな感じでしょうか?

ちなみに、行列はベクトルが並んだもので、

この場合が下方向に伸びていくと次元(要素)が増えて、右方向に伸びていくとベクトルの数が増える認識です。

綺麗に書くと、下のような感じになります。

{\
P=\begin{pmatrix}
bob & alice \\\
20 & 19 \\\
male & female 
\end{pmatrix}
}

まとめる

ベクトルは、複数の要素を持つ1つの概念を表す。

学生時代は、矢印と座標のイメージしかなかったですが、何を表してもいいようです。

例えば、グレースケールの10x10の画像は100次元のベクトルとして表現できます。

行列は、ベクトルが複数並んだものと思ってよさそう。

ちょうど、データベースの テーブルとレコードを考えるとわかりやすいと思います。

1レコードが、1つのベクトルに相当し、テーブル全体が行列のイメージだと思います。

先ほどの10x10のグレースケール画像が100個あったら、100x100の行列として表現できます。

次回のお題

ちょっとトンでもな感じで終わってしまいましたが、ベクトル・行列を使って、複数要素からなる値(多次元の数)を表現する手段を得ました。

次はこの表現手段を使って、どのような操作ができるのか!

また、独自の切り口で学んだ結果をアウトプットしていこうと思います。

更新は2週間後ぐらいを目指したいと思います。