R、統計学、機械学習と競馬予想

学んだことを面白くメモするブログ

長方形に円を並べるという高校生の問題が難しかった

以下のツイートを見たことからはじまった。高校生の問題のはずなのに中々解けないというか、どのように手をつけて良いかわからず少しの間はまってしまった。 わからなかったので、勉強会で知り合いに聞いたりして、最後にはほぼ答えを教えてもらってなんとかとけました。よかった。。

問題

一辺の長さがそれぞれ4,2000である長方形に敷き詰めることができる単位円(半径が1の円)の個数は2011個以上であることを証明せよ。ただし、敷き詰める円は互いに重なり合わないものとする。必要があれば1.9819<\sqrt{4\sqrt{3}-3}<1.982を用いても良い。

試行錯誤

という問題で、普通に格子状に綺麗にならべたら2000個は並べることができるってのはすぐわかるんだけど、これよりももっと隙間なく並べることができるかっている試行錯誤がはじまるわけ。
f:id:hideisu:20170605230505p:plain

3つずつ並べてみたり

3つの正三角形を組みにしてならべてはどうかと思うけど、2000個のやつよりもならばないし
f:id:hideisu:20170605231751p:plain

対角線に一列に並べてみたり

もしかしたら対角線にならべて、その上と下にうまいことならべたら綺麗にならぶのかとおもったんだけど、1200個くらいしか並びません。
そんなわけで、最終手段として、少しずつ上下にずらしながら、ジグザグに並べたらどうなのかと思い浮かびます。

回答

f:id:hideisu:20170605232207p:plain
こんな風にならべると、例えば下の行を見ると5の円を少しだけ上に並べることができるので、上の2000個の並べ方よりも少しだけ詰めて並べることができます。これはすごい。
直線に並べるよりも、どれだけ詰めてならべることができるか(=2-αとおく)は、上の図の5の球を少し上におくことでどれだけ詰めることができるかに帰着できるから

3と5の円の中心の位置を計算するために3と5を抜き出してして図にすると以下のように書くことができ
f:id:hideisu:20170608024956p:plain
αを三平方の定理を使って求めると\sqrt{4\sqrt{3}-3}となります。

三平方の定理を使った計算はこんな感じ。
22 = α2 + (2-\sqrt{3})2]
α2 = 4 - (4 - 4\sqrt{3} + 3)
α2 = 4\sqrt{3} - 3
α = \sqrt{4\sqrt{3}-3}

これで、問題文で与えられていた「必要があれば1.9819<\sqrt{4\sqrt{3}-3}<1.982を用いても良い。」という条件と結びつくんですね。
一直線に並べると、円ある円の中心から隣の円の中心までの距離は2となりますが、5番の円を少しだけ上におくことで、隣の円とのx軸方向の距離は約1.982となり0.018くらいつめて置けるわけです。

このパターンで何個並べることができるか計算すると、2011個となります。 並べた画像は以下。
f:id:hideisu:20170605232207p:plain
f:id:hideisu:20170608130349p:plain

回答としては、以上となります。
ここからは、これまでの画像を作るコードとtwitterでのつぶやきのコピー

pythonのコード

円を描くコード

f:id:hideisu:20170608213210p:plain

0から60を描くコード

f:id:hideisu:20170608213439p:plain

1999から2011までを描くコード

f:id:hideisu:20170608130349p:plain

twitter

f:id:hideisu:20170608220300j:plain

え、まだこの問題の続きがあるの。。。2012以下である証明か面白そう。

Rでサンプルデータを作成するのが難しかったので、作ってみた

一昨日の勉強会で、参加者全員でモデルに当てはまるサンプルデータをRで作ってみようとなった時になかなか良いサンプルを作れなかったので、落ち着いて作ってみる。 data-refinement.connpass.com

 勉強会の内容と作成するモデル

勉強会の内容は、発表者のSSAS3さんが書いてくれたこれ。ランダム化実験が驚くほどよくわかってすごかった。 qiita.com

作りたいサンプルは以下の条件を満たすことだけで、あとは適当でOKという条件(少し勉強会のときから条件を変えています)

Y1(任意) Y2(ランダム)
作業手伝いなし a b
作業手伝いあり A B

a,b,A,Bはテストの点数の平均。

  • a<A
    • 任意にやらせると、準備が整っている生徒が作業をするので、作業ありの方が点数が高くなる
  • b>B
    • ランダムで作業をやらせると、作業なしグループは準備ができるので点数が高くなる

使う関数の候補

関数 概要
rnorm 正規分布に従う乱数を発生
runif 一様分布に従う乱数を発生
sumple 無作為抽出
round 少数点以下を丸める
floor 少数点以下を繰り下げ
ceiling 小数点以下を繰り上げ

練習

n <- 10 # クラスの人数を10人とする
pre <- runif(n,min=-1,max=1) # 一様分布から乱数を作成
ceiling(pre) # preを切り上げて、0と1にする
sample(c(1,0),size=n,replace=TRUE) #ランダムでトリートメントグループとコントロールグループに分ける 
sample(rep(c(1,0),times=n/2),size=n) # 半分ずつトリートメントグループとコントロールグループに分ける
sample(rep(c(1,0),times=c(10,30)),size=n) #10人、30人のトリートメントグループとコントロールグループに分ける

サンプルデータ作成

library(dplyr)

set.seed(2)

NO <- 1:40 # 出席番号
pre <- runif(40,-1,1) #  準備ができているか
Tvol <- ceiling(pre) #  準備ができていれば1で作業を手伝う、できていなければ0で作業を手伝わない
y1 <- round(pre*20+70) +(1-Tvol)*sample(1:5,40,replace=TRUE) # 1回目の点数

Trand <-sample(c(0,1),40,replace = TRUE) # ランダムに作業手伝いを決める
y2 <- round(pre*20+70)+(1-Trand)*sample(1:5,40,replace=TRUE) # 2回目の点数

sample1 <- data.frame(出席番号=NO,Tvol,y1,Trand,y2) # データフレームを作成


# 1回目の小テストをクロス集計
sample1 %>%
group_by(Tvol) %>%
summarise(n=length(y1),mean=mean(y1))


# 2回目のテストをクロス集計
sample1 %>%
 group_by(Trand) %>%
 summarise(n=length(y2),mean=mean(y2))

jupyterのファイルを下記にあげています。 他にもやり方が色々あるだろうから、コメントとか次の勉強会で教えてください。

github.com

緑本3.4.2(あてはめとあてはまりの良さ)のメモ

緑本を読んでいて、3.4.2のポアソン回帰の最大対数尤度のところで、つまづいたのでメモ。

  • ある個体iの平均種子数 λ_i
{
λ_i = exp (β_1+β_2 x_i)
}

であると仮定

  • リンク関数によって
{log λ_i =β_1+β_2 x_i}

  • このモデルの対数尤度は
\displaystyle{logL(β_1 , β_2) = \sum_i log \frac{{λ_i}^y_i exp(-λ_i)}{y_i !}}

  • 本のデータで最大対数尤度を計算すると-235.4ぐらいとわかります。
    ってところが複雑な式だなぁ、実際にどの数字を使って計算すれば計算できるのかなっていうんで、本のデータで計算してみた。
# データの読み込み
>d <- read.csv("http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/poisson/data3a.csv")  

# GLMへの当てはめ
>fit<- glm(y~x,data=d,family=poisson)
Coefficients:
(Intercept)            x  
   1.29172      0.07566  

# 最大対数尤度を計算
> logLik(fit)
'log Lik.' -235.3863 (df=2)

# 最大対数尤度を上記の式で計算してみる
>logL <- function(x,y) log({exp(1.29172+0.07566*x)^y}*exp(-(exp(1.29172+0.07566*x)))/factorial(y))
>sum(mapply(logL,d$x,d$y))
[1] -235.3863

ポアソン回帰で切片と傾きの最尤推定値が得られた後に、最大対数尤度を念のため計算してみて、logLik関数の結果と一致したという結果でした。

2017年1月から3月の統計学学習計画

きっかけ

Niseiさんの以下のつぶやきに触発されて、勉強の計画と結果を書き記していくことにしました。とりあえず読みたい本が決まっている3月までの予定を書きます。4月頭にはどれくらい進んだかちゃんと報告したい。

最終的な目標

  • 統計とか機械学習を数学的なところから理解して、今後もずっと学び続けたい
  • ガチで競馬の予想をやりたい

1月から3月の計画

1ヶ月間に1冊の本を内容を理解した上で読了することが目標。数学的にわからないところがあれば、なるべく統計学解析学等の本を読んで理解を目指す。でも、完璧を目指すと時間がかかりすぎるので、どうしてもわからない箇所はメモって飛ばして、Rで何をやっているのみ理解することとする方針。先に進めばわかるかもしれないし、後で数学的な部分のみ復習しても良いので。 なお、1月分と2月分は途中まで読み進めているので、全く初めからではない。

1月 Rによるやさしい統計学

Rによるやさしい統計学

Rによるやさしい統計学

2月 統計学:Rを用いた入門書

統計学:Rを用いた入門書 改訂第2版

統計学:Rを用いた入門書 改訂第2版

3月 多変量解析法入門

多変量解析法入門 (ライブラリ新数学大系)

多変量解析法入門 (ライブラリ新数学大系)

若しくはRとS-PLUSによる多変量解析

反省

9月に 本当のR初心者がRを始める際の順序(随時更新) - R、統計学、人工知能を書いたのですが、進捗が悪かったので反省の意味も込めて書きました。途中でpythonにうつつを抜かしてしまったので、pythonはとりあえずお休みして、統計学とR勉強して、多変量解析までやってしまいます。

ウマナリティクス #2の資料のまとめ


 

ウマナリティクス#2で発表があった資料とか、言及があったページのまとめです。後で見返す時ようにまとめ。

 トータライザー

www.navikeiba.com


競馬とプロスペクト理論:微小確率の過大評価の実証分析

https://www.jstage.jst.go.jp/article/jbef/7/0/7_1/_pdf


ウマナリティクス#2資料『PAI競馬予測が1番人気に挑む!』

www.slideshare.net


#1 ランキング学習ことはじめ

www.slideshare.net


ウマナリティクス#2で競馬の予想の仕方について喋ってきました

blog.stormcat.io


時代を超えた幻の有馬記念、開幕。

alphaimpact.jp

【夢の第11R】競馬AIによる時代を超えた幻の有馬記念

www.nicovideo.jp

【夢の第11R】競馬AIによる時代を超えた『幻の有馬記念

www.youtube.com


競馬予想でもAIの時代? 予想プログラムイベント詳報

news.sp.netkeiba.com


【追記】

・2016.12.25 PAI競馬予測さんと、ネット競馬の記事へのリンクを追加

本当のR初心者がRを始める際の順序(随時更新)

統計ソフトの「R」ですが、初心者が学ぶ際にどの順序で学んでいった良いかを記載してみます。

私も本当の初心者で試行錯誤しながら一年で身に付ける!Rと統計学・機械学習の4ステップ - iAnalysis 〜おとうさんの解析日記〜を参考にして、初学者として学んでいます。1年でこの記事のステップ4まで到達することが目標です。おすすめのがありましたら、コメントもらえると嬉しいです。

 

1 Rのインストール

 まずは、インストールしないといけないということで、

などは見ながらインストールします。インストール自体は難しくないし、インストールすればすぐに使い始められます。

2 ドットインストールで動画ではじめてみる

Webページとか、書籍とかで「絶対できる入門」とか「初心者のための」とかわかりやすそうな題名のページがあるじゃないですか。でも本当の初心者だと少し敷居が高いんですよね。

その点、ドットインストールのR言語入門(全13回)なら、実際に動かすところを見ながら自分もRを動かしてみることができるので、オススメです。約3分×全13回で変数、ベクトル、行列、リスト、データフレーム、グラフの描画などと一通りやれるのでとっかかりとしてはすごくわかりやすかったです。

2’ 「ゼロから始めるR―四則演算から多変量解析まで」を読む

 ドットインストールの動画を見るのが億劫だったり、書籍の方が馴染みやすかったらこの本をやるのもいいと思う。本当に基礎的計算や統計分析、グラフの描き方などから、多変量解析の触りまで一通りのことを教えてくれるから。この段階で挫折することはないはず。自分は2も2’も両方やったけどすんなりいけました。

時間のない人とか、ある程度知識がある人は2の段階はすっ飛ばせそう。問題は次の3から。

ゼロから始めるR―四則演算から多変量解析まで

ゼロから始めるR―四則演算から多変量解析まで

 

 

3 「Rによるやさしい統計学」でRを使いながら、統計学を学ぶ

「"Rで"統計学の初歩を(独学で)勉強できるような本」というコンセプトで書かれた本です。コンセプト通り第1部の基礎編と第2部の応用編で統計の基礎的なことを学ぶことができ、実例を踏まえ易しく書かれているので、初学者でも十分読むことができる。

多分この本を終えた段階で、統計学の本を読むと理解が進むと思っており、どの本をお勧めできるかは検討中。

Rによるやさしい統計学

Rによるやさしい統計学

 

 この本に以下の記載があり、よくわかる心理統計を一緒に読むと効果が高まるようです。 

「本書の内容は『よくわかる心理統計』の内容を取り上げています。」(中略)手元に『よくわかる心理統計』をおいて副読本として利用していただくと、さらに効果があるとおもいます(すでに『よくわかる心理統計』を読み終えたという方には、本書が演習のためのテキストとして十二分に効力を発揮するでしょう)。

よくわかる心理統計 (やわらかアカデミズム・わかるシリーズ)

よくわかる心理統計 (やわらかアカデミズム・わかるシリーズ)