So-net無料ブログ作成
検索選択

二項分布でランダムウォーク [Math]

何かと出てくるランダウウォークですが、Scilab でシミュレーションして
理解した気になりたいところですが、こればかりは式の導出を避けては通れ
なさそうなので、導出をトレースしてわかった気になろうと思います。

原点からステップ毎に確率1/2で -1 or 1 を選んで移動する現象があるとします。
ステップ回数が多いとだんだん原点から離れていきます。この現象の何が大事
なのかというとこのサイトにとてもわかりやすくまとまっていて次の3つが
挙げられています。

1. n ステップ後に x にいる確率は正規分布になる
2. 分布の幅が√n で広がっていく
3. 原点にいる確率は 1/√n で減っていく

この3つを見ておきたいと思います。

式の導出は一応自分でも手計算で確認しつつ、こちらにまとめました。

nステップ後に位置mにいる確率



式変形により正規分布の形に近似した式

a はステップ毎の移動距離。xは位置(x=a*m)。

平均0、分散μの正規分布


正規分布と比べると

と対比できるので、「分布の幅が√n で広がっていく」のがわかります。

また、原点にいる確率は

これから「原点にいる確率は 1/√n で減っていく」というのも見て取れます。
なるほど。


スターリングの公式 [Math]

最近個人的な理由で、ランダムウォークを理解するため、
二項分布から正規分布を求める式変形を理解しようとしています。
その中で出てくるスターリングの公式です。

ここで書くまでもなく、ググれば良質な情報がいくらでも出てきますが、
理解した気になるために、ここに書いておきます。



両辺の対数をとる



log(1+x)をマクローリン展開 [Math]

二項分布から正規分布を求めようとしています。
その中で log(1+x) のマクローリン展開が出てくるのでメモっておきます。

マクローリン展開はテイラー展開の x=0 の周りで展開するバージョン

テイラー展開


マクローリン展開は a=0 なので


n=3 以降は O(3) とかやって捨てるので n=2 までが必要です。
そのためには x=0 のときの log(1+x) の微分と二回微分が出てくるので計算しておきます。

log(1+x)の微分

x=0 のときは 1

log(1+x)の二回微分

x=0 のときは -1


あと log(1+x) の x=0 のときのゼロ階微分は 0。
これらを使って、log(1+x) をマクローリン展開



3乗の項以降は O(3) と書いて、最終的には捨てました。

Scilab でコイン投げの二項分布 [Math]

Scialb でシミュレートしてわかった気になるシリーズ第三弾。
コイン投げを、n 回投げて、 x 回表が出る確率の分布が二項分布。

1.n回コインを投げる
2.表が出た回数を数える
....というのを1000回繰り返して分布を描く。

n=5
binomialx_5.png

n=100
binomialx_50.png

n が大きくなるにつれて、平均=n*p、分散=n*p(1-p) ただしp=1/2 の正規分布に近づいている。
なんか嘘っぽいけど。

Scilab のコード。Github にもおいてあります。

clear;

// sampling num
samplenum=100
// number of repetition
repeat=1000;

// coin toss
R=grand(repeat,samplenum,'uin',0,1);

scf(1);
sums=sum(R,'c');
histplot([0:1:samplenum],sums)

n=samplenum;
p=1/2;

avg=n*p;
s=sqrt(n*p*(1-p))
x=[0:0.1:samplenum];
plot(x,(1/(s*sqrt(2*%pi)))*exp(-((avg-x).^2)./(2*s^2)));



コイン投げで中心極限定理 [Math]

scilab でシミュレーションしてわかった気になるシリーズ第二弾です。

コイン投げで表=1、裏=0とすると、平均値は0.5、分散は0.25。コイン投げというとなぜか n 回投げて x 回表が出る確率が二項分布になる話が多いですが、今回は平均0.5で分散が0.25/√n になるのをサクッと scilab で見てみることにします。

1.n回コインを投げる
2.平均値をプロット
....というのを100回繰り返す。

n を大きくしていくとばらつき(分散)が小さくなって、収束していく

n=10
binomial_5.png

n=100
binomial_100.png

n=500
binomial_500.png

ほんとだ、正規分布になっていて、 n が増えるほど分散が小さくなっている。

Scilab のコード。Github にもおいてあります。
clear;

// sampling num
samplenum=500;
// number of repetition
repeat=100;

// coin toss
R=grand(samplenum,repeat,'uin',0,1);
Avgs=mean(R,'r');
histplot([0:0.01:1],Avgs)

avg=1/2;
s=sqrt((1/4)/samplenum);
x=[0:0.01:1];
plot(x,(1/(s*sqrt(2*%pi)))*exp(-((avg-x).^2)./(2*s^2)));





Scilabで中心極限定理 [Math]

中心極限定理という統計学の定理がありまして、何度聞いても
わかったような、わからないような。なので Scilab でサクっと
シミュレーションして、わかった気になろうという思いです。

標本平均は一定数の観測値を集めて平均したもの。サイコロなら100回
振って出た数の平均値のこと。

この平均値をいくつも集めてると正規分布になるという。
もとの現象の分布は関係ない。サイコロはどれが出るかは1/6で
一定に分布している。でも標本平均を何回もとると正規分布になる。

真の平均値μ、分散σ^2という現象を観測していたなら、
n個の標本平均をとると、標本平均の分布は、平均μ、分散はσ^2/√n
になるという。

サイコロの場合は平均=3.5、分散=2.92。これを使って Scilab で見てみます。

1000回サイコロを振ったヒストグラムをプロット。
1roll.png

それを10回繰り返し、1回あたりの平均を取った(10このサイコロを1000回振って、
各サイコロの平均を取ったのと同じ)。
10rolls.png

繰り返しを200回にしてみた。
ついでに平均=3.5、分散=√2.92/200の正規分布を描いた。
200rolls.png

あー、なってますね。正規分布に。

グラフ作成に使った scilab のコード
clc;

// number of repetition
repeat=10;
// draw dice 10 times. and repeat it.
X=grand(1000,repeat,'uin',1,6);
// avarage of repetition
R=mean(X,'c');
// plot histgram
histplot([0:0.1:6],R);
title="Frequency distribution of dice face with " +string(repeat)+" roll(s)";
xtitle(title,"dice face","Frequency");

avg=3.5
s=sqrt(2.92/repeat);
x=[0:0.01:6];
plot(x,(1/(s*sqrt(2*%pi)))*exp(-((avg-x).^2)/(2*s^2)));


GitHub からダウンロードできます。


自由切断を実装してみた [C++]

メタルギア ライジング リベンジェンスの自由切断がかっこよすぎるので、
自分でもなんちゃって実装してみました。

テクスチャを張ったキューブを自由切断したところ
slice_cube.png

ちょっと複雑な形の物体を自由切断したところ
slice_popper.png

断面に張るポリゴンも生成します。ただし断面のテクスチャは考慮していません(座標0,0になっています)。
また、穴が開いた断面には対応していません(外枠か、中の穴かどちらかに張るだけ)。


Vertex を用意
const GLfloat data[][8] =
{
   	{ -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 0.0f, 0.0f},
   	{  0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 1.0f, 0.0f},
   	{  0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 1.0f, 1.0f},
	...
};


平面を作成

MODELVEC3D p = MODELVEC3DMake(0.0f, 1.0f, 0.0f); // any point on the plane
MODELVEC3D n = MODELVEC3DMake(1.0f, 0.0f, 0.0f); // normal vector
MODELPLANE plane = MODELPLANEMake(p,n); // make a plane


結果を受け取るバッファを用意
GLfloat bufN[MAX_CHOP_BUF][8] = {0.0f}; // vertices located in normal vector sides
GLfloat bufA[MAX_CHOP_BUF][8] = {0.0f}; // vertices located in anti-normal vector sides
int bufNCount = 0;
int bufACount = 0;


自由切断実行
Chop(plane, &(data[0][0]), sizeof(data)/8/sizeof(GLfloat), bufN, bufA, bufNCount, bufACount);


処理内容は、ひたすら面と一つ一つのポリゴン(とどのつまり直線)の計算をしているだけです。

コードはGitHub においてあります。

タッチパネル操作時のゆらぎ [iphone]

iPhoneスクリーンを、指でまっすぐ上から下になぞって、ぱっと離す。
頭ではぱっと離しているつもりでも、実は少しだけ思いもよらぬ方向に移動しています。
ぱっと離す瞬間の座標をグラフにしてみました。

ぱっと離したときの最後に取得できる座標
result.png

縦がY, 横がXです。iPhone 5s のタッチイベントの最後から2番目と、一番最後の座標(CGPoint)をプロットしました。iPhone の画面上の座標なのでYが大きい方が下向きです。

右に偏っているのはたぶん右手で操作したから。意外とまっすぐにはなっておらず、ほとんどがあさっての方向に向いています。

物体を指で動かして離すと、ある方向にアクションするというゲームを考えたとき、乱数で方向を揺らがせるのではなく、この座標から計算すればよさそうです。

データ取得に使ったものたちは Github においてあります。

iPhone アプリの LaunchImage 作成もめんどくさすぎて死にそう [Imagemagick]

LaunchImage は横着して、真ん中にアイコンをおいて、"Loading ..." という文字をつけたものにしたいが、これも何種類ものサイズを作らなければならない。ちょっと複雑なので、rmagick というのを使ってみた。

使い方は mac のターミナルで、真ん中におく icon.png を指定するだけ。
ruby ./makelaunchimage.rb icon.png

できた画像はこんな感じ。
Default-Portrait.png
Default.png

---以下 makelaunchimage.rb --
# -*- coding: utf-8 -*-
require 'RMagick'
include Magick

DEFAULT_FONT="/Library/Fonts/ヒラギノ丸ゴ\ Pro\ W4.otf"
DEFAULT_TEXT_COLOR="DodgerBlue"
DEFAULT_FONT_SIZE=20

def draw_text(draw, x, y, text, size=DEFAULT_FONT_SIZE, color=DEFAULT_TEXT_COLOR, font=DEFAULT_FONT)
  draw.font = font 
  draw.stroke = color
  draw.text(x, y, text)
  draw.pointsize=size
  draw.text_antialias = true
  draw.fill = color
end

def create_launch_image(w, h, iconfilename, outfilename)
  #load icon
  logo = Magick::Image.read(iconfilename).first

  #create base image
  image = ImageList.new
  image.new_image(w, h) {
    self.background_color = "black"
  }

  #place icon in center of base image
  x = (image.columns-logo.columns)/2  
  y = (image.rows-logo.rows)/2
  image.composite!(logo, x, y, Magick::OverCompositeOp)

  #write text
  pen = Draw.new
  draw_text(pen, x, y+logo.rows+25, "loading ...")
  pen.draw(image)

  image.write(outfilename)
end

if ARGV.length == 0 then
  printf("need to specify icon file\n")
  exit 1
end

iconfilename=ARGV[0]
if !File.exist?(iconfilename) then
  puts "#{iconfilename} does not exist"
  exit 1
end

create_launch_image(640,1136,iconfilename,"Default-568@2x.png")
create_launch_image(768,1024,iconfilename,"Default-Portrait.png")
create_launch_image(1536,2048,iconfilename,"Default-Portrait@2x.png")
create_launch_image(640,960,iconfilename,"Default.png")

---

参考
日々是鍛錬
山本隆の開発日誌

iPhone アプリのアイコン作成がめんどくさすぎて死にそう [Imagemagick]

いままでいちいち gimp を使って手でリサイズしていたが、めんどくさすぎるので ImageMagick で処理することにした。リサイズの際にシャープにしたりできるようだが、違和感なかったのでので、そこまでは対応していない。

iOS7 以降アプリのアイコンを一括生成するシェルスクリプト
第一引数にもとになる一番大きい画像を指定します。
makeicons.sh ./src.png

---- 以下 makeicons.sh ----
#!/bin/sh

if [ $# -ne 1 ]; then
    echo "need to give a source png path" 1>&2
    exit 1
fi

if ! type convert > /dev/null; then
    echo "need to install ImageMagic" 1>&2
    exit 1
fi

#Icons for Universal Apps(iOS7)
convert -resize 512x512 $1 iTunesArtwork.png
convert -resize 1024x1024 $1 iTunesArtwork@2x.png
convert -resize 120x120 $1 Icon-60@2x.png
convert -resize 76x76 $1 Icon-76.png
convert -resize 152x152 $1 Icon-76@2x.png
convert -resize 40x40 $1 Icon-Small-40.png
convert -resize 80x80 $1 Icon-Small-40@2x.png
convert -resize 29x29 $1 Icon-Small.png
convert -resize 58x58 $1 Icon-Small@2x.png

exit 0


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。