すごろく(第4回Perl入学式@東京)

Perl入学式

2019年7月13日に東京で第4回のPerl入学式が開催されました。

参加者の皆様、講師の@sironekotoro さん、サポーターの皆さんお疲れ様でした。

私はサポーターで参加させてもらいました。

内容

これまでのカリキュラムを多少変えて、第4回はひたすらリファレンスを学びます。
参加者の皆さんの中には、????という方も多かったと思いますが、復習問題を解くなどして、理解していただければなと。

すごろく

例のごとく、終了後のピザ会で@xtetsuji さんに出してもらったお題を当日20分くらいで解いてみました。

問題

  • 0から10までのマスがあり、0からスタートし、10に行けばゴールするすごろくがあります。
  • 進む距離は1〜6の細工されていないサイコロで決めます。
  • ただし、3、6、9のマスに止まった場合、スタートの0に戻されます。
  • さて、平均的にサイコロを何回振ればゴールできるでしょうか?

f:id:nishiru3:20190715215248p:plain

ポイント

サイコロの確率分布

サイコロの1回の試行で出る目の確率分布は離散一様分布になります。
nishiru3.hatenablog.com

乱数の生成

Perlで乱数を生成する事が必要になります。

条件分岐

3、6、9でスタート地点に戻るという条件をif文で再現しています。

期待値の算出

平均的に何回か?という事なので、期待値の算出になります。最終行が期待値になります。

コード

#/usr/bin/env perl
use strict;
use warnings;
use List::Util qw/sum/;

# levelが10に達するまでにサイコロを振った回数
my @number_of_trials;

for my $i (1..1000000) {
    # スタート地点は0
    my $level=0;
    # サイコロを振った数を0にする。
    my $number_of_trial = 0;
    # 1回ゴールするまでの繰り返し。
    while(1) {
        # 一様乱数(1 ~ 6)
        my $number_of_dice = int(rand(6)) + 1;
        # サイコロを振った数を一つ増やす
        $number_of_trial++;
        # サイコロの出た目だけ進める。
        $level = $level + $number_of_dice;
        # levelが3,6,9になったらスタート地点に戻す。
        if( $level == 3 || $level == 6 || $level == 9 ) {
            $level = 0;
        }
        # levelが10に達したらゴール
        if( $level >= 10 ) {
            # ゴールするのにサイコロを振った回数を配列に記録
            push @number_of_trials, $number_of_trial;
            # ループを抜ける
            last;
        }
    }

}
# ゴールするのにサイコロを振る回数の期待値
print sum(@number_of_trials)/scalar(@number_of_trials)."\n";

Vimの自動に作られるファイルを作らない

自動で作られるファイル

  • .swp
  • ~
  • .un~

.swapは変更前のファイル。変更後はファイルは削除される。

~は変更後に作られる変更前ファイル。ファイルは削除されない。

.un~はundo情報。

.vimrcの設定

  • set noswapfile
  • set nobackup
  • set noundofile

離散分布

離散分布

いくつかの代表的な離散分布についてまとめたので示しておく。

ベルヌーイ分布

nishiru3.hatenablog.com

負の二項分布

nishiru3.hatenablog.com

超幾何分布

nishiru3.hatenablog.com

偏相関係数の導出

概要

x,y,zの3変数を考える。目的変数をy、説明変数をxとし、背後にzがあると想定する。ここではzの影響を取り除いたxy相関係数、すなわち偏相関係数r_{xy,z}を導出することを目的とする。

導出

まず、x,zでの回帰を考える。x=az+bへ回帰するものとすると、係数a,bは次のとおりである。

f:id:nishiru3:20190429135539p:plain

ここに、\bar{x},\bar{z}は平均値である。この回帰式から求められるxの推定値を\hat{x}とすると残差x^{\prime}は、

f:id:nishiru3:20190429135852p:plain

である。同様にy,zでの回帰を考え、y=az+bへ回帰するものとすると、残差y^{\prime}は、

f:id:nishiru3:20190429140107p:plain

である。zの影響を取り除いたxy相関係数r_{xy,z}は上記の残差x^\primey^\prime相関係数を取ればよい。
定義式より変形して整理すると、

f:id:nishiru3:20190429140318p:plain


残差X^\primeY^\primeの平均は0であるので、

f:id:nishiru3:20190429140505p:plain

となり、E[X^\prime Y^\prime]E[X^{\prime 2}]およびE[Y^{\prime 2}]を求めればよい。

E[X^\prime Y^\prime]の計算

f:id:nishiru3:20190429140927p:plain

E[X^{\prime 2}]およびE[Y^{\prime 2}]の計算

f:id:nishiru3:20190429141159p:plain

相関係数の導出

f:id:nishiru3:20190429141313p:plain

f:id:nishiru3:20190429141350p:plain

重ね書き

よく忘れる

重ね書きをよく忘れるので、簡単な事例を書いておく。

ソース

# 重ね書き
library(ggplot2)
x <- -10:10
# 係数
a <- 0.5
b <- 1.0
# 線形関数
linear <- a * x + b
# 2次関数
quadratic <- (x - a)^2 + b
# data.frameに入れる
result <- data.frame(x,linear,quadratic)
# 可視化
ggplot(result, aes(x)) + # x軸
  geom_line(aes(y = linear,    colour = "Linear")) +
  geom_line(aes(y = quadratic, colour = "Quadratic"))

f:id:nishiru3:20181222121600p:plain