とある大学生の勉強メモ

Python, C#, UWP, WPF, 心理実験関連の開発備忘録

ベイジアン意志決定モデルに関して Bayesian Decision Models

せっかくベイジアンの(意志)決定モデルに関してお勉強したので,ブログで残しておきます.
内容を文章でまとめると,”被験者の意志決定をベイズ則を用いてモデル化することで,統計よりも解析で言えることが明確だよ”ということだと思う.
勉強したのは↓↓
www.sciencedirect.com
事前知識として,事前確率,事後確率,ベイズ則など分かっていると良いと思います.
本エントリを読破後,きっとベイジアンのビギナーになれると思います,知らんけど.

4つのステップ

本稿で説明するベイジアン決定モデルを用いた解析では,4つのステップを踏めばよいとのこと.
4つです.それぞれ順を追ってみていきましょう.
ここではまずおおまかな概要を述べ,後から具体的な実験で,実際に4つのステップを踏んでいこう思います.

Step 1 : Generative Model(モデルを作ろう)

何はともあれ,モデルを作りましょう.
実験環境sに対して,被験者の意志決定xとし,p(x|s)の分布を考えます.
p(x|s)というのは,何かの実験コンテクストsに対して,xが観測される分布のことです.

Step 2 : Inference (ベイズ則を用いるぞい)

ベイジアンモデルで重要なことは,被験者(意志決定者)がp(x|s)を学習していき,更新するということです.
そこで,本実験前に既に定まった結果を持つx_{trial}を被験者に与えましょう.
ベイズ則より,
    p(s|x_{trial}) = \frac{p(x_{trial}|s)*p(s)}{p(x_{trial})}
上式に於いて,
p(s):事前確率(意志決定者の信念に依存)
p(x_{trial}|s):尤度関数(sが与えられた時のx_{trial}の尤もらしさ)
p(s|x_{trial}):sの事前分布
p(x_{trial}):事前に決められた定数

Step 3: Taking an Action (実際にやってみた)

実際に実験を行い,その反応を見ることです.
アクションaはコスト関数C(s,a)で定義されます.
コスト関数の期待値は,
E(C(a)) = \sum_{s} p(s|x_{trial})*C(s,a)
このコストを最小化するように,被験者意志決定をします.
(コストの期待値は,全ての環境sにおける,それぞれのコストと確率の乗算の合計)
(コストっていうのは,例えば反応速度の実験なら,時間などになるかと思います.)

Step 4 : Response(アクションをそれぞれの結果に適用)

事前分布と事後計算により,ベイジアンモデルが完成しました.
最後の段階として,モデル作成者(解析側)は,それをもう一度チェックし直しましょう.
それからベイジアンモデルでのパラメータ(感覚ノイズ,経過率,誤った信念パラメータ)などを決定します.

実際にトレーニン

4つのステップはなんとなく分かったけど,実際の実験でどのように使えばよいか,正直分かりません.
ということで,実際に実験を考えてみて,どのようにベイジアンモデルを適用するか見ていきましょう.

実験(音源位置の推定)

変数の次元が分かりやすいように単位をつけて説明します.
ある線上に音源を設置し,その点から広がる音を観測して,音源がライン上のどこにあるのかを推定させるという実験を行う.

Step1 モデル生成

ライン上のs[cm]のところに,音源を設置する.音源は各試行ごとにランダムに設置されるp(s)
(ランダムというのは厄介な代物で,本当にランダムなのかは評価しづらいですが,とりまランダムと使わせて頂きます.)
どこに音源が設置されるのかという分布p(s)は,平均μ標準偏差σ_{s}ガウス分布になるので,

  p(s) = \displaystyle \frac{1}{\sqrt{2πσ^{2}_{s}}}exp(-\frac{(s-μ)^{2}}{\sqrt{2σ^{2}_{s}}})

これに対して,被験者がライン上のどこにあるのかx[cm]を回答します.
s[cm]という実験環境に対して,どこにあるのかと回答する分布がp(x|s)です.
ここで,音にはどうしても周辺音のノイズが入ってしまいます.この環境ノイズをσとすると,

  p(s) = \displaystyle \frac{1}{\sqrt{2πσ^{2}}}exp(-\frac{(x-s)^{2}}{\sqrt{2σ^{2}}})

これを図1A.Bに示します.
f:id:amakazeryu:20191115113610p:plain

Step2 推論

x_{trial}で学習すると,次の刺激の際に,どこで鳴っているのか?ということを予想することができる(事前分布p(s) )
このp(s) は生成モデルとは異なり,被験者の意志が反映されているわけです.
x_{trial}に基づいたL(s)は尤度関数です.sの関数であることに注意しましょう.

f:id:amakazeryu:20191202170011p:plain

事後分布はp(s|x_{trial})であり,ベイズ則より

p(s|x_{trial}) ∝  p(x_{trial}|s)*p(s) = L(s)*p(s)

比例記号を用いられるのは,1/p(x_{trial})が定数になるからです.
上式は未知刺激sの取り得る値の確率を表している.
事後分布は,事前分布に尤度関数を乗算することで求められる.

次の記事で,実際にモデルを適用させ,最後に評価するという所まで行きたいと思います.
今回は一旦ここまで,お疲れ様でした.

セーリング記事まとめ 

一度セーリング関係の記事を俯瞰してまとめようと思って,この記事を書きます.

1:学生セーラーのコース要素,考える順番 - とある大学生の勉強メモ

お勧め度:★★★★

難しさ:★

ごちゃごちゃとコース理論を述べているんですが,結局まず最初に考えなくてはいけない2つの重要事項を書きました. コース何もわかりません,という人はまず読んだ方が良い記事だと思います.

2:セーリングのコース理論(海風) - とある大学生の勉強メモ

お勧め度:★★★★★

難しさ:★★★★

安定した風で,一体何を考えるのか? ブロー以外の要素について三角関数を用いて考察しました. エンドに出す,とは実際にどこまでが危険なエンドなのか? リフトでタックをするかしないか,何秒走るならタック有利なのか? フリート全体の風のシフトを統計的に処理し,反対海面に対してポテンシャルの期待値を最大化するにどうすればよいのか?

3:セーリングのコース理論(北風) その一 - とある大学生の勉強メモ

お勧め度:★★

難しさ:★★★★★

軽風でシフティなコンディションでも,トップセーラーは順位を安定させる.──なぜか? 彼らはブローの中でタックしている.ただし,ブローだからといって入ってすぐタックすればいいわけではない. もしくは,先行艇のバウとクルーの姿勢を見よう.先行艇は風見だ.ブローを見る目など必要ない.

4:470の走らせ方 理論と実践 - とある大学生の勉強メモ

お勧め度:★★★★

難しさ:★★

故増山氏に敬意を表さなくてはいけない.470を走らせる方法は,ほとんどこの本に記述されている. あとはそれを実践し,練習をし,あとはチューニングを試していくことこそ,ボートスピードを上げる王道だ. 全部読むのは,物理を知らないとしんどいかもしれない.ですので,プレイヤーがわかるような言葉にどうにか翻訳した記事.

5:セーリングの上マークレイライン理論 - とある大学生の勉強メモ

お勧め度:★★★★

難しさ:★★★★

スマホでレーストラックを見ると,大艇団のレースでは,上マークアプローチで一気に順位を落とす艇が少なくない. 彼らの悩みはこうだ,「タックして寄せるか,それともオーバーセール気味にするか?」 上マークアプローチの時に,どのようにアプローチすればよいか,そのヒントがあると思う.

6:470のパンピングについて - とある大学生の勉強メモ

お勧め度:★

難しさ:★

ランニングは波に乗せましょう,どう乗せるんでしょう.乗艇者の立場として書いた記事.

学生セーラーのコース要素,考える順番

昨日,僕の母校が470,スナイプ共に全国に羽ばたきました.めちゃ嬉しい,ということでコースブログを更新しようかと.
最近はセーリングのトレーニングシステムの構築をやっており,初心者が危険なコンディションの日でも,安全に陸でシミュレーショントレーニングできる方法を模索しています.

さて本題.本記事はコースについて考えているけど,色々要素があって結局海の上で何を重視すればいいかわかんない!という軸がない人向けです.ヨットのコースに関しては多くのトップセーラーが色々言ったり,先輩が色々言ったり,で結局何を考えればいいか分かんなくなる時が多いです.今回は当たり前のことから詰めていきましょう.

上から順番に意識していくと良いと思います.

1.ボートスピードが出せる場所=フレッシュウインド

何はともあれ,まず自艇が帆走練習中のボートスピードを出せるかどうか,これが最も大事です..ノンストレスでフレッシュを走る場所を確保する事が最重要項目です.ブローとか風の振れとかいう前に,まずこの基本を抑えましょう.

2.リフト

まずフレッシュを走れたら,次はリフトを走っているかどうか確認しましょう.微風でリフトもヘダーもよく分からんコンディション以外,基本的にリフトを走り続けてください.5度のリフトの場合,タック一回の損失を5mとしても,タックをして走れば15秒でお釣りがくる計算です.逆にリフトを走らないのであれば,他の理由が必要です(目の前に爆弾ブロー,コースを参考できるトップセイラーがそちらにいる,フレッシュを得るためなど).

 

1,2を確認した者のみ,次の3を考えていきます.ただ,1,2を抑えるだけで十分コースはできていると思って良いと思います.それだけで,ヘルムスはとても楽になるはず.コースで差をつけるなら,次の項も参考にしていきましょう.

3.先行艇

ブローなんて見えません.僕も正直同じ思いです.けど,先行艇のバウの向きやクルーがトラピーズに出ているかどうかぐらいなら,目で分かります.ということで,先行艇は風見と思いましょう.2クラスの学生ヨットの場合,スナイプよりも470が先にスタートするので,風見いっぱいになって楽ですね.先行艇がいない時,それはあなたが前を走っている時です.カバーしましょう.

 

レース中に考えるコース要素はこれだけで十分だと思っています.地形ごとに左右どちらの海面が有利なのか,(見えていると思っている)ブローがどちらの海面に分布しているか,それはレース前に確認する事です.統計にしろ,神話にしろ,おおまかにどちらに行くのかは,スタート前に決めておきましょう.

ヨットレースのコツはレース中での思考量を減らす事だと思います.おそらくどのスポーツでも言えることだと思います.暇が出来たら,ひたすらボートスピードに集中しましょう.マーク際で乱戦になったり,ケースなど大抵パニックになる要素ばかりなので,その時に脳死してコースが引けるように考える事を減らすことを強く推奨します.

本日は以上です,お疲れ様でした.

PythonでCSVファイルからシャピロウィルク検定

CSVファイルを読み込んで,シャピロウィルク検定するところまでのメモ書き PythonCSVにappendすると, f:id:amakazeryu:20190905111029p:plain という風に一行に並んでしまったので,データの形を変えてnumpyの配列に入れました.

import numpy as np 
import csv
import matplotlib.pyplot as plt
import scipy.stats as stats

f = open("name.csv", "r")#nameというcsvを開く
csv_data = csv.reader(f)
data = [ e for e in csv_data]
f.close()

x= np.zeros(0)
for i in range(50):
    x = np.append(x,float(data[0][i]))#データの形を変更してるところ

print(stats.shapiro(x))#シャピロウィルク検定 (W,p)で出力
plt.hist(a, bins=20)#ヒストグラム
stats.probplot(a, dist="norm",plot=plt)

Pythonで音声ファイルを任意に再生・停止させる

 Pythonでwavファイルを再生しようとする場合、pyaduioを使って以下のようなコードで再生すると思います。

#file name is open.py

import wave
import pyaudio

#開きたいWavファイルを引数
def openWave(name):
    #開きたいファイルをここに
    wf = wave.open(name, "r")

    # ストリームを開く
    p = pyaudio.PyAudio()
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # チャンク単位でストリームに出力し音声を再生
    chunk = 1024
    data = wf.readframes(chunk)
    while data != b'':
        stream.write(data)
        data = wf.readframes(chunk)
    stream.close()
    p.terminate()

しかし音声が終了するまでwhile data != b'':文が閉じてくれないので、停止再生が任意に行えません。そこで、以下のようなサブプロセス実行用のファイルsub.pyを作り、main.pyからサブプロセスで実行する方法を考えました。

#file name is sub.py
#サブプロセスで実行されるファイル
#CMD上で python sub.py name というコマンドでname.wavファイルが再生される

import sys
import wave
import pyaudio

args = sys.argv

wf = wave.open(str(args[1])+".wav", "r")
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)

# チャンク単位でストリームに出力し音声を再生
chunk = 1024
data = wf.readframes(chunk)
while data != b'':
    stream.write(data)
    data = wf.readframes(chunk)
stream.close()
p.terminate()

上記のsub.pyを下記のmain.pyからサブプロセスで動かします。

#file name is main.py

from msvcrt import getch#キーボード入力用
import subprocess

def main(name):
  while True:
      key = ord(getch())#キーボード入力を受け付けます
      if key == 72: #上矢印ならnameファイルを再生
          cmd = "python sub.py "+str(name)
          pro = subprocess.Popen(cmd)#Popenならサブプロセス中も、次のメインプロセスが実行される
      elif key == 13:#エンターなら終了
          pro.terminate()
          break

サブプロセスで再生を実行することで、main側から任意に再生停止をするコードを書くことができました。 本日は以上です、お疲れ様でした。

理系学生が政治・法律を学ぶ際に必要となる本質的な基礎知識 ~最近の話題にのせて~

目次

初めに

 自然科学系の学生が政治や法律など一般に文系と呼ばれる中でも理論よりな学問を勉強する際,どこから手をつければよいか分からないことが多い.基本と呼ばれても,何が理系学生にとって基本となるのかなかなか見えてこない.ということで,本質的かつ基本事項を対立構造で列挙する.とりあえずこれを抑えておけば僕程度のリテラシーは得られると思う.

 なんか吉本を例にすると分かりやすい(笑)

 

悪と正義 ~主観でしか語られない概念~

f:id:amakazeryu:20190730142314p:plain

 上図より誰が悪いか,誰か正しいか,ということに出口は見えない.理由は良い悪いは常に主観でしか語られないからである.主観から見て価値観が等しいものを良いと言い,異なるものを悪いという.とはいえ世論は一般に誰が悪いかということを決めたい人が多いので,世の中のマジョリティと価値観が異なるものを悪という.この考えが次の罪と罰に繋がる.

罪と罰 ~常に付きまとう~

 ドストエフスキー読もう(笑).罪──誰が悪いのかということは罰がなければ法律上決めることができない.罪には常に罰がつきまとう.罰がないところに罪は存在しない.ばれなければ犯罪ではないということは,これを意味している(と思う).捕まらず逃亡する者はずっと警察に怯える生活をする.その生活自体が罰であり,その罰を15年履行することで,罪が解消される時効となる.この辺りは法律を作った時点の人が賢いと思う.また一般が充分罰を与えたと認識されると,その罪は一般に解消したということになる.

f:id:amakazeryu:20190730142851p:plain

 この円グラフほど,使えない資料はないということである.ちなみにこの騒動の本質的問題は吉本興業の事業形態である.お笑い界アップデート,したいね.

民法と刑法 ~意外に知らない違い~

 法律──別名,罪発見機および罰量産機.司法国家において,法律上の罰は常に裁判を通してしか与えることができない.刑法は検察と呼ばれる警察のお友達が,裁判を加害者に対して起こす.刑法だと罰で刑務所行きチケット・地獄行きチケットを与えることができるようになる.民法はお金しかもらえません.

 刑法の対象はそれこそ法律勉強しないと細かく分からないが,殺傷・盗品など一般に悪だと言われている事件が対象になる.事故や人間関係のいざこざは民法になる.

 吉本に話が戻ると,誰かが訴えないと法律上で誰かが悪いということは規定できない.法律上の罰が生まれないからね.だから世の中からバッシングや停職を芸人さんたちへの罰として罪を解消させ,問題の焦点を企業形態に移した方が発展的・未来志向な議論になる.

倫理と法律 ~ほぼ同じもの,違いは時間軸~

 倫理は常に変化している,今も.法律はある時代の倫理を一度文章にしてフィックスするものである.当然法律も変化するが,変化の時間単位が倫理に比べて遥かに遅い.この倫理と法律の差分及び,法律制定のディレイをなるべく小さくすることこそ,法治国家が目指すことの一つといえる.ディレイが大きいと”裁けない”,”技術開発できない”などが発生する.

ãnhk ã¹ã¯ã©ã³ãã« ã¢ã³ã±ã¼ããã®ç»åæ¤ç´¢çµæ

 割と哀しみが生まれる放送法NHKスクランブルの例.

権利と義務 ~常に付きまとう~

 権利は常に義務を払わないと得られない.国民の義務を果たさない人に,国民の権利は与えらない(与えられてるけど笑).やっぱり世の中の多くは権利ばかり主張して,義務に焦点がいかない人が多い.権利を得たくば,義務を払わなければいけない.「これしたい」「あれしたい」といって,「でもそれはしたくない」という子供を思い出そう.何か対価を払わなければ,得られるものなどないのだ.

 モノを所有する権利には,お金を払う義務が生じる.大学で講義を受ける権利は,勉学をする義務(&授業料,入学試験)を履行することで得られる.権利と義務は結構役に立つ対の概念なので押さえておきたい.

終わりに

 三権分立選挙制度,法律改正手続きなども所詮具体的なことだと思い,より抽象度を上げて本質的な基本事項をまとめてみました.言われてみれば,そうだねと思うことが多いと思います.是非考え方パクって使って下さい.あとなんか漏らしている基本概念ありそうな気しかしませんが,見つけたら随時更新.オファーがあれば,経済編やってもいいかも.本日は以上です,お疲れ様でした.

次回予告

 経済の本質とは分配である.しかし平等にすることは目的ではない.なぜなら差異がなければ価値が存在しないからだ.差異なき世界に優越の幸福は生まれない.そのことを理解した者が,民草に平等”感”を与えて秩序をコントロールしているに過ぎない.資本主義が生み出した怪物達の思考プロセスに迫ってみよう.知らんけど.

人文系の学生にありがちな論理的ミステイク

 一年に一度は人文系のゼミ型講義に参加しているどこぞの自然科学の研究室学生.ディスカッションをしていて覚える違和感を紹介してみようと思う.

目次

f:id:amakazeryu:20190726140549p:plain

話が発散しがち

 問題の原因となる要素をいたずらに増やしがちなことが多い.そして大抵最後には「難しいですよね」というのがお決まりとなる.とりあえず言ってみた,けど何がどう問題と関係しているのかは知らないけど,というのが非常に多い.

問題提起の方向が具体的

 話が発散する際は大抵問題提起の方向がおかしい.当たり前なことだが,細分化すれば問題数は増える.差別のことを考える時にジェンダーも部落も人種も考え,最後には人それぞれなどと言いだせば,問題の種類はいくらでも増やせる.問題提起は抽象の方向,つまり本質的なことを問題として挙げるべきなのに,具体的事例ばかりで問題提起されても結局一般的な解決策など生まれようはずがない.一般的な解決策が見えづらいというのは知っている.けど何かしらの解決策を提示しなければ,文句を言うだけの5chラーと同じ.

もはや問題が解決されないことを望む

 自分達のアイデンティティを保護する為に,問題が解決されては困るという姿勢すらある.ある学生は問題提起をすることに意義を感じているようだが,それだと当然解決されては困るのだろう.そして解決したと万人が思っても,無意識な差別をしているとかいう表現をもってして,問題があるのに問題に気付いてないよね,などと宣う.彼らは問題が解決されると困る人達なのでしょうかね.

大抵議論は傷のなめ合い

 議論をするのはお互いの研究を励ますため.本書が最終的に言いたいことは勇気をくれること.という意味不明な感情論に話を持っていき,最終的には議論で相手を傷つけるのを怖れて,傷のなめ合い行為が始まる.議論で精神にストレスが生まれることを善としない人達.どうしてそうなるんだ.

ロジックアレルギー

 結構困ってしまう.ロジック完全崩壊状態でも,突っ込んでくるゾンビモード.彼らがいうのは”世の中は論理で動いているわけじゃないYO”.そして感情を大切にしようという.別に大切にしていないわけじゃなく,一般的な解決策を探る学術をしたいから,わざわざ論理的な議論をするんだけど.学術しないなら,居酒屋で喋ってくれよ.論理でものを喋ると,机上の空論でしかないという非難を頂戴する.思い出すのは夏目漱石”こころ”の「よく男の方は議論だけなさるのね.よくも空の盃でよくもああ飽きずに献酬ができると思いますわ」ですね.

数式アレルギー

 高校生で数学に挫折して以降,数字は人を誤魔化す為のツールと半自動で見なしてしまう人達のこと.統計アレルギーにも発展しやすい.結構いる.数字じゃないよ,数学だよ,といっても彼らには通じない.見たことのない文字が出た瞬間に,憤りを見せてくる.数式を見た瞬間にそのプレゼンを聞かなくなる.こういうことは頻繫に起こる.かといって論理的に喋っても,ロジックアレルギーを引き起こす人が多い.結局何も考えてないという意思表示だと思うしかない哀しみ.

定義されない言葉

 科学は定義しがちと揶揄されがち.けど定義されない言葉をふわふわ使う人達の方がよっぽど議論してないと思う.そしてそこを真面目に考えたこともなさそうな雰囲気すらある.感情とか社会とか,よくも適当に使いなさるのねと言われたらどうするんでしょう.感情と情動,認知と知覚,意味と意義,使い分けている人がどれだけいるのか.定義してドヤァしたいわけじゃなく,意味をクリアにしたいだけなんですけどね.

 

まとめ

 あくまで一部の話です.そして言葉にそこまで重みがないのが世の中のマジョリティだと思います.重みというのは一つ一つの言葉に対して意味をどれだけ付与されているかということです.自然科学系の研究室にいくと,そこには本質派な議論を行う先生が多いと思います.扱う内容もそれに向いている内容が多いです.従って言葉の重みも大きくなる傾向があります.その点が大きなメリットなのかな.本日は以上です,お疲れ様でした.