ばびぞうブログ

統計モデリング・機械学習・Python・R・Django・PostgreSQLに関してはなにもわかりません

BLUE DAYS

概要

どの本のどこに何の統計モデルの説明があるのか忘れてしまうのでindexとして整理。

みどり本(こちら

3章
6章
  • テーマ
    ロジスティック回帰
     log(\dfrac{q_i}{1-q_i})=\beta_1+\beta_2 x_i
  • 推定方法
     \beta_1 \beta_2最尤推定
7章
  • テーマ
    6章のロジスティック回帰で固定効果とランダム効果(個体差) を表現  log(\dfrac{q_i}{1-q_i})=\beta_1+\beta_2 x_i+r_i
     r_i \sim N(0, s)
  • 推定方法
     \beta_1 \beta_2 s最尤推定
9章
10章
  • テーマ
    7章のGLMMを階層モデル化
     log(\dfrac{q_i}{1-q_i})=\beta_1+\beta_2 x_i+r_i
     r_i \sim N(0, s)
  • 推定方法
     \beta_1 \beta_2 sベイズ推定
     \beta_1 \beta_2の事前分布:無情報事前分布、 sの事前分布:0~10000の連続一様分布)

ヒル本(こちら

Chapter5 - 5.1 重回帰
  • テーマ
    重回帰
     Y_i=b_1+b_2 A_i+b_3 Score_i+\epsilon_i
     \epsilon_i \sim N(0, \sigma)
  • 推定方法
     b_1 b_2 b_3 \sigmaベイズ推定(事前分布:無情報事前分布)
Chapter5 - 5.3 ロジスティック回帰
  • テーマ
    ロジスティック回帰
     Y_i \sim Bernoulli(q_i)
     q_i=inverselogit(b_1+b_2 A_i+b_3 Score_i+b_4 Weather_i)

    ちなみに、
    ロジット関数は
     logit(p)=log(\dfrac{p}{1-p})
    ロジット関数の逆関数であるロジスティック関数(=シグモイド関数)は
     logistic(z)=\dfrac{1}{1+\exp(-z)}

    これを用いて式変換した「みどり本 6章」の式の方がスッキリしている気がするが、stanではlogistic関数はinv_logitメソッドとして用意されているため、「アヒル本」はstanでの表記形式に寄せてinverselogitの表記にしているっぽい。

  • 推定方法
     b_1 b_2 b_3 b_4ベイズ推定(事前分布:無情報事前分布)

Chapter5 - 5.4 ポアソン回帰
  • テーマ
    ポアソン回帰
     M_i \sim Poisson(\lambda_i)
     \lambda_i=\exp(b_1+b_2 A_i+b_3 Score_i)
  • 推定方法
     b_1 b_2 b_3ベイズ推定(事前分布:無情報事前分布)
Chapter5 - 8.1 階層モデルの導入
  • テーマ
    階層ベイズモデル
     Y_i \sim N(a_k+b_k X_i, \sigma_Y)
     a_k=a _ {全体平均}+a _ {会社差\ k}
     b_k=b _ {全体平均}+b _ {会社差\ k}
     a _ {会社差\ k} \sim N(0, \sigma_a)
     b _ {会社差\ k} \sim N(0, \sigma_b)

    下記の表記も上記と等価
     Y_i \sim N(a_k+b_k X_i, \sigma_Y)
     a_k \sim N(a _ {全体平均}, \sigma_a)
     b_k \sim N(b _ {全体平均}, \sigma_b)

  • 推定方法
     a _ {全体平均} b _ {全体平均} a _ {会社差\ k} b _ {会社差\ k} \sigma_a \sigma_bベイズ推定(事前分布:無情報事前分布)

Chapter5 - 8.2 複数の階層を持つ階層モデル
  • テーマ
    複数の階層を持つ階層ベイズモデル
    •  a bの会社差でのばらつきは、全ての業界で共通」と仮定した場合
       Y_i \sim N(a_k+b_k X_i, \sigma_Y)
       a_k \sim N(a _ {業界平均\ g}, \sigma_a)
       b_k \sim N(b _ {業界平均\ g}, \sigma_b)
       a _ {業界平均\ g} \sim N(a _ {全体平均}, \sigma _ {ag})
       b _ {業界平均\ g} \sim N(b _ {全体平均}, \sigma _ {bg})
    •  a bの会社差でのばらつきは、業界によって異なる」と仮定した場合
       Y_i \sim N(a_k+b_k X_i, \sigma _ {Yg})
       a_k \sim N(a _ {業界平均\ g}, \sigma _ {ag})
       b_k \sim N(b _ {業界平均\ g}, \sigma _ {bg})
       a _ {業界平均\ g} \sim N(a _ {全体平均}, \sigma _ {ag})
       b _ {業界平均\ g} \sim N(b _ {全体平均}, \sigma _ {bg})
  • 推定方法
    Chapter5 - 8.1と同様(書くのが面倒になった & ここまできたら見ればわかる)
Chapter5 - 8.4 ロジスティック回帰の階層モデル
  • テーマ
    ロジスティック回帰の階層モデル
     Y_i \sim Bernoulli(q_i)
     q_i=inverselogit(x_i)
     x_i=b_1+b_2 A_i+b_3 Score_i+b _ {学生差\ n}+b _ {科目差\ c}+b_4 Weather_i
     b _ {学生差\ n} \sim N(0, \sigma _ {p})
     b _ {科目差\ c} \sim N(0, \sigma _ {c})
  • 推定方法
    Chapter5 - 8.1と同様(書くのが面倒になった & ここまできたら見ればわかる)

ref

余談だが、texの添字表記がうまくいかないことがあり、こちらに非常に助けられた。

タイトル回収

youtu.be

KNNのoutputについて

概要

KNNのoutputの理解に少し時間がかかったので書いておく。KNNの理論説明はなし。

とりあえずKNNやる

from sklearn.neighbors import NearestNeighbors

x = np.array([[0,0],[0,1],[2,2],[3,3]])

knn = NearestNeighbors(n_neighbors=3)
knn.fit(x)
distances, indices  = knn.kneighbors(x)

print(distances)
print(indices)

出力は

[[0.         1.         2.82842712]
 [0.         1.         2.23606798]
 [0.         1.41421356 2.23606798]
 [0.         1.41421356 3.60555128]]

[[0 1 2]
 [1 0 2]
 [2 3 1]
 [3 2 1]]

となる。

outputの理解

まず、inputのxをxy座標の4点だと考えて、[0,0]が点0、[0,1]が点1、[2,2]が点2、[3,3]が点3とすると以下のイメージになる。 で、outputはn_neighbors=3にしたから各点から近い3点(自分自身を含む)になっている。 indices[0 1 2]は「点0に近い順が点0、点1、点2」の意味。上の図を見てもその通りである。同様に[1 0 2]は点1、[2 3 1]は点2、[3 2 1]は点3に近い順になっている。 indicesのshapeは(4, 3)だが、(点の数, n_neighbors)になっている。 distancesはいうまでもなく、indicesを距離で表しただけ。shapeも同じ。自分自身の点を含むので、0列目は必ず0(距離が0)になる。

PostgreSQLコマンド覚書

 

環境:mac(Big Sur), psql 13.2

前提:sample.csvという仮のcsvがある想定

 

DB作成・削除

$ createdb sampledb
$ dropdb sampledb

DBと接続

$ psql sampledb
入るとターミナルのコマンドを入力する先頭の部分が$からsampledb=#に変わる

テーブル作成・削除

SQLのCREATE TABLE文でテーブル作成
sampledb=# drop table sampletable;

DB一覧

sampledb=# \l

テーブル一覧

sampledb=# \z

他のDBと接続

sampledb=# \c DB名

カレントディレクトリの確認

sampledb=# \! pwd

csvファイルをテーブルにインポート

sampledb=# \copy テーブル名 from './data.csv' with csv header
headerがないcsvならheaderコマンドを削除すればok
任意の列だけインポートしたいならテーブル名(col1,col2,...)

SQLファイルを実行

sampledb=# \i ./sample.sql
ファイルの実行時間を計測したいなら
sampledb=# \timing \i ./sample.sql

感想

別の書き方があったり、コマンドの意味の認識間違いがある希ガス

PostgreSQLでDB作成し、csvファイルをインポート

 

環境:mac(Big Sur), psql 13.2

前提:sample.csvという仮のcsvがある想定

 

DB作成

sampledbというDB作成
$ createdb sampledb

DBの中に入る
$ psql postgres
postgres=# \c sampledb

テーブル作成

一応1つもテーブルがないことを確認
sampledb=# \z

空のsampletableというテーブルを作成しておく
ただ、列数と各列の型を定義しておいたほうが良さそうだから仮に9列のテーブルを定義しておく
CREATE TABLE sampletable (col1 INTEGER, col2 INTEGER, col3 INTEGER, col4 char(50), col5 char(50), col6 char(50), col7 char(50), col8 char(50) NOT NULL, col9 INTEGER, PRIMARY KEY (col1));

ちなみにテーブルの削除は以下
drop table sampletable;

csvファイルをインポート

sample.csvをsampledbへ入れてみる(headerあり)
sampledb=# \copy sampletable from './sample.csv' with csv header

上から5行だけターミナル上に表示させる
sampledb=# SELECT * FROM sampletable LIMIT 5;

感想

2回連続でPostgreSQLのちょっとしたコマンドについて書き殴ってしまったから、次回はまとめたい

PostgreSQL 基本コマンド

 

環境:mac(Big Sur), psql 13.2

前提:データベース(PostgreSQL)になにかしらデータが入っている。今回はhogehogeデータベース内にhogeテーブルがある想定。

 

とりあえず、psqlに入って任意のデータベースにアクセス

中に入る
$ psql postgres

データベースの一覧を見る
postgres=# \l

roleを確認
postgres=# \du

hogehogeというデータベースに接続
postgres=# \c hogehoge

テーブルの一覧を見る(テーブルはpandasのDataFrameみたいな認識をしている)
hogehoge=# \z

実際にデータベース内の任意のテーブルをSQLで操作してみる

hogeというテーブルの上から5行を見る。
hogehoge=# SELECT * FROM hoge LIMIT 5;

カレントディレクトリの確認
hogehoge=# \! pwd

試しに上記のSQLコマンドをsample.sqlとして保存して、sample.sqlを実行。
とりあえず、カレントディレクトリから相対パスでパスを記述。
hogehoge=# \i ./Downloads/sample.sql

感想

殴り書きでした

Djangoのいつものやつ

個人的なメモ。 

とりあえず、動くところまでの流れ。

 

mkdir test
cd test
python3 -m venv env
source env/bin/activate
python -m pip install --upgrade pip
touch requirements.txt
open requirements.txt
   Django~=2.2.4
pip install -r requirements.txt
django-admin startproject mysite .
settings.pyを書き換え

    TIME_ZONE = 'Asia/Tokyo'

    LANGUAGE_CODE = 'ja'、STATIC_ROOT = os.path.join(BASE_DIR, 'static')

    ALLOWED_HOSTS = ['127.0.0.1']


python manage.py migrate
python manage.py runserver

pip install pandas
pip install django-bootstrap4
pip install django-filter
pip install django-crispy-forms
pip install social-auth-app-django


python manage.py startapp invest
python manage.py createsuperuser
各ファイル書き換え
python manage.py makemigrations invest
python manage.py migrate invest