<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>singular point</title>
	<atom:link href="http://www.singularpoint.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.singularpoint.org/blog</link>
	<description>Mathematics, technologies, weblog, and my lifelog</description>
	<lastBuildDate>Fri, 18 May 2012 15:54:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<atom:link rel='hub' href='http://www.singularpoint.org/blog/?pushpress=hub'/>
		<item>
		<title>モデル選択の周辺の話の整理</title>
		<link>http://www.singularpoint.org/blog/math/stat/model-selection/</link>
		<comments>http://www.singularpoint.org/blog/math/stat/model-selection/#comments</comments>
		<pubDate>Fri, 18 May 2012 13:57:37 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[機械学習]]></category>
		<category><![CDATA[確率・統計]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2752</guid>
		<description><![CDATA[モデルを選択したり、変数を選択したり、というようなことに関係しそうなネタを簡単に整理してみた。 情報量基準 AIC / BIC / DIC / TIC のような。データのあてはまりのよさとモデルの複雑度を天秤に図るタイプ &#8230; <a href="http://www.singularpoint.org/blog/math/stat/model-selection/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>モデルを選択したり、変数を選択したり、というようなことに関係しそうなネタを簡単に整理してみた。</p>
<h3>情報量基準</h3>
<p>AIC / BIC / DIC / TIC のような。データのあてはまりのよさとモデルの複雑度を天秤に図るタイプのやつ。</p>
<p>たくさん種類があるのは確率モデルに関する仮定と汎化誤差の近似の仕方の違いによるものだと理解している。</p>
<h3>検定</h3>
<p>回帰係数が０である、という帰無仮説を検定することである変数が貢献しているかどうかを定量化するタイプのやつ。棄却されなければ「えい！」と変数を削ってしまう。</p>
<p>ささっと分析してデータの雰囲気を掴みたい時に使うことはある。</p>
<h3>L1正則化</h3>
<p>寄与度の小さな（ある閾値より小さな）係数をゼロにしてしまう、というような感じのやつ。</p>
<p>事前分布としてラプラス分布を使うことに相当。単純に寄与度が低い変数は消してしまえ！というノリなのだろうか？もっと深遠な背景があるのだろうか？勉強不足でよくわからない。</p>
<h3>ベイズモデル選択</h3>
<p>複数のモデルに事前分布を設定して、「モデルの事後分布」を計算するたぐいのもの。事後分布が求まったあとはMAPなものを選んでくるか、事後分布で平均をとってしまうか。</p>
<p>たとえばディリクレ混合過程。これはGMMのような混合モデルの混合数の事後分布を求めることができる。</p>
<p>PRMLの変分ベイズのところで出てきた関連度自動決定もこのタイプだと思っていいのだろうか。これも勉強不足により不明。</p>
<p>***</p>
<p>いろいろと抜けがあるとは思うが、とりあえずすぐに思いついたのはこれくらい。場合によっては追記します。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/math/stat/model-selection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ハイブリッドモンテカルロの実験</title>
		<link>http://www.singularpoint.org/blog/math/stat/hybrid-monte-carlo/</link>
		<comments>http://www.singularpoint.org/blog/math/stat/hybrid-monte-carlo/#comments</comments>
		<pubDate>Thu, 17 May 2012 16:00:22 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[確率・統計]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[bayes]]></category>
		<category><![CDATA[MCMC]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2719</guid>
		<description><![CDATA[相関の強い二変量正規分布に対してハイブリッドモンテカルロを使ってみた。上から順に、サンプリング結果、x1の自己相関、x2の自己相関。 自己相関ほぼ完全になし、という結果になった。ギブスサンプラーだとこうはいかない。ただし &#8230; <a href="http://www.singularpoint.org/blog/math/stat/hybrid-monte-carlo/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>相関の強い二変量正規分布に対してハイブリッドモンテカルロを使ってみた。上から順に、サンプリング結果、x1の自己相関、x2の自己相関。</p>
<p>自己相関ほぼ完全になし、という結果になった。ギブスサンプラーだとこうはいかない。ただし、</p>
<ul>
<li>微分方程式を解く時間のスケールが小さすぎると自己相関が出たので良い感じのスケールをちょっとだけ探索した。</li>
<li>ステップ幅を固定にしたら怪しげな自己相関の挙動がでた。</li>
<li>計算時間でギブスサンプラーと比較してどちらが有利かは今回は検討してません。</li>
</ul>
<p>という点は追記しておきます。</p>
<p><span id="more-2719"></span></p>
<p><a href="http://www.singularpoint.org/blog/math/stat/hybrid-monte-carlo/attachment/hybridmc/" rel="attachment wp-att-2720"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/05/hybridMC-341x1024.png" alt="" title="hybridMC" width="341" height="1024" class="aligncenter size-large wp-image-2720" /></a></p>
<p>PRML 11章 を読んで適当に実装してみた。リープフロッグのところで無駄な計算をしているので要改良。</p>
<pre class="brush: r; title: ; notranslate">
# Hybrid MC sampling
#  [Remark]
#   &quot;p&quot; in this source file is &quot;r&quot; in PRML
#   &quot;q&quot; in this source file is &quot;z&quot; in PRML

# Setting
h &lt;- 0.01
Sigma &lt;- matrix(c(3,2.5,2.5,3),nc=2)
iSigma &lt;- solve(Sigma)

# Energy : log of density function
E &lt;- function(q){
  sum(q * (iSigma %*% q)) # normal distribution
}

dE &lt;- function(q){
  2*iSigma %*% q
}

# Kinematic
K &lt;- function(p){
  sum(p^2)
}

# Hamiltonian
H &lt;- function(p,q){
  E(q) + K(p)
}

# Leapfrog method
step.leapfrog &lt;- function(p,q,h){
  p.half &lt;- p-(h/2)*dE(q)
  q.1 &lt;- q+h*2*p.half
  p.1 &lt;- p.half-(h/2)*dE(q.1)
  list(p=p.1,q=q.1)
}

#-------------
# Main
#-------------
N &lt;- 3000  # The number of sampling
R &lt;- 30    # Leapfrog step counts
q.values &lt;- matrix(rep(0,2*N),nc=2)  # Buffer
p=rnorm(2) # initial state
q=rnorm(2) # initial state
H.value &lt;- H(p,q)
for( n in 1:N){
  h &lt;- 0.01+0.1*runif(1)  # Leapfrog step size
  p.old &lt;- p
  q.old &lt;- q
  H.old &lt;- H.value
  for( i in 1:R ){
    nxt &lt;- step.leapfrog(p,q,h)
    p &lt;- nxt$p
    q &lt;- nxt$q
  }

  if( exp(H(p,q)-H.old) &lt; runif(1) ){ # rejection
    p &lt;- p.old
    q &lt;- q.old
  }

  q.values[n,] &lt;- q
  p &lt;- rnorm(2)
  H.value &lt;- H(p,q)
}

# Plotting results
par(mfrow=c(3,1))
plot(q.values,xlab=&quot;x1&quot;,ylab=&quot;x2&quot;,main=&quot;Result of hybrid MC sampler&quot;,pch=20,col=&quot;gray&quot;)
acf(q.values[,1],main=&quot;Auto-correlation function of x1&quot;)
acf(q.values[,2],main=&quot;Auto-correlation function of x2&quot;)
dev2bitmap(file=&quot;hybridMC.jpg&quot;,width=6,height=18,gaa=4,taa=4)
</pre>
<p>関連エントリ：<a href="http://www.singularpoint.org/blog/r/hamilton-system-prml-ch11/" title="ハミルトン系の数値計算 (PRML11章)">ハミルトン系の数値計算 (PRML11章)</a></p>
<p>↓ PRML<br />
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4431100318/singularpoint-22/ref=nosim/" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41vr-Ss6KPL._SL160_.jpg" alt="パターン認識と機械学習 下 - ベイズ理論による統計的予測" /></a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/math/stat/hybrid-monte-carlo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>対数線形モデルとエントロピー最大化の関係</title>
		<link>http://www.singularpoint.org/blog/math/optimization/logit-maximum-entoropy/</link>
		<comments>http://www.singularpoint.org/blog/math/optimization/logit-maximum-entoropy/#comments</comments>
		<pubDate>Thu, 17 May 2012 13:45:35 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[最適化]]></category>
		<category><![CDATA[機械学習]]></category>
		<category><![CDATA[確率・統計]]></category>
		<category><![CDATA[DiscreteChoiceModel]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[proof]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2662</guid>
		<description><![CDATA[昔の勉強ノートを引っ張りだしてくるシリーズ． 機械学習の対数線形モデルが最大エントロピー法とも呼ばれる，みたいな記述は頻繁に目にするし，統計力学のボルツマン分布の話とか考慮すれば，なんとなくそうなってそうな気はするけど， &#8230; <a href="http://www.singularpoint.org/blog/math/optimization/logit-maximum-entoropy/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昔の勉強ノートを引っ張りだしてくるシリーズ．</p>
<p>機械学習の対数線形モデルが最大エントロピー法とも呼ばれる，みたいな記述は頻繁に目にするし，統計力学のボルツマン分布の話とか考慮すれば，なんとなくそうなってそうな気はするけど，実際どうなの？というのを (たんに好奇心を満たすために) 調べてみた．実用上は何の意味ないと思う．</p>
<p>対数尤度関数に L1 正則化項を加えるタイプの目的関数を使った場合，もはやエントロピーは最大化されない，とかそういうわりとどうでもいいことがわかったりするかもしれない．</p>
<h3>概要</h3>
<p>「言語処理のための機械学習入門 (→ <a href="http://www.amazon.co.jp/exec/obidos/ASIN/4339027510/singularpoint-22/ref=nosim/" target="_blank">amazon</a>) 」などに出てくるタイプの<u>対数線形モデルの係数の最尤推定量が，エントロピーを「ある制約条件下」で最大化した場合のラグランジュ未定乗数に対応する</u>ことを説明する (クロス表の対数線形モデルとはたぶん別物)．</p>
<p>ただし，記号が煩雑になるのを避けるため，対数線形モデルとほぼ同一の構造を持ち，記号が煩雑でない条件付きロジットモデルがエントロピー最大化と等価であることを見る．</p>
<p>本文の最後に対数線形モデルと等価なエントロピー最大化問題を示す．多少ややこしくなるが，同じ方針で証明可能．<br />
<span id="more-2662"></span></p>
<h3>設定</h3>
<p>あるカテゴリーの製品群 \(\{1,2,\cdots,K\}\) のどれかを購入した消費者に対して，<br />
ランダムサンプリングを行って購入製品を調査したところ，以下のようなデータが得られたとする．</p>
<table>
<tr>
<td>製品番号</td>
<td>1</td>
<td>2</td>
<td>…</td>
<td>\(K\)</td>
</tr>
<tr>
<td>価格</td>
<td>\(c_1\)</td>
<td>\(c_2\)</td>
<td>…</td>
<td>\(c_K\)</td>
</tr>
<tr>
<td>人数</td>
<td>\(n_1\)</td>
<td>\(n_2\)</td>
<td>…</td>
<td>\(n_K\)</td>
</tr>
<p>表：市場のランダムサンプリングによって得られた購入人数データ<br />
</table>
<p>ここで全サンプル数を \(N=n_1+n_2+\cdots+n_K\) としておく．</p>
<h3>エントロピーの最大化</h3>
<p>製品 \(i\) の購入確率を \(p_i\) と書くことにする．天下り的に以下のエントロピー最大化問題を考える．<br />
\begin{align}<br />
\text{maximize}\qquad&#038;-\sum_{i=1}^K\;p_i\log p_i\\<br />
\text{subject to}\qquad &#038; \sum_{i=1}^K\;p_i=1\\<br />
&#038; \sum_{i=1}^K\; c_ip_i=\bar c<br />
\end{align}<br />
ここで，サンプル内の平均購入価格を<br />
\begin{align}<br />
\bar c=\frac1N\sum_{i=1}^K n_ic_i<br />
\end{align}<br />
と定義した．一つ目の制約条件は確率の正規化条件，二つ目はランダムサンプリングによって観測された価格を再現するための制約条件．</p>
<p>以下，これをラグランジュ未定乗数法でまじめに解く．<br />
\begin{align}<br />
L=-\sum_{i=1}^K\;p_i\log p_i+\mu\bigg(1-\sum_{i=1}^K \; p_i\bigg) + \lambda\bigg(\sum_{i=1}^K c_ip_i-\bar c\bigg)<br />
\end{align}<br />
として，\(p_i\) で微分してゼロと置けば<br />
\begin{align}<br />
-\log p_i &#8211; 1 + \mu + \lambda c_i = 0<br />
\end{align}<br />
となり，式変形すれば<br />
\begin{align}<br />
p_i = \exp(\mu-1+\lambda c_i)<br />
\end{align}<br />
となる．これを正規化条件に代入すれば，<br />
\begin{align}<br />
\exp(\mu-1) = \bigg(\sum_{i=1}^K\exp(\lambda c_i)\bigg)^{-1}<br />
\end{align}<br />
を得るので，<br />
\begin{align}<br />
p_i=\frac{\exp(\lambda c_i)}{\sum_{i=1}^K\exp(\lambda c_i)}<br />
\end{align}<br />
を得る．これは条件付きロジットの式になっている．</p>
<p>もう一つの未定乗数 \(\lambda\) については，この \(p_i\) を制約条件に代入することにより，<br />
\begin{align}<br />
\sum_{i=1}^K(c_i-\bar c)\exp(\lambda c_i)=0<br />
\end{align}<br />
の解になっていることがわかる．これは一般には数値計算で求めるしかないので，ひとまずここで計算を止め，この解を \(\lambda^*_{E}\) と書くことにする．</p>
<p>以上で最大エントロピー原理を仮定することで製品の選択確率が結果として条件付きロジットになることがわかった．そしてそのラグランジュ未定乗数 \(\lambda\) は条件付きロジットの係数に対応することもわかった．</p>
<h3>条件付きロジットの最尤推定</h3>
<p>条件付きロジットによる最尤推定が，上で得た未定乗数 \(\lambda^*_{E}\) と等しいことを示す．</p>
<p>条件付きロジットモデル<br />
\begin{align}<br />
p_i=\frac{\exp(\lambda c_i)}{\sum_{i=1}^K\exp(\lambda c_i)}<br />
=\frac{\exp(\lambda c_i)}{Z(\lambda)}<br />
\end{align}<br />
の最尤推定量 \(\lambda^*_{MLE}\)は<br />
\begin{align}<br />
\prod_{i=1}^K \;\;p_i^{n_i} = \prod_{i=1}^K \bigg(\frac{\exp(\lambda c_i)}{Z(\lambda)}\bigg)^{n_i}<br />
\end{align}<br />
を最大化する \(\lambda\) である．対数をとると，<br />
\begin{align}<br />
-N\log Z(\lambda) + \sum_{i=1}^Kn_i\lambda c_i<br />
\end{align}<br />
となるので(\(N\) はサンプル数)，\(\lambda\) で微分して右辺をゼロと置くと<br />
\begin{align}<br />
-N \frac{Z&#8217;(\lambda)}{Z(\lambda)} + \sum_{i=1}^Kn_ic_i=0<br />
\end{align}<br />
となる．式変形をして<br />
\begin{align}<br />
\quad&#038;-Z&#8217;(\lambda) + Z(\lambda)\cdot\frac1N\sum_{i=1}^Kn_ic_i=0\\<br />
\Longleftrightarrow\quad&#038;-Z&#8217;(\lambda) + Z(\lambda)\cdot \bar c=0\\<br />
\Longleftrightarrow\quad&#038;\sum_{i=1}^K(c_i-\bar c)\exp(\lambda c_i)=0<br />
\end{align}<br />
となる．この非線形方程式を解けば \(\lambda^*_{MLE}\) を求めることができる．</p>
<p>この非線形方程式はエントロピーの最大化によるラグランジュ未定乗数である \(\lambda^*_E\) を求めるために上で導出したものと同じものである．従って<br />
\begin{align}<br />
\lambda^*_{MLE}=\lambda^*_E<br />
\end{align}<br />
が示された．</p>
<h3>対数線形モデルと等価なエントロピー最大化問題</h3>
<p>データ \(\{(\boldsymbol{x}_j, i_j)\}_{j=1}^N\) と素性関数 \(\boldsymbol\phi\) が与えられた時，対数線形モデルの最尤推定量は以下のエントロピー最大化問題のラグランジュ未定乗数に対応する．K はクラス数である．<br />
\begin{align}<br />
\text{maximize} \qquad<br />
&#038;-\sum_{i=1}^K\sum_{j=1}^NP(i|\boldsymbol{x}_j)\log P(i|\boldsymbol{x}_j)\\<br />
\text{subject to} \qquad<br />
&#038;<br />
\sum_{i=1}^K P(i|\boldsymbol{x}_j)=1\qquad \forall j=1,\cdots,N\\<br />
&#038;<br />
\frac1N\sum_{j=1}^N\bigg[\sum_{i=1}^K \boldsymbol{\phi}(\boldsymbol{x}_j,i)P(i|\boldsymbol{x}_j)\bigg]<br />
=\frac1N\sum_{j=1}^N\boldsymbol{\phi}(\boldsymbol{x}_j,i_j)<br />
\end{align}<br />
２つ目の制約式の右辺は素性のデータ平均になっている．データ平均とモデル平均が一致するような制約条件．</p>
<h3>まとめ</h3>
<p>条件付きロジットモデルとエントロピーの最大化の関係をみた．説明変数が複数のときには、エントロピー最大化の制約条件が複数になるだけで本質的に同じになる．どうでもいいことだが，機械学習でよくやるような対数尤度関数に L1 正則化項を加えるタイプの目的関数を使った場合，エントロピーは最大化されない（もちろん L2 でも同じ）．</p>
<h3>蛇足：統計力学との関連</h3>
<p>価格を状態のエネルギーと置き直せば，ボルツマン分布のはなしと同じこと．エネルギー一定の条件下でエントロピーを最大化するとボルツマン分布が導出される，というアレを単に言い換えただけです．この場合のラグランジュ未定乗数は温度の逆数に比例するような定数になる．</p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/math/optimization/logit-maximum-entoropy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>チューリングマシンと限定合理性 : 「行動ゲーム理論入門」を読んだ</title>
		<link>http://www.singularpoint.org/blog/book/behavioral-game-theory/</link>
		<comments>http://www.singularpoint.org/blog/book/behavioral-game-theory/#comments</comments>
		<pubDate>Wed, 09 May 2012 17:02:21 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[本]]></category>
		<category><![CDATA[機械学習]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[ComputerScience]]></category>
		<category><![CDATA[economics]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2628</guid>
		<description><![CDATA[この本「行動ゲーム理論入門」はたまたま本屋で見かけてパラパラと見ていたら、経済学の本にもかかわらず「チューリングマシン」だとか「強化学習」だとかいう一見経済学とは関連の薄そうな単語があったので、興味深いな、と思って脊髄反 &#8230; <a href="http://www.singularpoint.org/blog/book/behavioral-game-theory/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>この本「行動ゲーム理論入門」はたまたま本屋で見かけてパラパラと見ていたら、経済学の本にもかかわらず「<strong>チューリングマシン</strong>」だとか「<strong>強化学習</strong>」だとかいう一見経済学とは関連の薄そうな単語があったので、興味深いな、と思って脊髄反射的に購入した。僕はこの分野は全く知らない状態でこの本を読み始めたのだけど、非常に刺激的な本だったので記憶が鮮明なうちに書いておくことにする。</p>
<div class="azlink-box" style="margin-bottom:0px;">
<div class="azlink-image" style="float:left"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4757122586/singularpoint-22/ref=nosim/" name="azlinklink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/414ZpLD-OSL._SL160_.jpg" alt="行動ゲーム理論入門" style="border:none" /></a></div>
<div class="azlink-info" style="float:left;margin-left:15px;line-height:120%">
<div class="azlink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4757122586/singularpoint-22/ref=nosim/" name="azlinklink" target="_blank">行動ゲーム理論入門</a>
<div class="azlink-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted at 2012.5.9</div>
</div>
<div class="azlink-detail">川越 敏司<br />エヌティティ出版</div>
<div class="azlink-review" style="margin-top:10px;margin-bottom:10px"></div>
<div class="azlink-link" style="margin-top:5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4757122586/singularpoint-22/ref=nosim/" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="azlink-footer" style="clear:left"></div>
</div>
<p><span id="more-2628"></span></p>
<h3>ゲーム理論</h3>
<p>ゲーム理論をすこしかじったことがあればご存知のように</p>
<ul>
<li>ジョン・ナッシュが「ナッシュ均衡」という概念を提唱して、</li>
<li>不動点定理を使って混合戦略ナッシュ均衡のの存在を証明した、</li>
</ul>
<p>というのは有名すぎる事実。映画「ビューティフル・マインド」の主人公としてご存じの方も多いと思う。</p>
<p>「行動ゲーム理論入門」はナッシュ均衡のその先の展開について非常にわかりやすく書かれた本ということになる。以下、この本のさわりの部分を自分なりに要約してみる。</p>
<h3>合理的エージェントの世界</h3>
<p>そもそも、古典的な経済学に出てくる経済活動をする人たち（エージェント）は「合理的」であるとされる。彼らは合理的なスーパーマンなのでゲームが与えられたら、ただちにナッシュ均衡を「計算」して、自分のとるべき行動を決定する。</p>
<p>これが何を意味するのか。例えば 6&#215;6 オセロ<sup>[<a href="#behavioral-game-theory-n-1" class="footnoted" id="to-behavioral-game-theory-n-1">1</a>]</sup>のような「ゲーム」を考えてみよう。これは実は後手必勝になることが証明されている。つまり、合理的なエージェント同士が（お金をかけて）対戦すれば、かならず後手が勝利することを意味している。</p>
<h3>計算資源の有限性</h3>
<p>問題がどこにあるのか？といえば、 6&#215;6 オセロの証明はコンピュータを二週間走らせ続けることで証明された（1994年）、ということだ。これは「ふつうの」人間業なのだろうか？という疑問からこの本はスタートする。</p>
<p>この疑問を一般化しよう。原理的には解（最善手）が存在するけれども、それを求めることがチューリングマシンの意味で不可能となるような問題、<strong>ようするに「アルゴリズムを構成することができない問題」に対しても、最善手を見つけてしまうような「彼ら」は経済活動を行う人間のモデルとして妥当なのだろうか？</strong></p>
<p>このような考察から、人間＝エージェントは神のごとく無限の計算能力をもつものとしてではなく、有限の計算資源を持った「<strong>限定合理的</strong>なエージェント」としてモデル化されるべきだ、と「結論」されることになる。こういう論理展開にはしびれまくる。</p>
<p>ただし、個人的な意見として、人間の計算能力をどの程度か、と仮定するのは一般論としては非常に微妙な問題も含んでいる思う。チューリングマシンと高々同程度だ、という考え方は（特に根拠はないが）個人的には妥当というか、むしろ目からウロコが落ちる感じがしたが、一部の人々にとっては議論を呼びそうな内容かもしれない。</p>
<p>アレゲな人たちだけではなく、まっとうな科学者の間でも意見がわかれそうだ（とはいえ「<a href="http://staff.aist.go.jp/y-ichisugi/rapid-memo/brain-computer.html">脳とコンピュータの違い</a>」によればチューリングマシンとみなすことにはそれなりの妥当性がありそうでもあるが）。</p>
<h3>その後の展開</h3>
<p>この後、話は均衡に吸い込まれるための力学系の話や、さらにエージェントの行動決定が強化学習／信念学習によって学習されるケースの考察など興味深い話題を経て、非効率な均衡を制度の設計によって解消するための方法論である「メカニズムデザイン」まで話は及ぶ。どの章も非常に平易に書かれていて、かつ興味深いものばかり。</p>
<h3>まとめ</h3>
<p>ということで、知的好奇心を最大限に満足する本でした。この本が経済学者にとって有益かどうかは（僕は経済学者じゃないから）わからないけど、人の行動に日々頭を悩ます企業のマーケティング担当者とか、ゲームデザイナーとか、スマホアプリ開発者など「人間の行動に深く関わる技術者」が読んでみてもいいんじゃないだろうか。得るものは必ずあると思う（ただし、ある程度理論が好きな人に限るとは思うが）。</p>
<p>最後に余談というかメモ。世の中の現実的な問題は均衡から逸脱して極めて複雑でダイナミックな挙動をしめすような例が少なくない。例えば</p>
<ul>
<li>Google と SEOスパマーとのイタチごっこ</li>
<li>予測不可能な非定常性を示す交通渋滞</li>
</ul>
<p>などなど。こういった扱いづらいものたちを単純に統計学・機械学習の問題として扱ってしまうのではなく、人間が相互作用しあうゲーム理論という視点から眺めてみると見通しがよくなることもあるかな、というのがこの本を読んだ教訓。</p>

<ol class="footnotes">
	<li class="footnote" id="behavioral-game-theory-n-1"><strong><sup>[1]</sup></strong> 原著では実際にはヘックスという別のゲームを使って詳細な説明がなされている。 <a class="note-return" href="#to-behavioral-game-theory-n-1">&#x21A9;</a></li></ol>
]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/book/behavioral-game-theory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google検索時に出てくるevernoteのアレの位置を変更する</title>
		<link>http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/</link>
		<comments>http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/#comments</comments>
		<pubDate>Mon, 07 May 2012 14:48:51 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[Evernote]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[検索エンジン]]></category>
		<category><![CDATA[evernote]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2598</guid>
		<description><![CDATA[Chrome で evernote プラグインを使ってるときに google 検索すると evernote の検索結果も同時に出てくるアレの話です。ピンとこない人は関係ないはずです。 あの検索結果は個人的には結構便利だと &#8230; <a href="http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Chrome で evernote プラグインを使ってるときに google 検索すると evernote の検索結果も同時に出てくるアレの話です。ピンとこない人は関係ないはずです。</p>
<p>あの検索結果は個人的には結構便利だとは思うのですが、レイテンシがわりと大きいため、一番上のリンクをクリックしようとした瞬間にあの水色のボックスが出現したりすることが多いのが少し困る。</p>
<p>かといって機能を切ってしまうのもなんとなく忍びないのですこし改良してみた。最初は javascript だけでやろうとしたけど、手持ちの chrome には stylebot という拡張機能がついていたのでそれを使うことにした。<br />
<span id="more-2598"></span></p>
<h3>どんなふうに変化するか</h3>
<p>こんな感じの画面が<br />
<a href="http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/attachment/google-evernote-1/" rel="attachment wp-att-2600"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/05/google-evernote-1.png" alt="" title="google-evernote-1" width="1094" height="853" class="aligncenter size-full wp-image-2600" /></a></p>
<p>こうなります。これで水色のこいつが急に現れても動じなくてよくなります。<br />
<a href="http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/attachment/google-evernote-2/" rel="attachment wp-att-2599"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/05/google-evernote-2.png" alt="" title="google-evernote-2" width="1094" height="853" class="aligncenter size-full wp-image-2599" /></a></p>
<h3>やりかた</h3>
<p>googleで適当に検索して右クリック → stylebot(なければインストールしておく) → Style Element</p>
<p>とすると html の要素が選択できるので例の水色のアレを選択して、右下の Advanced をクリック。右上のIDが #evernoteResultStatsMessage になっていることを確認する。だいたい下のような感じの画面のハズ。</p>
<p><a href="http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/attachment/evernote-google-3/" rel="attachment wp-att-2605"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/05/evernote-google-3.png" alt="" title="evernote-google-3" width="1095" height="930" class="aligncenter size-full wp-image-2605" /></a></p>
<p>そして、下のような感じでお好みのスタイルを右側の CSS for selected element(s) の下側にコピペすればOK。</p>
<p>width: 450px;<br />
position: fixed;<br />
bottom: 50px;<br />
left: 760px;</p>
<p>これで完了。便利か便利じゃないかはよくわかりません。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/search-engine/google-evernote-search-hack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rで階段プロットを書く</title>
		<link>http://www.singularpoint.org/blog/r/r-plot-step-function/</link>
		<comments>http://www.singularpoint.org/blog/r/r-plot-step-function/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 15:30:18 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[StatGraphic]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2570</guid>
		<description><![CDATA[知らなかったのでメモ。Rで階段プロットを書くには type=&#8221;s&#8221; を指定する。 以下は経験累積分布関数を書くためのコード片。 こんな図が書ける。 ほかにも type=&#8221;S&#8221 &#8230; <a href="http://www.singularpoint.org/blog/r/r-plot-step-function/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>知らなかったのでメモ。Rで階段プロットを書くには type=&#8221;s&#8221; を指定する。</p>
<p>以下は経験累積分布関数を書くためのコード片。</p>
<pre class="brush: r; title: ; notranslate">
cumplot &lt;- function(x,...){
  plot(sort(x),(1:length(x))/length(x),type=&quot;s&quot;,...)
}

cumplot(rnorm(100),xlab=&quot;&quot;,ylab=&quot;&quot;,xlim=c(-3,3))
curve(pnorm,add=T,col=2)
legend(&quot;topleft&quot;,legend=c(&quot;empirical CDF&quot;,&quot;normal CDF&quot;),
       lt=1,col=1:2)
</pre>
<p>こんな図が書ける。<br />
<a href="http://www.singularpoint.org/blog/r/r-plot-step-function/attachment/normal_cumplot/" rel="attachment wp-att-2573"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/04/normal_cumplot.png" alt="" title="normal_cumplot" width="504" height="360" class="aligncenter size-full wp-image-2573" /></a></p>
<p>ほかにも type=&#8221;S&#8221; (大文字) なんてのがあって、だいたい同じなんだけど、S は上にずれる。経験累積分布の場合は小文字 s が正解。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/r/r-plot-step-function/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CRPのテーブルの数の分布</title>
		<link>http://www.singularpoint.org/blog/r/crp-numtable-distribution/</link>
		<comments>http://www.singularpoint.org/blog/r/crp-numtable-distribution/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 15:27:27 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[確率・統計]]></category>
		<category><![CDATA[bayes]]></category>
		<category><![CDATA[ProbablityDistribution]]></category>
		<category><![CDATA[StatGraphic]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2524</guid>
		<description><![CDATA[Chinese Restaurant Process (→ 以前の記事) でデータ数(レストランに来る人数/壺からボールを取り出す回数)や \(\alpha\) が変化した時に利用されるテーブルの数の分布がどうなるか実験 &#8230; <a href="http://www.singularpoint.org/blog/r/crp-numtable-distribution/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Chinese Restaurant Process (→ <a href="http://www.singularpoint.org/blog/math/stat/crp-generation/">以前の記事</a>) でデータ数(レストランに来る人数/壺からボールを取り出す回数)や \(\alpha\) が変化した時に利用されるテーブルの数の分布がどうなるか実験してみた(下の図をクリックで拡大)。</p>
<p><a href="http://www.singularpoint.org/blog/r/crp-numtable-distribution/attachment/crptable_number_dist/" rel="attachment wp-att-2526"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/04/CRPtable_number_dist.png" alt="" title="Chinese Restaurant Process でデータ数(レストランに来る人数)やαが変化した時に利用されるテーブルの数の分布" width="864" height="864" class="aligncenter size-full wp-image-2526" /></a><br />
<span id="more-2524"></span></p>
<ul>
<li>一見、ポアソン分布っぽいが、どれも平均＞分散となっていて underdispersion ぎみ。</li>
<li>\(\alpha\) が小さいとテーブルの数は少なく、大きくなるにつれてテーブルの数の平均、分散は増加する</li>
<li>レストランを訪れる人数(図ではdata size)が増加するとやはりテーブルの数の平均、分散は増加する。しかし増加の仕方はゆっくり(平均、分散ともに理論値がわかる。増加の仕方は漸近的に対数 → 記事の一番下の補足)。</li>
<li>【わかること】CRPを事前分布として使うときは、潜在クラスタの数の事前分布をこの分布のように仮定していることになる。data size は与えられたデータの数なので変更不可。\(\alpha\) を使って事前知識をモデル化するが、１パラメータなので平均と分散の両方を独立に制御することはできない。実際、データ数10000で\(\alpha=3\)とすると、潜在クラス数が5個以下の可能性をほとんど排除していることになる(右下の図)</li>
</ul>
<p>実験に使ったR的なスクリプト。</p>
<pre class="brush: r; title: ; notranslate">
#--------------------------------------------------
# CRP で確保されるテーブルの数の分布に関する実験

CRP_probs &lt;- function(size,alpha){
  alpha/((1:size)-1+alpha)
} # Polyaの壺的な確率を返す

rCRP_numLatentClass &lt;- function(n, size, alpha=1){
  probs &lt;- CRP_probs(size,alpha)
  sapply(1:n,function(i) sum(runif(size) &lt; probs))
}  # テーブルの数をサンプリングするだけならこれだけでOK

numLC_theoretical &lt;- function(size,alpha){
  pp &lt;- CRP_probs(size,alpha)
  list(mean=signif(sum(pp),3),var=signif(sum(pp*(1-pp)),3))
}  # テーブルの数の平均、分散の理論値を返す

#--- Main ---

library(MASS)
par(mfrow=c(3,3))
xlab &lt;- &quot;Number of tables allocated in CRP&quot;
for(alpha in c(0.5,1,3)){
  for(datasize in 10^(2:4)){
    # テーブル数のシミュレーション10000回
    num.table.simulated &lt;- rCRP_numLatentClass(10000,datasize,alpha)
    # 理論的な平均、分散を計算
    theo &lt;- numLC_theoretical(datasize,alpha)

    # プロット
    truehist(num.table.simulated,xlim=c(0,40),ylim=c(0,0.3),h=1,xlab=xlab)
    text(20,0.3,paste(&quot;data size =&quot;,datasize,&quot;/ alpha =&quot;,alpha),cex=2)
    text(30,0.27,paste(&quot;mean =&quot;,theo$mean,&quot;/ sdv =&quot;,signif(sqrt(theo$var),3)),cex=1.2)
  }
}
</pre>
<h3>補足、というか疑問</h3>
<p>よく、テーブル数の平均値は漸近的に \(\alpha\log n/\alpha\) になる、みたいなことが書いてあるけど、級数を使えば厳密計算可能なのでここではそちらを採用している。<br />
\begin{align*}<br />
E[\text{# of tables}]=\sum_{i=1}^n\frac{\alpha}{\alpha-1+i} \sim \alpha\log n/\alpha\qquad (n\to\infty)<br />
\end{align*}<br />
という漸近挙動。同様に分散も厳密計算可能。<br />
\begin{align*}<br />
V[\text{# of tables}] = \sum_{i=1}^n\frac{\alpha}{\alpha-1+i}\bigg(1-\frac{\alpha}{\alpha-1+i}\bigg) \sim ??\qquad (n\to\infty)<br />
\end{align*}<br />
この右辺がどうなるかわからない。数値的には対数的な挙動になることをチェック済み。なんとなく、てきとうな定数に対して \(C+\alpha\log n/\alpha\) になりそうな気がするが。</p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/r/crp-numtable-distribution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rにおける値渡しと参照渡し (2)</title>
		<link>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/</link>
		<comments>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 11:58:28 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[reminder]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2500</guid>
		<description><![CDATA[昨日の記事を書いたあと、twitter で tracemem 使うといいよ、と教えていただきました (@sfchaosさん、ありがとうございました！）。 この関数ははじめて知ったのですが、ヘルプを見て意訳すると以下の様な &#8230; <a href="http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.singularpoint.org/blog/r/r-call-by-value-or-reference/" title="Rにおける値渡しと参照渡し">昨日の記事</a>を書いたあと、twitter で tracemem 使うといいよ、と教えていただきました (@sfchaosさん、ありがとうございました！）。</p>
<p>この関数ははじめて知ったのですが、ヘルプを見て意訳すると以下の様な感じです。</p>
<blockquote><p>tracemem(x) を実行すると x について duplicate (複製)が生じた時にメッセージを表示する。これは2つのオブジェクトがメモリを共有している場合において、1つが変更された時に生じる。ちなみに untracemem(x) でメッセージフックを解除できる。</p></blockquote>
<p>ということで関数の内部でコピーが起きたか、を判別するのにピッタリです。</p>
<p>今回の内容：</p>
<ul>
<li>tracemem を使って値渡し、参照渡しを確かめる</li>
<li>参照渡しなのか、値渡しなのか、が確定するタイミングについて考える</li>
</ul>
<h3>tracemem を使った方法</h3>
<p>以下の方法は @sfchaos さんに教えてもらった方法そのままです。前回同様、prod1 は行列 A について値渡しになりそうな関数で、prod2 は参照渡しになりそうな関数です。</p>
<pre class="brush: r; title: ; notranslate">
prod1 &lt;- function(A,x){
  A &lt;- A + diag(x)
  A %*% x
}

prod2 &lt;- function(A,x){
  A %*% x
}

N &lt;- 1000
A &lt;- matrix(rnorm(N*N),nc=N)
x &lt;- rnorm(N)

tracemem(A)
# =&gt; [1] &quot;&lt;0x7e790008&gt;&quot;
invisible(prod1(A,x))  # invisible は結果を print しないようにする関数
# =&gt; tracemem[0x7e790008 -&gt; 0x7dfe0008]: prod1  # コピーが発生した！

invisible(prod2(A,x))
# =&gt; 何も表示されない！＝コピーが生じていない！
</pre>
<p>ということで、前回は実行時間から推論しただけでしたが、やはり引数を変更するとコピーが生じる、ということで間違いないことが確認できました。</p>
<h3>複製はどのタイミングで生じるのか？</h3>
<p>前回、以下のように書きました。</p>
<blockquote><p>そして、引数が変更されるかされないかはパースした段階でわかる(なのでパースの段階で値渡しか参照渡しかを判別することが可能)</p></blockquote>
<p>ですが、<strong>これは誤りでした</strong>。実際、以下のような関数はパースの段階で値渡しか参照渡しかを判別できるでしょうか？</p>
<pre class="brush: r; title: ; notranslate">
prod3 &lt;- function(A,x,add=T){
  if(add) A &lt;- A + diag(x)
  A %*% x
}
</pre>
<p>add が真のときは引数が変更されて、偽のときは引数が変更されません。</p>
<p>これをパースの時点で判別しようとすると、Rの副作用を作らないという原則から add がいかなる値であろうともコピーを行うことになるはずです。</p>
<p>もう一つの可能性としては、実際に変更が起きたその瞬間にコピーを作る、というものがありえるでしょう。</p>
<p>実験してみます。</p>
<pre class="brush: r; title: ; notranslate">
N &lt;- 1000
A &lt;- matrix(rnorm(N*N),nc=N)
x &lt;- rnorm(N)

tracemem(A)
# =&gt; [1] &quot;&lt;0x7dfe0008&gt;&quot;

invisible(prod3(A,x,add=T))
# =&gt; tracemem[0x7dfe0008 -&gt; 0x7ef40008]: prod3

invisible(prod3(A,x,add=F))
# =&gt; 何も表示されない！＝コピーが生じていない！
</pre>
<p>同じ関数でも引数の状態によってコピーが発生したり、しなかったり。add=F のときは prod3 の if の内部まで進まないため、A が変更されず、したがってコピーが発動しない、ということになります。</p>
<p>つまりRは</p>
<ul>
<li>引数のコピーを作るか(値渡しか)、作らないか(参照渡しか)は実際に引数が変更される瞬間ギリギリまで判別しない、</li>
<li>変更される瞬間(直前？)で重い腰を上げてコピーを作成する(<strong>遅延評価</strong>)</li>
</ul>
<p>という挙動をしているようですね。</p>
<h3>まとめ</h3>
<ul>
<li>Rは基本的には値渡しであり、C++のように引数として与えられた変数を変更することで外側の世界に影響させることはできない</li>
<li>関数内部で引数を変更しない場合は、コピーが生じない (C++ の const&amp; のようなイメージ)</li>
<li>関数内部に引数を変更するコードがあったとしても、実際に引数が変更される段まではコピーは生じない (遅延評価)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rにおける値渡しと参照渡し</title>
		<link>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference/</link>
		<comments>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 13:44:11 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[reminder]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2489</guid>
		<description><![CDATA[Rの関数に引数を渡すと値渡しになる、とずっと信じていたわけだけど、どうも違うらしい。Rはどうやら「自動的に」値渡しすべきか、参照渡しにすべきか、を判断しているようだ。 C++みたいな言語では「フツーに」引数を渡すと全部値 &#8230; <a href="http://www.singularpoint.org/blog/r/r-call-by-value-or-reference/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Rの関数に引数を渡すと値渡しになる、とずっと信じていたわけだけど、どうも違うらしい。Rはどうやら「自動的に」値渡しすべきか、参照渡しにすべきか、を判断しているようだ。</p>
<p>C++みたいな言語では「フツーに」引数を渡すと全部値渡しになって(特に行列のような巨大なオブジェクトを渡す場合には)効率が悪いので、ポインタや参照で渡したり、副作用を気にする場合は const 参照で渡したりする。</p>
<p>さて、上で述べた R の自動判断機能は以下のような事実に基づくようだ。</p>
<ul>
<li>そもそも値渡しは関数に引数を渡した段階でオブジェクトのコピーを生成して「引数として渡された変数を関数の内部で変更してもスコープの外では値が変更されない」ことを保証するのだが、</li>
<li>オブジェクトが関数の内部で変更されないことが保証されるならば「関数の実行中はスコープの外でも値が変更されない」ことは保証されるのでコピーをそもそも生成する必要がない、</li>
<li><del datetime="2012-04-13T11:55:10+00:00">そして、引数が変更されるかされないかはパースした段階でわかる(なのでパースの段階で値渡しか参照渡しかを判別することが可能)</del> → 間違いでした。詳細は<a href="http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/" title="Rにおける値渡しと参照渡し(2)">Rにおける値渡しと参照渡し(2)</a>に書きました。</li>
</ul>
<h3>実験</h3>
<p>これは以下のようにして確かめることができる、はず。</p>
<pre class="brush: r; title: ; notranslate">
prod1 &lt;- function(A,x){
  A[1,1] &lt;- A[1,1] + 1
  A %*% x
}

prod2 &lt;- function(A,x){
  x[1] &lt;- x[1] + 1
  A %*% x
}
</pre>
<ul>
<li>prod1, prod2 はともに引数として渡された行列 A とベクトル x の積を計算する</li>
<li>prod1 では A[1,1] に 1 を加える</li>
<li>prod2 では x[1] に 1 を加える(これはprod1の代入作業のコストと揃えるため)</li>
<li>その後、積を計算する</li>
</ul>
<p>ということをやっているのだが、上で述べたようなことがただしければ、</p>
<ul>
<li>prod1 では行列 A のコピーが発生し</li>
<li>prod2 ではベクトル x のコピーが発生する</li>
</ul>
<p>ため、より巨大なオブジェクトを渡すことになる prod1 が (生じる四則演算の数は同一にもかかわらず) 大幅に遅くなることが予測される。</p>
<p>実際、1000 x 1000 程度の行列を考えると以下の様な結果が得られる。</p>
<pre class="brush: r; title: ; notranslate">

N &lt;- 1000
A &lt;- matrix(rnorm(N*N),nc=N)
x &lt;- rnorm(N)

system.time( for(i in 1:1000) prod1(A,x) )
# =&gt;   user  system elapsed
# =&gt;  11.03    3.50   14.56

system.time( for(i in 1:1000) prod2(A,x) )
# =&gt;  user  system elapsed
# =&gt;  4.59    0.01    4.62
</pre>
<p>prod1のほうがかなり遅くなっていることが分かる。これより、上で述べたことはおそらく正しいだろうと結論される。</p>
<h3>まとめ</h3>
<p>このことを知ったからといって高速なプログラムが書けるようになるわけではないが、少なくとも「こんな大きなオブジェクトを関数に渡すのは気が引ける(なのでグローバル変数にしてしまえ)」という不安を払拭することができると思う。</p>
<p>【追記】<a href="http://www.singularpoint.org/blog/r/r-call-by-value-or-reference-2/" title="Rにおける値渡しと参照渡し (2)">続きを書きました。</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/r/r-call-by-value-or-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正規分布／Normal-inverse-Wishart が事後分布に収束していく様子</title>
		<link>http://www.singularpoint.org/blog/r/normal-posterior-inverse-wishart/</link>
		<comments>http://www.singularpoint.org/blog/r/normal-posterior-inverse-wishart/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 02:47:25 +0000</pubDate>
		<dc:creator>flyio</dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[機械学習]]></category>
		<category><![CDATA[確率・統計]]></category>
		<category><![CDATA[bayes]]></category>
		<category><![CDATA[ProbablityDistribution]]></category>
		<category><![CDATA[StatGraphic]]></category>

		<guid isPermaLink="false">http://www.singularpoint.org/blog/?p=2435</guid>
		<description><![CDATA[正規分布のパラメータ \(\mu, \Sigma\) の共役事前分布は Normal-inverse-wishart (NIW) 分布。データ数が増加した時に真のパラメータに収束していく様子を図示してみた (クリックで拡 &#8230; <a href="http://www.singularpoint.org/blog/r/normal-posterior-inverse-wishart/">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>正規分布のパラメータ \(\mu, \Sigma\) の共役事前分布は Normal-inverse-wishart (NIW) 分布。データ数が増加した時に真のパラメータに収束していく様子を図示してみた (クリックで拡大する、かも)。</p>
<p><a href="http://www.singularpoint.org/blog/r/normal-posterior-inverse-wishart/attachment/normal_posterior/" rel="attachment wp-att-2443"><img src="http://www.singularpoint.org/blog/wp-content/uploads/2012/04/normal_posterior.png" alt="" title="正規分布のパラメータの事後分布が真の分布に収束していく様子。/ Posterior distribution of multivariate normal distribution" width="1080" height="864" class="aligncenter size-full wp-image-2443" /></a><br />
絵のせつめい。</p>
<ul>
<li>データ数 n を変化させた各グラフの中で、事後分布から20組のパラメータをサンプリング。</li>
<li>一組のパラメータを90%信頼楕円として表している</li>
<li>点線は真の分布。黒丸は事前分布のモード(最頻値)。</li>
<li>データが少ないうちは事後分布がばらつく、つまりパラメータの不確実性が大きいが、データ数が256を超えたあたりからほぼ真の分布に収束する</li>
</ul>
<p>下のコードのコメントにも書いたが、ハイパーパラメータを学習しない場合のレシピとして、NIW分布の平均パラメータ \(\mu_0\)、分散パラメータ \(V_0\) に自信がないときはそれぞれ \(k_0, \nu_0\) を小さく設定すればいい、はず。事前分布の影響を小さくできる。</p>
<p>参考その１：前回のエントリ → <a href="http://www.singularpoint.org/blog/r/inverse-wishart-graphic/" title="逆Wishart分布を図示してみる">逆Wishart分布を図示してみる</a><br />
参考その２：事後分布のパラメータの求め方 → <a href="http://en.wikipedia.org/wiki/Conjugate_prior">Wikipedia/Conjugate prior</a></p>
<p>お絵かきスクリプト in R。ellipse, MCMCpack, mvtnorm パッケージは入っていなければインストールする必要あり。</p>
<pre class="brush: r; title: ; notranslate">
library(ellipse)   # conffidence ellipse
library(MCMCpack)  # wishart
library(mvtnorm)

#----------------------------------------------------------------------------
# Baysian estimation of 2 dimensional normal distribution
#----------------------------------------------------------------------------

d &lt;- 2     # dimension

#----------------------------------------------------------------------------
# Hyperparameters for NIW (Normal inverse wishart)
k0 &lt;- 0.1        # see below
mu0 &lt;- rep(0,d)  # hyper mean
v0 &lt;- 3.5        # see below
V0 &lt;- diag(rep(10,d)) # hyper variance
Phi0 &lt;- V0*(v0-d-1)
prior.hyper.par &lt;- list(k=k0,mu=mu0,v=v0,Phi=Phi0)

#------------------------------------------------------------------------------------
# [Recipe for determining hyperparameters v0 and k0]
#  1. Less confidence for the hyper mean(mu0), take smaller k0; typically, 0&lt;k0&lt;&lt;1
#  2. Less confidence for the hyper variance(V0), take smaller v0; typically, v0~1+p
#------------------------------------------------------------------------------------

#-----------------------------------------
# Bayesian estimation ( bayesian update)
bayes.update &lt;- function(X,hyper.par){

  k0 &lt;- hyper.par$k
  mu0 &lt;- hyper.par$mu
  v0 &lt;- hyper.par$v
  Phi0 &lt;- hyper.par$Phi

  if(!is.matrix(X)){
    # This is n=1 case that we have to deal with as special because of R issue
    n &lt;- 1
    EX &lt;- X
    X &lt;- t(X)
    C &lt;- matrix(rep(0,d*d),nc=d)
  } else {
    n &lt;- dim(X)[1]
    EX &lt;- colMeans(X)
    C &lt;- (n-1)*cov(X)
  }
  mu &lt;- (k0*mu0 + n*EX)/(k0+n)
  k &lt;- k0+n
  v &lt;- v0+n
  Phi &lt;- Phi0 + C + k0*n/(k0+n)*((EX-mu0) %*% t(EX-mu0))

  list(k=k,mu=mu,v=v,Phi=Phi)  # This new parameters list is a bayesian update result!!

}

#------------------------------------------------------------------
# Sampling from posterior
sample.posterior &lt;- function(n,bayes.fit){
  k &lt;- bayes.fit$k
  v &lt;- bayes.fit$v
  Phi &lt;- bayes.fit$Phi
  mu &lt;- bayes.fit$mu
  result &lt;- list()
  for(i in 1:n){
    # Sampling mu and V from NIW
    V &lt;- riwish(v,Phi)  # 1. sampling covariance matrix by inverse wishart
    result[[i]] &lt;- list()
    result[[i]]$V &lt;- V
    result[[i]]$mu &lt;- rmvnorm(1,mu,V/k) # 2. sampling mu by normal dist.
  }
  result
}

#--------------------------------------------------------------
# Test case
#  --- true distribution
V.true &lt;- matrix(c(3,-1.5,-1.5,1.8),nc=d)
mu.true &lt;- rep(10,d)
#  --- generating random variables
X &lt;- rmvnorm(20000,mu.true,V.true)

par(mfrow=c(3,4))  # dividing graphic device
j &lt;- 1
ids &lt;- 2^seq(0,11)
hc &lt;- rainbow(12)
for(i in ids){
  Y &lt;- X[1:i,]
  bayes.fit &lt;- bayes.update(Y,prior.hyper.par)  # estimating posterior
  post.samp &lt;- sample.posterior(20,bayes.fit)  # sampling from posterior
  plot(Y,pch=&quot;.&quot;,col=&quot;gray&quot;,xlim=c(-10,20),ylim=c(-10,20),xlab=&quot;&quot;,ylab=&quot;&quot;) # just plotting raw data

  # plotting posterior samples
  for( theta in post.samp ){
    mu &lt;- theta$mu
    V &lt;- theta$V
    elp &lt;- t(apply(ellipse(V,level=0.9),1,function(x) x+mu))
    lines(elp,col=hc[j],lw=2)
  }

  # plotting true distribution
  true.dist &lt;- t(apply(ellipse(V.true,level=0.9),1,function(x) x+mu.true))
  lines(true.dist,type=&quot;l&quot;,lw=2,lt=4)

  # plotting mode of the prior
  prior &lt;- ellipse(Phi0/(v0+3), level=0.9) + mu0
  lines(prior,lw=2)

  text(20,-7,paste(&quot;n =&quot;,i),pos=2,cex=2)
  j &lt;- j+1
}

dev2bitmap(file=&quot;normal_posterior.jpg&quot;,taa=4,gaa=4,width=15,height=12)
</pre>

]]></content:encoded>
			<wfw:commentRss>http://www.singularpoint.org/blog/r/normal-posterior-inverse-wishart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.singularpoint.org @ 2012-05-20 17:12:05 -->
