とある大学生の勉強メモ

バカでもいいじゃない,子供でもいいじゃない.

超簡単! レトロボタンスイッチで,PC入力を行う! ~心理実験などに~

f:id:amakazeryu:20200202174707p:plain

今回は超簡単にスイッチボタンをPCに入力させたいと思います.

心理実験で,被験者がボタンを押す必要がある時,入力インターフェースをキーボードなどに頼ってる人は多いと思います.ただし,キーボードではボタン数が多く,被験者に選択ストレスが生じてしまうので,なるべくシンプルなボタンを与えたいところ.

といってもマイコンを使うのは同期やプラグラミングなど色々と面倒なものです.

今回は,マルツの押しボタンスイッチをテンキーに繋げる事で,PCに入力させたいと思います.

用意するもの

・ボタン(100円ぐらい)

・やっすいテンキー(600円ぐらい)

  f:id:amakazeryu:20200202174920p:plain        f:id:amakazeryu:20200202175259p:plain

 

テンキーは安くて解剖しやすいのが良いです.まずテンキーを開けましょう.

f:id:amakazeryu:20200202175859p:plain

御開帳~ということで,中身はこんな風になっています.

あるキーを押すと,その下を通るパターンが二つTureになります.

Tureになったパターンが赤丸の所にいき,基盤の中で処理を行ってPC入力をしています.ですので,テンキーの中から使いたいスイッチを選び,そのパターンを追って,赤丸の所で並列に配線を取ってくれば,テンキー上と同じようにスイッチを扱うことができます.

f:id:amakazeryu:20200202180446p:plain

8のキーは左から2つ目と,右から5つ目に対応しているようです.

このテンキーは24個のボタンがあるのですが,配線も4×6の24通り組み合わせがあるので,一致してますね.(左から5個目は使わないので,配線が切れています.)

それでは赤と青の所の配線を引っ張りましょう.

f:id:amakazeryu:20200202180918p:plain

 

引っ張った配線白と黒を,今度はマルツのスイッチの方にハンダします.

f:id:amakazeryu:20200202181106p:plain

 

これで,完了.後はPCにテンキーをUSB接続すれば,マルツのスイッチを押すと”8”を入力する事ができます.

 

実際にやってみた.

drive.google.com

 

今回は以上です,お疲れ様でした.

アウトプット講座 文章編 ~人に伝わりやすい文章の書き方の本質~

前書き

自分の考えを他人に伝える事が,とてつもなく大事であると気付いた最近.

周りを見て意外にプレゼンに自信がなかったり,スライドを作るのが苦手だったりする人が多いので,アウトプットの仕方をまとめていこうと思います.

僕はアウトプットする際は大抵,話し・プレゼン・文章(小説)・イラスト・動画を使っています.で,ぶっちゃけ使う場面でどれが良いのかというのは変わっていて,例えばウェブライティングならアクセスを稼ぐのが一番大事です.商品を売る際は,自分が本当はどう思うかよりも商品が売れる方が大事ですよね.

僕の得意分野は自分の価値観を伝える事なので,アクセスとか売れるとかは,先輩・上司に聞いて下さい.

本題

さて結論から言うと,一にも二にも,基本が大事です.プレゼンで最後尾の人を指名することで全員の集中力を高めさせるとか,白紙のスライドでプレゼンテーターに注意をひきつけるといった小技は,役に立ちますが,それよりも基本を見つめ直した方が遥かに伝わります.

1 文章編

1.1 文法編

まず文法を押さえる.はまりがちなのが,(1)述語の共用,(2)主語(S)と述語(V),(3)目的語(O)と述語(V)です. 以下の文章はどれも意味がおかしいです.

「親鳥は自分だけではなく,二匹の子鳥も育てなくてはいけません」

「遅刻ばかりをしていた僕が,規則正しい生活になった理由を説明します」

「猫を持って帰ったら,怒った両親を自分が面倒を見るという約束を条件に飼う事になった」

一文目は主語が,<自分and二匹の子鳥>であり,そこに育てるという述語がかかっています. 自分を育てる,っておかしいですよね.ここは「自分が食べる分だけではなく」と変えましょう. 2つの主語に同じ述語がかかるとき,述語の共用に注意しなくてはいけません.

二文目は,S+Vの文章なのに,規則正しい生活になったというbe動詞を使っています. 僕が規則正しい生活になっています,おかしいですよね. be動詞ではなく,一般動詞を使いましょう.「規則正しい生活を送れるようになった」など

三文目は両親という目的語の述語が抜けています.「両親を説得し」など補完しましょう. 以下解答例

「親鳥は自分が食べるだけではなく,二匹の子鳥も育てなくてはいけません」

「遅刻ばかりをしていた僕が,規則正しい生活を送れるようになった理由を説明します」

「猫を持って帰ったら,怒った両親を説得し,自分が面倒を見るという約束を条件に飼う事になった」 もしくは「猫を持って帰ると両親が怒ったが,自分が面倒を見ると説得し,飼う事になった」

以上のように述語の扱いに気を付ける事が非常に日本語では大切になってきます.

1.2 ロジック編

説得の為に,文章のロジックを通してください,というと「へ?」みたいな顔をする人がいます. 相手はあなたのやってきたことを知りません.ロジックを飛ばすと人はもういいや,と思ってしまいます. 最近話題の桜の会を例にいきます.

「桜の会は問題です!」

これはノンロジックと言われるもので,エビデンス無しの文章です. これを聞いても,そう思っている人は共感してくれますが,思っていない人は「ああそうですか」としかなりません.

「桜の会は,政府資金を不正利用しているので,問題です!」

これが一段階のロジック.問題とは何か?⇒不正利用です. でもこれでは不十分ですよね.だってなぜ不正利用なのか分からないからです. ここで大事なのは不正であれば問題であることにはロジックが通っていることです.

「桜の会は,与党の人間が自分達の選挙区の有権者を選んで呼んでいます.それは政府資金を不正利用しているので,問題です!」

これだと不正利用していると判りますよね.あるいは,有権者に政治家がお金や接待をすることが法律上禁止されていることなどを書けばよりロジックが通ります. このように相手の知識に合わせながらも,なぜなぜを繰り返してロジックを通す事が成果報告の文章では大切です.

研究者では必要十分条件や同値などと言いますが,なるべく同値な言葉を繋げていくことが肝要ですね.

1.3 小技編

ダブルミーニング(重複):「馬から落馬」「雷が落雷」など.避けましょう.

・削る:文章量はとにかく削ります.意味が同じなら,削った方が伝わります.「~だと考えられる」→「~である」

・曖昧を避ける:良い,悪い,などは説得力がありません.「削った方が良い」ではなく「削った方が伝わりやすい」と.

・主役は早めに登場:英語の主語が先に来るのと似ています.大事な事を先に書きます.position has meaning.

その他色々ありますが,思い出したら書き足します.

ベイジアン意志決定モデルに関して 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側から任意に再生停止をするコードを書くことができました。 本日は以上です、お疲れ様でした。