tensorflowでベータ分布に従う乱数を生成する
はじめに
tensorflowでベータ分布に従う乱数を生成したくなるときがあります。(mixupのときとか)
しかし、tf.random_xxxのシリーズにベータ分布は入っていません。(tf.random_gammaはあるのに。。)
それで困っている人のために記事を書きます。
実装方法の紹介とヒストグラムを書いて確認、の2本立てで行きます
実装方法
tf.distributionを使う方法
ファイナルアンサーです
import tensorflow as tf alpha = 0.2 beta = 0.2 random_beta = tf.distributions.Beta(alpha, beta).sample()
ガンマ分布に従う乱数を使用する方法
ガンマ分布に従う乱数とを用いると
という性質があるらしいです(下記リンク参考) k11i.biz
これを直接実装してもOKです。前者の方法に比べて、乱数生成アルゴリズムを明示できるのがメリットです。
しかし、ソースコードを読んだところtf.distribution.Beta.sample()内部で同じ実装を取っていたためtf1.9現在ではたぶんパフォーマンスに有意差はないです。したがって今現在この実装を取る必要はおそらくありません
import tensorflow as tf alpha = 0.2 beta = 0.2 r1 = tf.random_gamma(alpha=alpha, beta=1.0, shape=()) r2 = tf.random_gamma(alpha=beta, beta=1.0, shape=()) random_beta = r1 / (r1 + r2)
確認
ヒストグラムを書いて確認してみました。
alpha, betaともに0.2の乱数を10000回生成したヒストグラムです。
このくらい形が似てるなら安心して使えそうですね(精神論)
numpy.random.beta(比較対象)
tf.distributionを使う方法
ガンマ分布に従う乱数を使用する方法
検証!日本にとってベストだったコロンビア-ポーランドのスコアはなに?
はじめに
いやーワールドカップ楽しいですね〜
柴崎ヤバい。乾鬼。大迫ポストプレーすごすぎ。こんなに楽しいならワールドカップ3ヶ月に一回くらいやってほしいですね。
ところで、日本-セネガル戦直後のツイッターを見ているとこんな声がちらほらあがっていました。
私の長年のサッカー観戦経験で大体の場合はどっちが正しいのかすぐわかるんですけど、今回はめちゃめちゃ難しかったです。
一体日本にとって一番良い結果はコロンビア-ポーランドが0-0で引き分けることなのでしょうか?それともコロンビアが1-0でポーランドを下すことなのでしょうか?
※サッカーあんまり見ていない人or後世の人へ:以下のような状況下で日本にとって最適なコロンビア-ポーランド戦の結果を探る問題です
※日本は初戦コロンビアに2-1で勝って(死ぬほどびっくりした)二戦目セネガルに2-2で引き分けています(死ぬほど興奮した)
Country | Points | matches | win | draw | lose | 得点 | 失点 | 得失点差 | 反則ポイント |
---|---|---|---|---|---|---|---|---|---|
日本 | 4 | 2 | 1 | 1 | 0 | 4 | 3 | +1 | -3 |
セネガル | 4 | 2 | 1 | 1 | 0 | 4 | 3 | +1 | -5 |
コロンビア | 0 | 1 | 0 | 0 | 1 | 1 | 2 | -1 | -6 |
ポーランド | 0 | 1 | 0 | 0 | 1 | 1 | 2 | -1 | -1 |
最強に迷った挙句スコアレスドローがベストかな?と思ってツイートしたら案の定知り合いの先輩からコロンビア1-0ポーランドがベストじゃね?とご意見を頂いてしまいました。
考えていてもキリがないので、適当にモデリングして残り試合を全パターン計算してどっちがベストだったのかを探ってみました。そんな記事です。
検証
前提
- どのチームの得点も、平均1.4のポアソン分布に従う(後述)
- 得点の上限は5点
- 順位決定ルールはFIFA公式ルールブックに準拠(原典探したの褒めてほしい)
- 最終戦はどのチームもカードをもらわない
検証内容
Country | Points | 得点 | 失点 |
---|---|---|---|
日本 | 4 | 4 | 3 |
セネガル | 4 | 4 | 3 |
コロンビア | 1 | 1 | 2 |
ポーランド | 1 | 1 | 2 |
- 1-0のケース
Country | Points | 得点 | 失点 |
---|---|---|---|
日本 | 4 | 4 | 3 |
セネガル | 4 | 4 | 3 |
コロンビア | 3 | 2 | 2 |
ポーランド | 0 | 1 | 3 |
- 具体的には各チームの取りうる点数は0点〜5点の6通りなので、6 ** 4 = 1296通りのパターンにおける日本の順位を全部計算してポアソン分布の同時確率的な確率で掛け算して以下の2点を計算したよ
- 日本の期待順位
- 日本のベスト16進出確率(日本が2位以上になる確率)
検証結果
コロンビア0-0ポーランドの場合
- 日本の期待順位: 1.7404
- 日本のベスト16進出確率: 82.68 %
コロンビア1-0ポーランドの場合
- 日本の期待順位:1.7471
- 日本のベスト16進出確率: 89.58 %
まとめ
- 期待順位はあんま変わんないけど、ベスト16進出確率がコロンビア1-0ポーランドのほうが7%ほどよい
- 先輩すいませんでした
- 以下解説記事です。興味ある人だけ読んでください。上に書いてある内容ほどライトな内容にするつもりです。
解説
てかもう終わったことなんだからさっさといまの状況(コロンビア3-0ポーランド)での日本の突破確率を教えてよ
ごもっとも
- 日本の期待順位: 1.7965
- 日本のベスト16進出確率:84.64 %
なんと84.64%の確率で突破できます
結局、両者の違いはどこ?
計算結果だけ見てもようわからんので、コロンビア-ポーランドの試合結果によって日本のベスト16進出が左右されるケースを抜き出してみました
コロンビア0-0ポーランドのとき突破、コロンビア1-0ポーランドのとき敗退
やっぱり1点差負けのときの上がりやすさはスコアレスドローに軍配が上がりますね。
ポーランドの総得点が低いので日本を上回りづらいんですね〜
コロンビア1-0ポーランドのとき突破、コロンビア0-0ポーランドのとき敗退
やっぱりどんだけポーランドにボコされてもセネガルさんがコロンビアさんをボコしてくれればいいという究極の他力本願ができるのがいいですね。
この究極の他力本願ができるからコロンビア1-0ポーランドのほうがいいんですね〜
あと、コロンビアさんがセネガルを鬼ボコしてくれればワンチャンあるのもでかいですね
期待順位があまり変わらないのなんで?
1位になる確率がコロンビア0-0ポーランドのほうがコロンビア1-0ポーランドより圧倒的に高いからです
- 最終戦日本引き分けコロンビア勝ちのケースが前者だと1位後者だと2位なのが主要因ですね
コロンビア0-0ポーランドのとき:1位の確率 47.92%
コロンビア1-0ポーランドのとき: 1位の確率 35.71%
そう!だからベルギー回避を本気で狙うならコロンビア0-0ポーランドだったんですよ!!
でもこの辺暗算してTwitterでつぶやける人ひとりもいないし人間の限界を感じますよね。計算機の勝利。
ゴール数がポアソン分布とか何いってんの
- サッカーのゴール数はポアソン分布で表現できるらしいですのでそれに従いました
平均ゴールはなんか今回のワールドカップ予選の1試合あたりのゴールが2.8だって見たんで1チーム当たり1.4と考えました
実際、対戦しているチーム同士の得点確率は独立なのかって言うと微妙かとは思いますが今回は強い気持ちで独立と仮定してモデリングしました
おわりに
世の中には以下のような記事があり、85%は迷信!みたいに言われています
クラスのスクールカースト高いっぽい奴らが85%の話題で盛り上がってるとするじゃないですか?
そんなとき、このブログを有効活用して「いや、得点が平均値1.4のポアソン分布に分布すると仮定して突破期待値計算すると84.64%って出てくるんだよ、だから意外と85%ってのは的を射た数字なんじゃないかなって思うぜ。まあおれのプログラミング能力ならこの程度の計算一晩で余裕だったけどな」とキメればめちゃめちゃキモがられてスクールカースト最底辺待ったなしなのでみなさんもぜひためしてみてください。以上です。
好きな居酒屋を書いてブログ執筆のリハビリをする
この記事について
私が好きな日本国内の居酒屋を書くただそれだけの記事です。
有名チェーン店は書くまでもないと思って入れてないです。鳥貴族だいすき。
忙しい人は読まないほうがいいです。
基本ビールを無限に飲む人間なんでやたら酒についての言及が少ないです。
アウトプットの感覚を取り戻して明日から技術ブログを書きまくる、書きまくるんだ。。。。。
県別紹介
京都府
私が最も長く飲酒可能な年齢で過ごした都道府県
地球屋
https://tabelog.com/kyoto/A2601/A260201/26000751/
河原町徒歩数分
なんかバンドサークルの打ち上げとかで使ってそうな雰囲気だけどオタク大学生のおれもギリ入れる懐の広さがあった。
安くて料理がうまい、言うことなさすぎて本当に好きだった。しかしエノキのバター炒め以外の料理を覚えていない。
まじめや
https://tabelog.com/kyoto/A2601/A260401/26025841/
桂駅徒歩数十秒
1回しか行ったことないけど唐揚げなどの料理がいいかんじだった。
京都大学桂キャンパスの人が多そうでこの店で京都大学桂キャンパス関係の悪口は言えないなと思った。
神奈川県
私が二番目に長く飲酒可能な年齢で過ごした都道府県
ラーマヤナ
https://tabelog.com/kanagawa/A1401/A140101/14054431/
ドンキの横、アジア系居酒屋
言わずとしれた最強の店、中華街行くよりラーマヤナ行ったほうが脳が喜ぶ。
初めて行った時17:00すぎに適当に入ったら18:00までビール百円って言われたから急いで5杯位飲んだら酩酊しまくって20:00に二次会終えて解散になった。
アジア感あふれるメニューが300円均一で食べられるので横浜優勝という気持ちになる。意外とカップルがいるので注意。
まるりゅう
https://tabelog.com/kanagawa/A1401/A140102/14057966/dtlmap/
桜木町徒歩数分、串カツ
1次会で行ったこと一回もないけど2次会で無限に通いつめている。
串カツおいしいしモツとかホタルイカとか美味しかった気がする。
店名いま知った。
東京都
私が三番目に(以下略)
居酒屋竹子
https://tabelog.com/tokyo/A1309/A130905/13038087/dtlrvwlst/
飯田橋からちょっとあるく。和食居酒屋。
料理がうまい(蕎麦あるの嬉しい)し安いしお酒も美味しいし言うことないんだけどなによりも店構えがすばらしい。
一人30000円位する料亭に見えるので友達を連れて行くとビビっていて楽しい。でも入店の瞬間ちょっと自分も緊張する。
鰓呼吸
https://tabelog.com/tokyo/A1317/A131701/13100617/
中目黒すぐ。海鮮居酒屋。
料理美味しいのと結構日本酒の種類が多かった記憶がある。
このブログで紹介する居酒屋の中では一番金額行った記憶あるけど相応という感じがある。
なんでや
https://tabelog.com/tokyo/A1313/A131306/13101236/
東京テレポートからちょっとテレポートする。総合居酒屋。
お台場とかいう人が大量に存在する土地にありながら平日あんまり混んでないので研修中ずっと行ってた。思い出補正でランクイン。
千葉県
生まれ育った地
居酒屋 一九
https://tabelog.com/chiba/A1202/A120201/12001697/
西船橋徒歩数分、海鮮居酒屋
料理全部うまい、あとお酒おいしい、店の雰囲気よい。カツオの外側だけが揚がっているみたいな料理が忘れられない。
致命的に西船橋に用事がないのが痛い。
まとめ
- 大学生も行けるけど社会人もいるくらいの店の雰囲気が好き
- あんまり奇をてらわない和食系メニューが好き
- これからも他人に迷惑をかけない程度にお酒を飲んでいきたいね、ハム太郎
将棋駒の寸法をしっかり計算したお
はじめに
ちょっといま趣味で将棋の画像認識のうんぬんかんぬんをやっていて、そのためにunityで将棋駒をつくったほうがいいっぽくなったんですね。そしたら意外と将棋駒の寸法をしっかり計算するのがむずいという学びを得たためここで私の作業を共有しようというエントリです。
2020/05/17追記: 計算用のサイトを公開しました。詳細は以下の記事にて。
将棋駒の寸法ルールを知る
将棋駒 寸法でググると、以下のサイトが出てきます。
http://www.tendocci.com/koma/qa.htm
どうも、将棋の駒界では
- 底辺
- 高さ
- 底辺と横の辺がなす角度(底角とでもしましょうか)
の3つで定義されてるっぽいんですね。
しかしながら、この定義だと上の部分の角度が自由なので私のような美術センスなし人間はうまく3Dモデリングできないんですよ。
やっぱり駒の形が一意に決まる定義がほしいところです。
で、いろいろググっていると以下のサイトが見つかります。
このサイトで、駒の角度の定義を知ることができました。
- 頂角 144°
- 中角(とでもしましょうか) 117°
- 底角 81°
やっぱり中倉彰子先生は神
というわけで、将棋駒の寸法定義を上記2サイトを参考にまとめると、
- 底辺の長さ
- 底辺の長さと高さの比
- 頂角 (144°が一般的)
- 底角 (81°が一般的)
の4つの値があれば将棋駒の形が一意に決まることがわかりました。(※中角は五角形であることから導出できるので頂角と底角で十分)
定義から辺の長さや座標を計算する
この値を定義すれば駒の形が一意になるとわかったとはいえ、実際に各辺の長さや頂点の座標位置を計算するには結構がんばらなくてはなりません。
この記事にたどり着いた人はラッキーです。私ががんばっておきました。
上の図で言うところの
- 角P
- 角R
- 底辺の長さc
- 底辺と高さの比率μ
が既知の状態で残りの未知の値を求めようということになります。
あ、角は全部degreeでおねがいします
角Qを求める
鬼かんたんですね。
五角形の内角の和が540度であること、将棋駒は左右対称であることから
辺の長さa, bを求める
ちょっとめんどくさくなります。
まず、高さμcと辺の長さa,bの関係は
ですね?次に、底辺cと辺の長さa,bの関係は、
となります。こいつらの連立方程式を解いてやればいいんですね。
両方の式に が現れるようにそれぞれ式変形すると
上の式 - 下の式でbを消去して
右辺はなんと加法定理の形になっているので(高校数学は神)
とすることでめでたくaをc,μ,P,Rで表せました。同様に
各頂点の座標
点Pの座標を(0, 0)とすると、
これで全部いけましたね。
こんな感じのオブジェクトができた(王将サイズ)
終わりに
とまあこんな感じで将棋駒のあれこれが計算できるわけです。
計算用スクリプトは近日中に公開するので、だれでも将棋駒の辺の長さを知ることができるようになります。ハッピーライフ。
それにしても高校数学はすごいですね。これで三角関数の加法定理なんか人生の役に立たないとか知った顔してのたまう高校生には「将棋の駒の寸法を計算するプログラムの可読性がめちゃくちゃあがるから役に立つんじゃオラ」と力強く主張できます。
それでは。(そろそろいい加減deeplearningの記事が書きたい)
富士山をナメているすべての若者たちへ
小学生にも登れるんだから元運動部のおれは絶対に富士山に登れるとナメた態度でいる皆様、こんにちは。
かくいう私も2週間前まではそんな人間の一員でした。このエントリは、富士山をナメていたせいで苦しむ若者を少しでも減らすために私の経験を赤裸々に語る慈悲にあふれたエントリです。
このブログは統計や機械学習のことを書いていく予定でしたしこれからもそのつもりですが、あまりにも21世紀を生き抜く上で必要なことだと実感したので記事にした次第です。
事のあらまし
基本情報
- プロフィール:24歳男性、ここ2年(就職後)ほぼ運動をしていない
- 登山人数:2名(同行者の友人はフルマラソンとか走れる体力を持っている)
- 登山口:須走口
- 予定行程:夜7:30頃バスで5合目まで行って、夜通し登って、ご来光を頂上で見て、下山
- 登山経験:皆無に等しい
前日まで
- 完全にあらゆる調査を同行の友人に任せる
- 準備をほぼしない
当日(出発まで)
- ようやく適当に準備をする
- なんか体調が悪い気がしたが、さすがに家を出る
- 5合目に到着する
5-6合目
- 到着するなり全力で登り始める
- 登り始めて少しすると、呼吸が整っているのに脈拍がえげつなくなる現象が起きる
- 苦しい。ありえんつらみが深い
6-7合目
- 休憩回数が増える。めちゃめちゃ友人に申し訳ない
- ありえん頭痛みがすごい
- 高山病を意識する
- 雷雨がやばくなり、死を覚悟する
- 死ぬよりはマシと、全力で7合目まで登る
- 7合目の山小屋に泊まることにする
山小屋にて
- シャワーなし!?ポカリ600円弱!?となる(常識の欠如)
- 急いで登ったせいであらゆる高山病の症状が出て、泣きそうになる
- 濡れたまま寝る
- 寒気でぶるんぶるんする
翌朝〜下山
- 完全に頂上を目指せる体調ではなくなっていたので、友人に下山を申し出る
- 本当にごめん
- 死ぬ気で歩いて下山
下山後(当日)
- 帰宅後熱を測ると39度を超えている
- ここ15年で初めて食事を残す
- ありえん下痢がすごい
下山後(それ以降)
- 会社を1日休み、病院に行くと高山病からのウイルス性胃腸炎のコンボを食らったのではという医師からの見解を得る
- 下痢がひどく、ウイダーゼリーを超える固形物が食べられない
- 熱が下がるまで2日
- 固形物が食べられるようになるまで4日
反省とアドバイス
5合目到着までのアドバイス
そもそも、本当に富士山に登りたいのかを自問自答せよ
私は、なんとなく日本人として1回は富士山に登っておきたいという動機で登山を計画しました。
しかし、そこに登山に対する思いはありませんでした。
本当に登山をしたいという気持ちがあるかどうか胸に手を当てて考えてください。
土日は何もせずしっかり休んで平日の労働に備えるほうがよほど日本人にふさわしいです。
たくさんの人間で登ろう
企画段階で2名だったのは、ミスだったと感じています。
当日体調が少し悪いと感じたとき、2名だと断然キャンセルしづらいからです。
初心者は8名位で企画しておけばキャンセル・リタイアしやすいと思います。
余裕を持った計画をしよう
突然の雷雨やその他もろもろで計画が崩れることは多いのではないでしょうか。
初心者は慌てないためにも、夜通しぶっ続けで登る計画はしないほうがいいかもしれません。
登山時のアドバイス
高度順応を知ろう
富士山をナメているみなさんは高度順応という言葉をご存知でしょうか。
人間は突然気圧が変わると体に負担がかかるので、体を低気圧に慣らすことで高山病を防ぐための手法らしいです。
よくあるのが5合目まで登ったあと1時間位なにもせず過ごすとか最初の1時間はゆっくり登るとからしいですがこの辺はググってみてください。
私はロケットスタートしてしまいました。つらい。
全体感をつかんだ登山をしよう
富士登山は長時間かかります。
全体感を掴まずに登り始めると、自分がどのくらいのペースでどう登ればいいのかわからなくなってついつい早めのペースになってしまいます。
何時に何合目にいればいいという目安を持っておくと気持ちを楽にして登れるのではないでしょうか。
まとめ
以上が私の経験と反省とアドバイスです。
高山病からの風邪は本当に泣きそうになるので、富士山はナメずに登ってください。
一番悲しかったのは、固形物を食べずに丸3日ほど過ごしたのに500gくらいしか痩せなかったことなのでダイエット目的だとしてもナメないほうがいいです。
と、ここまで富士山を悪者扱い?してきてしまいましたが、下山時に眺めた富士山の景色はとても美しく、なかなか他では見られない景色だと感動したのもまた事実です。
しっかりと準備をして、わたしが見られなかった山頂からの景色を眺めて来てください。
姓名分割プログラムをつくる-NameDivider利用マニュアル-
NameDIviderの利用マニュアルです。
DivideのことをDevideだと信じ込んでいたのでリポジトリ名から変更するという門出を迎えたわけですが、気を取り直していきましょう。
※ 追記
2020.11にPythonパッケージを作りました。
https://github.com/rskmoi/namedivider-python
記事にもして頂きました。
https://internet.watch.impress.co.jp/docs/yajiuma/1289735.html
エンジニアの方にはこちらをおすすめしています。合わせてぜひ。
どんなことができるの?
ざっくりいうと、苗字と名前の間にスペースが入っていない名前を苗字と名前に分けることができます。
「篠田麻里子」を入力すると、「篠田 麻里子」が出力されるイメージです。
もちろん全部分かれ目を当てることはできませんが、簡単な統計を使って(意地でも人工知能とはいわないぞ)99%程度の精度で分割することができます。
詳しくできることを説明すると、
- お試しで姓名分割を体感
- テキストファイルに入っている名前データを読み込み、苗字と名前に分けてtxtファイルに出力
- ↑を行った後、苗字の分かれ目である確信度が低い順にソートを行う(これがあると、目視で確認するとき楽かなーと思っています)
- その他開発者用ツール
が入っています。このページの下のほうに詳しい使い方を書いてあります。
どんな時に使えるの?
- 苗字と名前の間にスペースが入っていないデータを苗字と名前に分ける作業を大量に行わなければならないとき
- ひまつぶし
ダウンロード方法は?
githubで公開しています。
赤く囲ってあるところをクリック→Download ZIPでダウンロード完了。
適当に解凍してください。
起動方法
[NameDivider]→[confirmpg]→[bin]→[Release]の順に開き、最後にconfirmpg.exeをダブルクリック
こんな画面が出てきたらOKです。
今気づいたんですけど姓名分離くんってなんなんですかね。名前をはるか昔につけていたようですがNameDividerでいきます。
コマンド
test
コマンド操作になれていない人は申し訳ありませんが本アプリはコマンド操作をしないと動いてくれません。そんなに難しい操作はないのでちょっと頑張ってみてください。
testと打つとお試しができます。暇つぶしに遊んでみてください。
このプログラム、ののたは間違えます
やめたくなったら
quit
と打ってください。
divide
メイン機能です。
まずは、以下のように名前データを揃えてみてください。
で準備するとうまくいきます。
これ以降の作業で注意なのですが、絶対に使用するファイルはバックアップを取っておいてください。何かあっても私は責任を負えませんので。。
さて、次にdivideとコマンドを打ってみてください。
ファイルのパス名を入力してくださいと出てくるはずです。
パス名というのはわからない方にはとても難しいですよね。。
何も考えずにファイルをドラッグアンドドロップするとパス名が入力されます。
すみませんこの辺がわからない人はググってみてください。
そしてEnterを押します
正常に終了しましたってどういうことだよ!!と言いたくなるかもしれません。すみません。
[NameDivider]→[confirmpg]→[biin]→[Release]の中に[NameDivideResult~]みたいなファイルができているはずなのでそれをダブルクリックすると、、、
苗字と名前が分かれてるやつが誕生!
あとはこれを煮るなり焼くなりしてください。
divide -c
-cってなんだよって思った人はまあオプションみたいなものと思っておいてください。
これを使うと、このプログラムが「ここで区切るのか自信ねえなあ。。。」って言ってる名前が上のほうに来ます。
すると、上のほうを重点的に人の目でチェックすればよいので集中力を保ったまま目視で検査ができる!というねらいです。
基本的にやることはdivideと変わりません。
難しそうな名前が上に来ているのがお分かりいただけますでしょうか?
ちなみに左の数字は元の並び順の番号なので、ソートを戻すときなどにお使いください。
開発者用コマンドはまた次の機会にしましょう。
みなさんガンガン使っていただければと思います。
最後に
以上となります。
なにかありましたらコメント欄など何かしらの形でお知らせください。
クソコードの自覚はあるのでちょいちょいアップデートはしていくつもりです。
姓名分割プログラムをつくる-復活編-
ついつい労働していたら2か月ほどたっててやばいやばいと思っていたらなぜかめっちゃアクセスが増えたと思ったらなんか掲示板?で記事を紹介していただけていたみたいでした。
やはり姓名分割の需要は無限に存在しているのですね
というわけでコード公開です
とても汚いのですが3連休でまあまあにしてみせる