まいこーmemog

生きづらいとき人の言葉で生き返るので,自分も言葉にしてみる.[memo+blog]

【iPad芸人】誰もが嘘をついている ビックデータの絞り込みの力の例をまとめてみたよ

今読んでいる本.

誰もが嘘をついている(原題:Everybody Lies)は元Googleのデータサイエンティストセス・スティーブンスによるビッグデータ分析に関わる本だ.

誰もが嘘をついている ビッグデータ分析が暴く人間のヤバい本性

誰もが嘘をついている ビッグデータ分析が暴く人間のヤバい本性

 

 

ビッグデータは,大量のデータでしょ?という程度の認識だった.

せいぜい従来のデータより,精度の高い何かしらがわかるぐらいのもんだろう.

こんな風に高を括っていた自分が恥ずかしくなる,面白い事実がいくつも登場する.

 

まだ半分と少し読んだ程度だが,すでにこの本から得られる情報量に圧巻されている.

ビッグデータ解析から得られる具体的な情報が多いのだ.

 

僕は本を読むのが大好きだが,読んでいるとすぐに疲れてしまう.

情報量の多いこのような本の場合は特にその傾向がある.

 

そこで,お絵かきを挟みつつ読むことにした.

いわゆるグラフィカルレコーディング(GR)っぽいやつになるかもしれない.

iPadProを買ってから,ノート書きやお絵かきが捗る.

 

f:id:maikocho:20181114235647p:plain

 

今回はこの本の第5章の内容について,一部まとめてみた.

第5章は「ビッグデータの絞り込みの力」だ.

 

大きくリッチなデータの全体を見るのではなく,

一部の集団に絞り込んで分析することで,これまで得られなかった事実が浮かび上がる.

 

長生きできる地域は,どんな特徴があるのか?

有名になる子供には何か共通の特徴があるのか?

これらの情報を,時に納税のデータから,時にWikipediaのデータから導き出す.

 

妊婦が何を食べたくなるのか.

吐き気や腰痛など,どんな身体症状があるのか.

これらが国によってあまり変わらないことは,Google検索のデータからわかる.

 

逆に妊婦が何に悩むのか.これは国によって違うらしい.

どんな風に寝ればいいのか調べる国も,セックスはどうやったらいいのか調べる国もある.

こんな赤裸々な悩みも,Google検索のデータから明らかになる.

 

ビッグデータの可能性がわかる,とても楽しい本だ.

ちょっと下ネタが多めだけど,そんなところも好き.

 

絵の描き方は,色々あると思う.

自分でもいろんな形式を試しているので,また振り返っていきたい.

 

来年くらいには,ビッグデータの解析も勉強できるレベルになりたいなぁ.

 

ひとの中に残るを方程式で表すと

夏目友人帳 伍 第10話『塔子と滋』をU-NEXTで見た.

この世界は,登場人物の誰も携帯を持っていない.

お話の世界は古い時代の話のようだが,今も続く人気作品である.

 

夏目友人帳は,愛や友情などの様々な感情が,

妖の見える少年-夏目貴志の人間と妖怪,2つの世界を知る視点で,

鮮やかに,時に儚く描かれている.と思う.

 

夏目貴志は幼い頃に両親を亡くし,親戚の家をたらい回しにされていた.

妖が見えるせいで,奇行に走る情緒不安定な子として,どの家でも煙たがられる.

そんな貴志を引き取り,温かく迎えたのが今回のお話のメイン,藤原夫婦だ.

 

第10話のあらすじを公式ページから引用する.

ある日の帰り道、夏目はカラスのひと鳴きで降り始めた雨に気づき、急いで家に帰って塔子と洗濯物を取り込む。カラスのことを話すと、塔子は、夏目を引き取る前、滋と二人仲良くこの広い家に住んでいた時代のことを思い出す。ある日、遠い親戚の葬式に出かけた滋は、そこで所在無げな男の子――夏目貴志を目にする。そして、塔子は戻ってきた滋が急に空き部屋を片付け始めたことが気にかかる。

引用:夏目友人帳 伍 第十話 塔子と滋 | アニメ 夏目友人帳 公式サイト

 

藤原夫妻は,葬儀場で見かけた少年,夏目貴志を引き取ることを決める.

夫の滋は貴志のために,使っていなかった部屋の掃除を始める.

妻の塔子は,現在の貴志の様子を見に,貴志の住む街へ連絡もなしに足を運んだ.

引き取りの際は親戚達と一悶着ありつつも,なんとか貴志を迎えることができた.

 

最初はぎこちなくどこか心を開かない貴志だが,

優しい夫婦のおかげで,だんだんと藤原家に馴染んでくる.

しかし,妖が見えることはまだ話せていない.

 

今後,貴志は藤原夫婦に話せるようになるのだろうか.

 

本当にいい話なのでぜひ映像で見て欲しい.

ひとの心に,残るもの

この夫婦は,遠縁でほぼ赤の他人である夏目貴志を非常に温かく迎えた.

迎えるにあたって,部屋の大掃除をしたり,携帯もないので会えるかわからずに

貴志を見に行ったり,親戚との一悶着があったり,そこそこ労力を使っている.

 

現代,人とのつながりを作る際はどうだろう.

人と繋がるためのコストは,急激に低下している.

会いたい人がいたら,LINEなりTwitterなりSNSを聞いてコンタクトを取る.

 

スケジュールを合わせて,指定の場所で指定の時間に待ち合わせる.

相手の特徴や顔も,すでにわかっていることも多い.

何かトラブルがあれば,リアルタイムで連絡もできる.

 

どう考えても,手軽に会いやすい人が増えている.

 

ひとの心への残りやすさは,

(その本人へのフィット感) × (達成までにかかったコスト) + (その他)

みたいに表すことができるんじゃないかと思う.

 

フィット感という曖昧なことばは,「価値」や「必要性」などのことばや,

「ないことが考えられない」や「なんか幸せ」という同じようだが,

ニュアンスの違うことばを含むために使っている.

 

つまり,会う人も情報も大量だが,それらを得るのが低コストとなった現代において,

ひとの心に残るものは,初見で相当フィットするものばかりとなる.

 

人間ひとりを完全に理解することは,自分自身を含めて誰にもできない.

AIを利用した分析がもっと本格化すれば,それらしいことはできるかもしれない.

でも,本当の意味で人を知るには長い時間とたくさんの知識が必要になる.

ささっとすぐに,できることではない.

 

ある人を知るために,長い時間をかけ,知識を持って,

しっかり自分と異なる存在と向き合うことができるこころは,

自分に残っているだろうか.

 

 

そんなこころがないのは,勿体無いような,悲しいような気がする.

初めは嫌だと思った相手が,付き合ううちに親友になったような話はよく聞く.

これからの時代でも,そんなことは起こるだろうか.

 

逆に,自分はひとの中に残る存在になれているだろうか.

自分らしさと心づかいを,しっかりと持てているだろうか.

そんなことを自問自答する.

 

ひとの中に残る方程式は,人だけじゃない

さっきの

(ひとの心への残りやすさ) =

(その本人へのフィット感) × (達成までにかかったコスト) + (その他)

 

という方程式は,人がひとの心に残る話だけではない.

学習に関しても,同様の視点を持つことが大切になる.

 

Google効果という言葉を知っているだろうか.

Googleで検索した内容はすぐに忘れてしまう.ということだ.

検索で得た知識は,(達成までにかかったコスト)がほぼゼロである.

 

ほぼゼロなので,よっぽどでかい数をかければ残ってくれる.

実際,かなりの興味があれば検索を利用した学習でも身につく.

 

しかし,大学までの,学習に悩む者にとって興味の値がそこまででかいことは,

そうそうないと思う.つまり,

Google効果は,大抵の本当に身につくことは相応の努力(コスト)があるものだけ.

という,上の方程式を教えてくれる.

 

まとめ

Twitterですぐ否定する人や,よくわからない怒り方をする人をたくさん見る.

日常でも,なんでそんな風にいうの?と思ったり,

他人の愚痴を聞いて,え?そうか?と思うこともたくさんある.

 

今の時代は,たくさん繋がって残っているようで,

実際はただ消費して消えていっているだけであることが少なくない.

 

本当に心に残るつながり,情報.

そういうものを大事にできる社会ってなんか気持ち良さそうだなと

なんかぼやっと考えてたことを,なんとか書き起こしてみました.

 

 

Django モデルを作ってマイグレーション

最近研究がとても忙しいが,Djangoの勉強が楽しいので時間の使い方が難しい.
前回はAppを追加する部分までの操作をまとめた.
maikocho.hatenablog.com

今回は,実際にモデルを簡単に書いてみるのと,データベース利用に関する操作を整理する.
データベースは直接の操作もできるが,マイグレーションという機能で,手間が大幅に減る.
最初は大変だったんだけど,とにかく楽できるんだなということは意識しておきたい.

楽を覚えると,楽のために生まれた穴に気づきにくい.
時間ができたら実際のデータベース操作や,マイグレーションがどうやって機能しているかも勉強していこう.

では,まずAppのモデルを実際に書いてみる.

models.pyを編集する

App本体を作ったはいいが,中身がないと意味がない.
まずは,どんな機能が必要になりそうかスケッチを見て考えよう.

f:id:maikocho:20181111215144p:plain
ポートフォリオプロジェクトのスケッチ

モデルは1つのAppにつき,1つで考えれば良いらしい.
まずは,前回作ったAppのディレクトリ内のmodels.pyを開く.
import文が1つあるだけ.ここにclassを追加する.

コードを書く前に,実装する機能についても考える.
例えば,Blogの方は新着記事のまとめをいくつか表示したいとする.
記事のまとめ(summary)があるといいだろう.

また,サムネイル画像もあるといいかもしれない.
以上の考えから,models.pyに次のようなコードを書く.

class Blog(models.Model):
    image = models.ImageField(upload_to='images')
    summary = models.CharField(max_length=300)

フィールドについては,Djangoのモデルフィールドのリファレンスを参照する.
モデルフィールドリファレンス | Django documentation | Django

imageのupload_toの部分は,後述のメディアURLが/media/だった場合に,
画像のパスが,「/media/images/ファイル名」となるらしい.
まぁとにかく,こんな感じでモデルを作っていく.

プロジェクト本体にAppが追加されたことを知らせる

Appを作っただけでは,本当に作っておいてあるだけである.
プロジェクト本体に,Appがこのプロジェクトに追加されますよーと教えてあげないといけない.

プロジェクト内部,プロジェクト名のディレクトリ内にあるsettings.pyを開こう.
中頃にこんな部分があると思う.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

ここに,自分の作成したAppを追加する.
blogを追加する場合は次のようになる.

INSTALLED_APPS = [
    'blog.apps.BlogConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

'ディレクトリ名.apps.class名'となっている.
名前の構造でわかるが,Appディレクトリのapps.py内にあるクラスを指定している.

画像を扱う部分も追加する

settings.pyの最下部にさらにコードを追加する.
先述のメディアURLに関わる部分だ.

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'

これでmodelに関してデータが保存されれば,mediaというフォルダをプロジェクト直下に作成し,格納してくれる.

ここまで来たら,runserverした時にターミナル上に出ていた赤文字を思い出して欲しい.
実は,migrateしろ的なことが書かれていた.

これは,プロジェクトで使うデータベース機能をちゃんと使うための準備をしろ.
ということだと思えばいい.

このmigrateに関して,細かいことは次のページを参考にさせていただく.
qiita.com

では,次のコマンドを実行しよう.

(myvenv)$ python manage.py migrate

これでデータベース利用のための最低限の準備はできた.
しかし,現時点でプロジェクトに大きな変更がある.
そう,Appを追加したことである.

このことも知らせないといけない.
実は,このためにsettings.pyで追加した旨を記述したのだ.
次のコマンドを実行しよう.

(myvenv)$ python manage.py makemigrations

もしかすると,Errorが出たかもしれない.
画像に関するフィールドを追加したので,画像処理のライブラリが必要だと言われた.
エラーメッセージに従ってPillowというライブラリをインストールする.

(myvenv)$ pip install Pillow

Pillowについては,以下のサイトで勉強させていただく.
note.nkmk.me

これで大丈夫なはずだ.
もう一度,makemigrationsを行おう.

データベースの更新

migrateした後にAppに関する部分を操作し,make migrationsというのをした.
makeしたので,それらを適応しないといけない.
したがって,もう一度次のコマンドを実行する.

(myvenv)$ python manage.py migrate

これでモデル作成に関して,必要な操作は完了した.
ただ,今後モデルに関してコードを変更することもあると思う.
その場合は変更に対してまた

(myvenv)$ python manage.py makemigrations

を行い,

(myvenv)$ python manage.py migrate

を実行するという流れを忘れないようにする.

まとめ

いろんな知識が出てきた.
勉強すべきことはどんどん増える.

トップダウン的な勉強か,ボトムアップ的な勉強かは分野によって向き不向きがある.
でも,プログラミングは前者でないと過去の遺産が多すぎていつまでも目標にたどり着けない気がする.

関係ないけど最近寒いので,風邪には気をつけたい.

【Django初心者】サーバ起動&プロジェクトにAppを作ろう

前回Djangoでプロジェクトを作って,
git管理を始めるところまでの流れを整理した.
maikocho.hatenablog.com

今回は,実際にサーバーを動かす操作と,プロジェクトにAppを追加する部分を行う.
Appを追加するというとなんかよくわからんので,
どういう発想かの整理からしていこうと思う.

プロジェクトはどのように構成されるか

Djangoのコマンドでプロジェクトディレクトリを作ると,
次の2つがその中身に入っている.

  • manage.py
  • projectname/

manage.pyはDjangoの機能実行に関係するファイルだ.
サーバーを動かす際のコマンド中でも使う.
その部分は後述.

projectnameのついたディレクトリには,さらに複数のファイルが入っている.
その中のPythonファイルでWebページの操作を行う.
サーバーアクセス時に表示するページはどれか,ページ内で得たデータをどう処理するかなどを記述できる.

つまり,Djangoのコマンドでプロジェクトを作ると,
必要最低限の機能を記述するためのファイル群が生成される.
これらをBasic filesと呼ぼう.

サーバーを起動してブラウザからアクセス

ただディレクトリを作っただけでは,何をやっているのかさっぱりわからない.
そして,全然嬉しくない.
新しいことをやっていく中では,嬉しい楽しいの気持ちが一番大事だと思う.

ということで,サーバーを実際に動かし,ブラウザからアクセスする.
出来上がりのページをただ眺めるだけだったブラウザで,自分のページを見る第一歩を踏み出す.
次のコマンドを実行する.

(myvenv)$ python manage.py runserver

もちろんこのコマンドは,プロジェクトのディレクトリに移動してから実行しよう.
プロジェクトに関わるので,プロジェクト用の環境に入ることも忘れないように
プロンプト部に(myvenv)とつけておいた.

これを実行すると,ターミナル上にズラーッと文字が出て
http://127.0.0.1:8000
という部分がどこかに見つかるはずだ.

127.0.0.1は,ローカル・ループバック・アドレスというらしい.
127.0.0.1localhostとしても良いが,とにかくこの文字列をブラウザに打ち込もう.
エンターを押して,うまくいけばこんな画面が現れる.

f:id:maikocho:20181112212211p:plain

ここで最高のテンションになる.
やったぜ!サーバーが動いた!!
と叫んで気持ちの悪い動きをしそうになるのを,頑張って抑える.

これはDjangoのデフォルトページである.
先ほどのBasic filesをいじり,ページの中身をhtmlで書けば,
ここに自分のページを表示させることができる.

また,プロジェクトのディレクトリを見てみよう.
「db.sqlite3」
というファイルが追加で生成されている.

これはデーダベースファイルで,今後使うこともあると思うが,
今はまぁデータ扱うし必要だよね,程度で留めておこう.

サーバーは留めないと動きっぱなしになる.
アクセスできることを十分楽しんだら,control+Cでサーバーを停止させよう.
ブラウザでリロードすると,アクセスできないという旨のメッセージが出ると思う.

Appの話に入っていきます

ここで,今回目標のスケッチを思い出す.
幼児の気持ちに戻って気の向くままに描いたアレだ.

f:id:maikocho:20181111215144p:plain
portfolioプロジェクトの完成スケッチ

このスケッチでは,「Jobs」と「Blog」という2つの構成要素がある.
これらはその機能を独立させて,他のプロジェクトでも使える可能性がある.

今回はポートフォリオを作るプロジェクトなので,「Jobs」と「Blog」の機能だが,他のサイトを作る際には「Pictures」と「Blog」機能が欲しいかもしれない.

このような状況で活躍するのがAppという発想になる.
「Jobs」や「Blog」といった機能をプロジェクト内にAppとして作成する.
文字で書くより,絵で見た方がわかりやすいと思ったので,現在の僕のイメージを貼っておく.
f:id:maikocho:20181112205920p:plain

多分こんな感じだ.
具体的な作り方を見ていこう.

Appの作り方

今回書く作り方というのは,プロジェクトディレクトリ内にAppを存在させるところまでとする.
具体的な中身の作り方は,絶賛勉強中.

Appを作る機能もmanage.pyの管轄内だ.
次のコマンドを実行しよう.

(myvenv)$ python manage.py startapp appname

appnameの部分は,「jobs」や「blog」のように自分の作りたい機能の名前にする.
このコマンドの実行後,プロジェクト内を見ると,appnameのついたディレクトリが追加されているのがわかる.

これで,Appの作成は終了だ.

まとめ

サーバーの立ち上げと終了の方法.
Djangoプロジェクトにおける,Appの概念を整理した.

Webサーバーやアクセスに関する知識は,実際にはもっと必要となる.
ちょくちょくphpならびにApacheの勉強もする必要がありそうだ.

ブラウザでwww以外にアクセスするのは,なんか一段上がった感があって非常に好き.
こういう感動を少しずつ感じないとなかなか進んでいかない.

Udemyの講師の方は,あのページが出た瞬間,
「Boom!!!」
と超ハイテンションだったので,こっちも楽しくなった.

日本では.「基本のキができましたね」程度で終わりそうだと思ったので,
このハイテンション感と,喜びを大事に勉強していきたい.

【Django初心者】プロジェクトをつくる

Djangoでプロジェクトを作る際の操作手順をまとめておく.
Udemyで学習した内容をまとめるので,適宜gitにコミットする部分も入れる.

スケッチを描く.

さぁ,プログラミングするぞ!
と意気込むとまずパソコンを開き,続いてエディタを開き...
そんな癖がついていた.

プロジェクトで何か作ろうとする際は,この癖は封印しよう.
まずは紙と鉛筆を持つ.
もちろん,iPadProとApplePencilでも良いので,僕は後者を選ぶ.

作りたいサイトの構想図を,幼稚園のお絵かきの時間のように描く.
f:id:maikocho:20181111215144p:plain

(かなり適当に描いたけど,こんな感じ.)

プロジェクト置き場とプロジェクト本体を作る

ここからパソコンのスイッチを入れる.
まずはvirtualenvでプロジェクト用の環境を作る.
terminalを立ち上げ,プロジェクトを作るディレクトリで以下のコマンドを実行する.

$ virtualenv myvenv

myvenvの部分は好きな名前で良い.

この環境を使えるようにするには,以下のコマンドを実行する.

$ source myvenv/bin/activate

こちらも同様,myvenvのところは自分のつけた名前にする.
これをするとプロンプト($の手前の部分)に環境名が入る.

(myvenv) user@PC_name$

もちろんmyvenvは自分がつけたn...
しつこいのでやめておく.

さて,肝心のプロジェクトを作ろう.
Djangoを環境内にインストールするので以下のコマンドを実行する.

$ pip install django==version

pipはPythonに付属するパッケージ管理ツールだ.
versionは指定しなければ,最新版がインストールされると思う.
指定しない場合は,「==version」を取れば良い.

次にdjangoコマンドで新しいプロジェクトを作る.

$ django-admin startproject projectname

(projectnameは,今回はportfolioとしたとして話を進める.)

このコマンドで,プロジェクト用のディレクトリと必要最低限の中身が作成される.
cdコマンドでプロジェクトのディレクトリに移動しておこう.

$ cd portfolio/

gitにcommitする

新しいプロジェクトを作ったので,gitを利用してバージョン管理をする.
gitはプロジェクト作成クエストに,セーブポイントを作ってくれる.
ギャルゲーで分岐前にセーブをためていくのと同じことだ.*1

まずは,このディレクトリをgitでコード管理しますよーという宣言をする.

$ git init

ちなみに現在のディレクトリは,プロジェクトのディレクトリだ.
この宣言により,あとは状態を確認したり,実際にコミットするだけだが,
その前にgitignoreというファイルを作っておこう.

プロジェクトディレクトリ直下で良いので
「.gitignore」
という名前でファイルを作る.

このファイル内に書かれたファイルやディレクトリは,gitに監視されないので,
機密情報だったりなんだったりを扱うものは,ここに書いておく.
しかし,初学者にこれは無理難題だ.

そこで,
www.gitignore.io
このサイトを利用する.

ここでDjangoと検索して,出てきた内容をコピペしよう.
これで,gitを利用する前の準備は完了だ.
一応次のコマンドで,未アップのファイルがあるか調べてみよう.

$ git status

これでファイルが出れば,コミットすればいい.
次の2つのコマンドを実行しよう.

$ git add -A
$ git commit -m "comment"

commentの部分は,セーブポイントの名前だ.
最初だったら

$ git commit -m "My first commit\!"

のようにすればいい.
\は!を通すための記号である.
そのまま!と打っても通らないは,やってみるとわかる.

仮想環境から抜ける

以上でプロジェクトを作成して,git管理を始めるところまではできた.
内容はこれからだ.

作業を終了するときは,virtualenvの作る作業用環境から抜けておこう.
次のコマンドで元に戻れる.

$ deactivate

プロンプトの前の,( )の部分が消えたら成功だ.
terminalを消すときはexitコマンドを叩いておこう.
シェルの終了コマンドだが,忘れてもどうにもなたことがないので
現代のパソコンにとっては,おまじないだと思っている.

$ exit

まとめ

Djangoでプロジェクトを作る手順を確認した.
vertualenvやgitやと色んなツールが出てきて,ややこしく感じるが,
必要性や発想の根拠はわかるので,とりあえずそんなところの理解でいいかなと思っている.

プログラミングを始める際の,環境構築の初学者殺し感は本当にどうにかしてほしい...

Udemyで勉強中のコースはこちらで紹介.

maikocho.hatenablog.com

*1:ちなみにギャルゲーはアニメの中でみたことしかない.

プログラミングを始めたいけど,つまずく人へ

プログラミングの重要性が叫ばれる昨今.

プログラミングを始めたい!と思っている人は少なくないと思う.

何を隠そう,僕もその一人だ.

 

しかし,この発想には少し問題がある.

こういう場合,いざ勉強を始めるにも何から手をつけていいかわからない.

原因は単純で,世間的な必要性に感化されたことが行動の根本だからだ.

 

時にはこの行動理由で,うまくいくこともある.

でもプログラミングはそうはいかない.なぜか.

プログラミングはそれ自体が目的ではなく,目的を達成するためのツールだから

これに尽きると最近思う.

 

そこで僕は達成すべき目的を探した.

ネットの海の中で,自分がしたいことでプログラミングを利用することを.

そして見つけた.エアコンのIoT化だ!

 

Raspberry Piという,電気的なインターフェイスを持った

小型コンピュータを使って,エアコンの信号を送受信する.

なんだかワクワクする.

 

しかし,計画は断念した.*1

必要な基礎技術が初学者にはあまりにも多く,根気がいる.

普段の研究生活の合間を縫ってやるには,頭のリソースが足りない.

 

ここまででわかったことは,現代において自分がすげぇ!と思うことは,

かなりの進歩を遂げた後のものばかりだということだ.

初学者には,その構成要素の因数分解すら難しい.

 

そこでとにかく,1つのものを作るプロジェクト型の学習を

Udemyを使って行うことにした.

 

理由は3つある.

 

まず1つは,

本の教材での勉強は何冊かやったが,結局何かを作るに至らなかった.

多くの本は,ツールとしての特性や単純な使い方は知れるが,応用は難しい.

 

また,プログラミング言語まわりは環境がどんどんアップデートされる.

本の情報では,情報と自分の状況に時差が生じて,余計混乱してしまう.

メリットは,体系的に基礎知識を入れられることくらいだと思う.

 

2つ目の理由は,

実際に人がコードを作る画面の様子,つまり現場の感覚が実感できることだ.

プログラミングが道具である以上,使い方は現場で知るのが一番早い.

しかし,現実環境で現場がないから困っている.そこでUdemyだ.

 

さらに,Udemyの講座はオンライン上で製作者と直接やりとりできたりする.

バージョンの変化なども,講座内容に対応して注意事項を教えてくれるので余計な混乱が少ない.

 

3つ目が最も単純な理由である.

絶対に1つのものを作ることができるからだ.

必要な根気の程度は,コースのコンテンツ量を見ればだいたいわかる.

あとは,自分が興味あるものを選ぶだけだ.

 

僕は現在Udemyで,PythonフレームワークであるDjangoを使ってWebサイトを作るコースを受講している.おすすめなのでリンクを貼っておくが,使用言語が英語なので注意してほしい.

https://www.udemy.com/share/1001NsBEEZdlpSQHw=/

 

ちなみにこの記事は,もともとこのコースでの操作の備忘録を作るつもりで書き始めた.いつもの悪い癖で,始める経緯まで入ってしまったので,結局こんな感じで一旦締める.

 

備忘録は,ぼちぼちまとめていく.

*1:正確には先送り.まだ諦めていない.

線形代数のおいしいところをおさらいする

 人工知能の流行で,線形代数を勉強する人が増えてきた.

人工知能の流行で,線形代数を勉強する人が増えている.

僕自身,数年前に学んだだけなので忘れている部分も多いが,

現在数学系専攻ということで少し復習をした.

 

実装面の有益な情報や,正確な一見小難しそうな内容はたくさんの優秀な方々が

本やネット上に公開されている.

 

そこで僕は線形代数の工学応用に関して,基本で一番大事だと思う内容を

噛み砕いて簡単に,ここにおさらいしておこうと思う.

 

 

線形代数の基本,行列とは何か

行列とは数の要素を,行と列の 2 次元に配列したものである.

\begin{align} A= \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{pmatrix} \end{align}

 

要素の横の並びを行,縦の並びを列という.

上の行列Aの要素の添字は,1つ目が行番号,2つ目が列番号を表している.


行列は線型空間において写像を表す.

工学的には行列はシステムだと考えれば良い.

行と列はそれぞれ

  • 列数(横幅):「入力」の次元数
  • 行数(縦幅):「出力」の次元数

を表している.

 

つまり,

{\displaystyle n \times m}行列は,{\displaystyle n}次元空間(入力)を{\displaystyle m}次元空間(出力)に移す写像である.

と言える.

 

ちなみに,線型空間というのも本当は定義すべきだが,してもややこしい.

よってここでは,ベクトルの当たり前の計算ができる非常に空間だと思って欲しい.

 

行列と固有値

行列を考える際に,セットで考えられるのは固有ベクトル固有値だ.

この2つは名前の通り,行列の固有な,本質的な量だと言える.

行列にとっての,名前やIDのようなものだと考えてもいいかもしれない.

 

少し真面目に,数学的な説明を書いてみようと思う.

 

ある正方行列{\displaystyle A}{\displaystyle \vec{0}}でないベクトル{\displaystyle \vec{x}},あるスカラー{\displaystyle \lambda}の間に

\begin{align}
A \vec{x} =\lambda \vec{x}
\end{align}

が成り立つとき,{\displaystyle \vec{x}}固有ベクトル{\displaystyle \lambda}固有値という.

また,このような関係式を固有値問題と呼ぶ.

 

固有ベクトルは線形変換,つまり行列を用いた変換によって向きが変わらないベクトル

である.

 

ベクトルは「長さ」と「方向」を持つが,変わらないのは「方向」だけで良い.

長さは変わってもいい.

 

では,変わる「長さ」を指定するのはなにか.

それが固有値である.

つまり,

固有値は,線形変換によって変化する固有ベクトルの長さの倍率を表す数値

といえる.

 

固有ベクトルは,固有値に対応して計算される.

そのあたりの計算は次のページが見やすいので参考記事として貼っておく.

atarimae.biz

 

なんとなく,行列にとって固有だ,というのがわかったのではないだろうか.

 

行列の相似変形

行列には,固有ベクトル固有値が関わることを見た.

次は固有値が一致するような行列は,どんなものか見ようと思う.

 

行列{\displaystyle A}と同サイズの正方行列{\displaystyle S}を導入する.

ある行列{\displaystyle B}

\begin{align}
B=S^{-1}AS
\end{align}

をみたすとき,行列{\displaystyle A}{\displaystyle B}は相似であるという.

 

この相似な行列同士は,全く同じ固有値を持つ.

したがって,

この2つの行列はシステムとしての本質が変化していない事になる.

 

この事実が,僕の思う線形代数のおいしいところの重要ポイントになる.

 

行列の対角化とその工学的意味

ここが最も重要な部分だ.

先ほどの相似変形を思い出して欲しい.

 

正方行列{\displaystyle S}は,特に形を指定していなかった.

ならば,正方行列をうまく選べば,{\displaystyle A}と同じ固有値を持った

もっとシンプルな行列ができるかもしれない.

 

このアイデアについて詳しくみていこう.

 

まず,シンプルな形というのは対角行列のことだ.

対角行列とは

\begin{pmatrix}
a_1 & 0 & \cdots & 0 \\
0 & a_2 & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & a_n
\end{pmatrix}

こんな形の行列のことをいう.

 

次に,行列{\displaystyle A}をについて,正則行列{\displaystyle P}({\displaystyle P^{-1}}が存在するような行列)をうまく選び,

{\displaystyle P^{-1}AP}を対角行列にすることを行列の対角化という.

\begin{align}
A=
\begin{pmatrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nn}
\end{pmatrix}
\Longrightarrow
P^{-1}AP=
\begin{pmatrix}
a_1 & 0 & \cdots & 0 \\
0 & a_2 & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & a_n
\end{pmatrix}
\end{align}

 

この変形が,工学的においしいところになる.

行列{\displaystyle A}は対角成分以外にも,成分を持つ.

したがって,なにか入力が来た場合,全ての入力が全ての出力に影響する.

 

しかし,対角化された行列の場合,

入力の各成分は,それぞれに対応した出力成分にしか影響しない.

 

そして,先ほど述べたように相似変換された行列は,本質が同じである.

 

つまり,行列の対角化は,

複雑なシステム(行列)を,単純な複数のサブシステムに分ける操作

ということができる.

 

ここまで説明したが,やはり言葉は限度があるので,図を用意した.

下の図が,伝えたい内容の全てである.

f:id:maikocho:20181110234423p:plain

 

対角化によって,すっごくシンプルになっていることが一目瞭然だ.

 

まとめ

線形代数の面白いなと初めに思ったところがここだったので,

基礎的な内容も踏まえておさらいしてみた.

 

固有値計算の世界は,やり始めると鬱になるらしい.

シンプルなようで,応用まで考えると奥深く,僕もまだ全然応用はできない.

でも,最後の図は何か面白いな,と思う.

 

研究分野が固有値計算周りに近いが,

周辺の理論ばかりで実際に応用しようとしたことはまだない.

いつかしたいなぁ.