irisuinwl’s diary

サークル不思議(略)入巣次元の、数学や技術的なことを書きます。

matrix the coding(行列プログラマー) 4章を読んだ

はじめに

最近、会社のゼミで行列プログラマーを読んでおり、4章を読了したので、感想を記事にする。

行列プログラマーとは、オライリーから出ている線形代数を学びつつpythonでコーディングする本である。

www.oreilly.co.jp

www.amazon.co.jp

書いたコード

4章の演習問題を部分的に問いた。

colab.research.google.com

所感

  • 良い点:

オライリーから出ている本だからコーディングを中心にしているかと思いきや、数学理論の説明が多くて驚いた。
また、応用数学の本として行列を使った興味深い例を挙げていて非常に応用系の本としても面白い。
たとえば、符号理論におけるハミングコードや、ライツアウト、画像変換、グラフの隣接行列と、ユークリッド幾何の合同変換群を行列で表現など、
コンピューターグラフィック、アルゴリズム情報理論に応用できる事例が多くて非常に良いと感じた。

また、演習問題が素晴らしい。
例えば、4章の問題18は行列の積によって、データ間の内積(正規化してないコサイン類似度)によって表現し、
行列を応用することで、簡易なレコメンドアルゴリズムフルスクラッチで実装する。これは本当に良い問題だと思う。

  • 個人的には微妙な点:

本書特有の行列・ベクトルクラスを作成するケースが多い。
確かにpythonの初心者やB1,B2の学生であれば、数値計算クラスの実装として良い問題だと感じる。
しかし、pythonを実務で使っているエンジニアやデータサイエンティストにとって、ライブラリとして既にnumpyや、scipyなど科学計算ライブラリがあるため、
あまり重要に感じない(もちろん大切だと思うが、そういうのって何回も自作した覚えがあって、今更やるのも辛みがすごい…)。

なので、この本の使い方として、個人的には、数値計算ライブラリを自作する部分は、numpy, scipyで対応する箇所を提示、存在しない場合は自作というスタンスが良いように感じる。

4章について

4章は行列についての章である。
以下を学ぶ

  • 行列とは何かから始まり
  • 行列の積、線形写像(本書では線形関数と書いてる)の性質
  • 行列と線形写像(行列の積のモノイドと線形写像の合成の圏が、表現行列を求めることによって関手となり、可逆となること)
  • kernelと線形写像,
  • 逆行列

一番驚いたのは応用数学の本ならば行列のみをやるかと思いきや、線形写像にも言及しており、
さらに、線形写像と行列の本質である同型性、逆行列を行列の線形写像における逆写像の行列と定めていたこと。

なので、逆行列を正方行列だけでなく一般の列数行数についても定めており、正方行列における AB=Eであれば BA=Eとなるが、 一般の矩形行列において、 AB=Eだが BA=Eとならない例もあげている。

また、演習問題4.17.18がマジで素晴らしく、実際にデータを読み込んで、レコメンドエンジン的なものを作るという非常に応用に富んだ例となっていた。

memo: sphinxの調査

なにこれ

sphinxを構築する機会があったので、改めてsphinxを調査した。

sphinxってなに:

ドキュメント生成ツール

どんな事例がある?

www.sphinx-doc.org

github.com

  • elasticsearch-py

elasticsearch-py.readthedocs.io

github.com

docs.python.org

github.com

テーマの設定

デフォルトだとクソダサいので、デザインを変えたい

www.sphinx-doc.org

「世界標準の経営理論」が良い

はじめに

めっちゃ売れてる「世界標準の経営理論」を購入しました。

自分も社会人の端くれ、企業に所属している以上はビジネス書などはつまみ食いします。(ドラッカーコトラー、大学4年間の○○が10時間でわかるシリーズなど)

自分は、売れているビジネス書というと、分かりやすいように書かれている反面、耳障りのいい言葉を言っていて内容が浅いのでは? という勝手に思っており、敬遠している逆張りのオタクなんですが、この本はとても面白いです。

ひとまず経済学ディシプリン経営理論(経済学分野から派生した経営理論)の2部までよみました。

この記事では、自分がこの本は面白いと判断した、序章について語りたいと思います。

続きを読む

wsl2を入れてdockerをインストールする

はじめに

ドライバの関係でOSの更新ができなかったのですが、ついにwindows 10 version 2004にしました。

そのため、Windows Subsystem for Linux 2(WSL2)を入れて、dockerをインストールしたいと思います。

WSL2のインストール

主な手順は以下をそのままやれば良かったです。

docs.microsoft.com

ただ、途中で以下のようなエラーが出ました

> wsl --set-default-version 2
Error: 0x1bc

これは、msのgithubにもissue があり、以下の方法でwsl2 kernelをupdateすればよかったです。

docs.microsoft.com

そして、手順通り、windows storeからubuntuのイメージを手に入れれば完了です。

dockerのインストール

これもめちゃくちゃ簡単で、docker desktopをインストールするだけです。

docs.docker.com

そうすれば、powershellから普通にアクセスできます。

おわり

InceptionV3をfine-tuningしてクリクリ画像分類器を作り、streamlitでwebアプリを作る

題名の通り。 streamlitとkerasで遊んだ。

動画デモ:

環境情報

  • 機械学習モデル作成環境: google colaboratory
  • web app環境: windows 10+anaconda 

InceptionV3をファインチューニングする

下記google colabにて実施。

colab.research.google.com

streamlitでwebアプリを作る

下記githubにコードを格納

github.com

  • WIP: deployしたり、精度あげたり

詰まったところ:

anacondaでconda install tensorflow-gpu kerasすると、tf 2.1.0がインストールされるが、windows環境ではAttributeError: ‘_thread._local’ object has no attribute 'value’というエラーが出る。

実際、下記のissueでも議論されている。

discuss.streamlit.io

github.com

ググると、「tf 1.xに下げろ」という方法が散見されるが、google colabのtfは2.x系なので抵抗がある、また、やっても失敗したので下記のように対応した。

  • AttributeError: ‘_thread._local’ object has no attribute 'value’の対処は下記を追加
import keras.backend.tensorflow_backend as tb

tb._SYMBOLIC_SCOPE.value = True
st.set_option('deprecation.showfileUploaderEncoding', False)
  • さらにValueError: Cannot create an execution function which is comprised of elements from multiple graphs.というエラーが出るが、

これはkerasからインポートしているモデル構築モジュールをtensorflow.kerasにして対処。

InceptionV3の場合は下記のようにimport文を変更して対処した。

from tensorflow.keras.applications.inception_v3 import InceptionV3
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras import backend as K
from tensorflow.keras.optimizers import SGD

イベント発火時(画像をアップロードしたりチェックボックス操作時など)にstreamlitのコードは再実行される。

そのため、機械学習モデルの再構築を再読み込みが行われて時間がかかる。

これはstreamlitのyoloを使った物体認識webアプリのチュートリアル に、機械学習モデル読み込み時にcacheを使って対処している。

@st.cache(allow_output_mutation=True)
def load_inception_v3(weight_path: str):
    """
    指定パスからパラメータ重みを読込、InceptionV3をfine-tuningしたモデルをloadする。
    """

    ...

    model.load_weights(weight_path)

    return model

参考記事

qiita.com

qiita.com

docs.streamlit.io

aidiary.hatenablog.com

~しょばふぇすで遊ぶデータ分析~ ソシャゲのガチャスクショを画像処理してアイテム出現確率を推定した

タイトルの通り

 

最近ショバフェスにハマっております。

スクショを取りまくっていたのですが、これでなんか遊べないかなと思って、ガチャイベ(いっぱいガチャを回してゲームの便利なアイテムを取得するイベント)でガチャからアイテムが出る確率を推定してみました。(Computer Visionの勉強もしているので、それでもなんかやりたかった)

 

一段落付いたのでcolabに纏めて公開しようと思います。

※画像は引用という形で加工して一部分しか出してませんが、著作権的に問題があったら消します。

 

colab.research.google.com

 

具体的にやったことは以下です。

1. ガチャスクショ画像からガチャアイテム画像の抽出(crop)

2. アイテム画像をヒストグラムで特徴化し、類似度でクラスタリングして特徴空間がどんなものかみる

3. kNNが有効そうだと仮説を立てて、データをラベリングし、kNNで交差検証し、ちゃんと判定できることを確認(まあ、固定画像なんだからそらそうかって感じだけど)

4. 今まで貯めたスクショ画像について3. で作ったモデルを用いてラベリング→確率モデリングをして、確率の推定を行う。

 

想定知識は以下です。

メモ(ベルヌーイ分布、二項分布、カテゴリー分布、多項分布)

良くBernoulli, Binomial, Categorical, Multinomialがごっちゃになって、推定量とかってそれぞれどう関係あるんだっけ? ってなるのでメモしておく

結局はカテゴリ分布も多項分布も最尤推定はそのカテゴリが出た数を全体サンプル数で割れば良いという話であった。

 

ベルヌーイ分布のMLE

http://www-ikn.ist.hokudai.ac.jp/~yasuhiro-suzu/Bernoulli%20Distributin.pdf

 

分布パラメーターの推定(BinomialのMLEが載ってる)

http://lbm.ab.a.u-tokyo.ac.jp/~omori/meiji2/sec5/sec5.html

 

多項分布のMLEとMAP estimation

http://sleepyheads.jp/docs/multinomial_dist.pdf

 

multinomial, categoricalの違い

https://r9y9.github.io/blog/2013/07/31/multinomial-categorical-diff/

 

Bernoulli distribution(enwiki)

https://en.wikipedia.org/wiki/Bernoulli_distribution

 

Categorical distribution(enwiki)

https://en.wikipedia.org/wiki/Categorical_distribution