UnityとゲームAIと将棋

Unity、Pythonを中心にゲーム開発やゲームAI開発の技術メモ等、たまに将棋も

確率統計関連の基本事項思い出し用シート

機械学習関連の本や論文などを読んでいると「記載されている数式の変形がどういった背景で行われているのか?」「そもそもこの式って何についての式なのか?」といったようなことをよく忘れてしまい、その都度調べるのも大変なので、基本的なものを一覧としてまとめておきます。

■基本事項

期待値

「確率変数の全ての値に、その値が得られる確率を掛けて全て加算したもの」

 \displaystyle
\mu = E[X] = \sum_{x} x p(x)

E[aX+bY+c] = aE[X] + bE[Y] + c

E[XY] = E[X]E[Y] \hspace{0.5cm} (X \mathop{\perp}Y)

分散

「期待値(平均値)と各データの差を二乗し、各データの得られる確率を掛けて全て加算したもの」

 \displaystyle
\sigma^2 = V[X] = \sum_{x} (x-\mu)^2 p(x)

V[X]=E[X^2] - \mu^2

V[aX+b] = a^2V[X]

V[X \pm Y]=V[X]+V[Y] \pm 2Cov[X,Y]

共分散・相関係数


Cov[X,Y]=E[(X-E[X])(Y-E[Y])]=E[XY]-E[X]E[Y]
 \displaystyle
\rho[X,Y] =  E\left[\left(\frac{X-E[X]}{\sqrt{V[X]}}\right) \left(\frac{Y-E[Y]}{\sqrt{V[Y]}}\right)\right] = \frac{Cov[X,Y]}{\sqrt{V[X]V[Y]}}
  • X,Yが独立の時、共分散は0になる
  • 相関係数は-1以上1以下の値を取り、絶対値が1に近ければ相関が強く、0に近ければ相関が弱い

標準偏差

「データが平均からどれだけばらついているかを表す指標」


\sigma=\sqrt{V[X]}

変動係数

「単位の異なるデータのばらつき方を比較するための指標(無次元数)」


\displaystyle \frac{\sqrt{V[X]}}{E[X]}

偏差値

「元のデータを平均が50、標準偏差が10となるように変換した値」


\displaystyle \frac{x-\mu}{\sigma} \times 10 + 50

標準化

「元のデータを平均が0、分散が1になるように変換すること」

確率変数Xを標準化したものをZとすると


{\displaystyle Z = \frac{X-E[X]}{\sqrt{V[X]}}}

E[Z]=0\\
V[Z]=1

ベイズの定理

条件付き確率


P(A,B) = P(A|B)P(B) = P(B|A)P(A)

ベイズの定理の基本形


\displaystyle P(A|B) = \frac{P(B|A)P(A)}{P(B)} = \frac{P(B|A)P(A)}{P(B|A)P(A) + P(B|A^c)P(A^c)}

多変数になった場合は同時確率から変形していくのがわかりやすいと思います。


\begin{align}
P(A,B,C,D) 
&= P(A,B,C|D)P(D) \\
&= P(A,B|C,D)P(C|D)P(D) \\
&= P(A|B,C,D)P(B|C,D)P(C|D)P(D) \\
\end{align}

■離散型分布

離散一様分布

 \displaystyle
P(X=1) = P(X=2) = \cdots =P(X=K) = \frac{1}{K}
 \displaystyle
E[X] = \frac{K+1}{2}, \quad V[X] = \frac{K^2-1}{12}

ベルヌーイ分布


Bin(1,p)

P(X=x)=p^xq^{1-x}, \quad x=0,1

E[X] = p,\quad V[X] = pq

二項分布

「成功確率pのベルヌーイ試行をn回行った時の成功回数Xが従う確率分布」


Bin(n,p)

P(X=x)={}_nC_xp^xq^{n-x}, \quad x=0,1,\ldots,n

E[X] = np,\quad V[X] = npq

超幾何分布

「M個の赤玉とN-M個の白玉の合計N個の玉の入った箱から非復元無作為抽出でn個取り出したときの赤玉の個数の分布」


HG(N,M,n)
 \displaystyle
P(X=x)=\frac{{}_MC_x \times {}_{N-M}C_{n-x}}{{}_NC_n}, \quad
max\{0,n-(N-M)\} \leq y \leq min\{n,M\}
 \displaystyle
E[X] = n\cdot\frac{M}{N},\quad V[X] = n\cdot\frac{M}{N}\left(1-\frac{M}{N}\right)\times \frac{N-n}{N-1}

ポアソン分布


Po(\lambda)
 \displaystyle
P(X=x) = \frac{\lambda^x}{y!}e^{-\lambda}, \quad y=0,1,2,\ldots

E[X]=\lambda, \quad V[X]=\lambda

幾何分布


Geo(p)

※ x回目で初めて成功の場合


P(X=x) = pq^x, \quad(q=1-p), \quad x=0,1,2,\ldots
 \displaystyle
E[X]=\frac{1}{p}, \quad V[X]=\frac{q}{p^2}

■連続型分布

連続一様分布


f(x) = 
\begin{cases}
\displaystyle\frac{1}{b-a} \quad(a \leq x \leq b)\\\ \quad 0 \quad (Other)
\end{cases}
 \displaystyle
E[X] = \frac{a+b}{2},\quad V[X] = \frac{(b-a)^2}{12}

正規分布


N(\mu, \sigma^2)
 \displaystyle
f(x)=\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

E[X]=\mu, \quad V[X]=\sigma^2

積分布関数は

 \displaystyle
P(X \leq x) = P\left(\frac{X-\mu}{\sigma} \leq \frac{x-\mu}{\sigma}\right) = \Phi\left(\frac{x-\mu}{\sigma}\right)

ベータ分布

 \displaystyle
f(x)=\frac{1}{B(a,b)}x^{a-1}(1-x)^{b-1}, \quad a \gt 0,b \gt 0,0 \lt x \lt 1
 \displaystyle
E[X]= \frac{a}{a+b}, \quad V[X]=\frac{ab}{(a+b)^2(a+b+1)}

標本分布

 \displaystyle
E[X] = \mu, \quad V[X]= \sqrt{\frac{\sigma^2}{n}}

参考文献

Android・iOS用アプリ「対局時計Simple」リリース

先日、Unityで製作していた「対局時計Simple」というアプリをGooglePlayおよびAppStoreでリリースしました。 対応言語は日本語のみで、無料のアプリになります。

GooglePlay

play.google.com

AppStore

対局時計Simple

対局時計Simple

  • Tsubasa Hizono
  • Utilities
  • Free
apps.apple.com

対局時計のアプリとしてこだわった部分は

  • できる限りシンプルで操作に迷わないようなUI
  • 大会で使われる対局時計と似たような操作感

という2点です。

特に

  • ボタンを押した時に現在手番のプレイヤー側のボタンが大きくなる
  • 秒読み時の音
  • 設定や一時停止、リセットボタンを画面の中心に置く
  • 残り時間表示を横向きにする
  • 手番プレイヤーの残り時間の下に緑と赤のランプを点灯

といった部分を意識的に実際の対局時計に似せるようにしました。

基本的には将棋・囲碁での使用を想定していて
選択できるルールは

  • スタンダード(持ち時間:最大60分、秒読み:最大60秒)
  • フィッシャー(持ち時間:最大60分、追加時間:最大10秒/一手)
  • 切れ負け(持ち時間:最大60分)

の3種類です。
お気に入りの時間設定を1つ保存しておくことができます。

もし、旅先等の対局時計が無いような状況で将棋を指すことがあれば、使ってもらえると嬉しいです。

Botを常時起動させておくためのservice, plistファイルを置く場所について

SlackBotやDiscordBotを作成する場合、サーバー上で常に起動させておきたいことが多いと思います。 そんな時に使うservice, plist ファイルの置き場所をよく忘れてしまうので、メモしておきます。

  • Linuxの場合 → /etc/systemd/system/
  • Macの場合 → /Library/LaunchDaemons/

ここで注意しておきたいのがservice, plistファイルが置かれている場所が複数あるということです。

例えばLinuxの場合

  • /usr/lib/systemd/system/ → パッケージ管理のサービスファイルが配置される場所
  • /etc/systemd/system/ → システム管理者がサービスファイルを配置する場所

という違いがあり、原則 /etc/systemd/system/ 配下に自作サービスファイルを置きます。

また、Macの場合

  • ~/Library/LaunchAgents/ → ユーザーごとに設定できるエージェント
  • /Library/LaunchAgents/ → システム管理者が設定できるエージェント
  • /Library/LaunchDaemons/ → システム全体に共通で設定されるデーモン

という違いがあり、エージェントは設定者がログインしていないと動かないのに対し、デーモンはログインなしでも動き続けます。

誰もログインしていない時でも動かしておきたいBotなどは /Library/LaunchDaemons/ 以下に配置しておくのがよいかと思います。

Cygamesの「クライアントとサーバーの開発言語をC#に統一する試み」が面白かった

Twitterを眺めていたら流れてきたCygamesさんの「プリグラ」開発に関するCEDECでの発表資料を読んでみたら、非常に勉強になったので共有。

speakerdeck.com

PvPゲームにおいては常にクライアントチートがつきまとうのですが
このチートに対する対応策として

「クライアントにゲームロジックを絶対に実装しない」

というのが面白いなと思いました。
確かにサーバー側でゲームロジックを管理できればチートへの対応コストは抑えることができる。
ただ、基本的にはクライアント側とサーバー側って開発言語や開発担当者が違うので ゲームロジックに関する情報共有などのコミュニケーションコストとが高そうだな...と思ったんですが、 プリグラでは

「クライアント側とサーバー側の開発言語をC#に統一する」

ことで、同じ人がクライアントとサーバーの両方を担当可能にして開発コストを抑えてるみたいです。

なるほど...

【Unity】デザインパターンに関する解説記事のメモ

Unityでの開発で用いられるデザインパターンについての解説記事で分かりやすかったものをまとめておきます。

■Singletonパターン

zenn.dev

■MVPパターン

developers.cyberagent.co.jp

■Factoryパターン

coacoa.net

■Unity公式のデザインパターンに関するblogと資料

blog.unity.com

■その他面白かったもの

hadashia.hatenablog.com

【Unity】MVPパターンに関する情報メモ

MVPパターンとはModel-View-Presenterパターンの略で、GUI周りに関するデザインパターンの一つです。個人でゲーム開発をしている際にUI周りのコードを分かりやすく書きたくなって、それならばMVPパターンを使ってみようと思ったので、参考になりそうなリンクをいくつかメモしておきます。

qiita.com

blog.virtualcast.jp

developers.cyberagent.co.jp

light11.hatenadiary.com