potass' blog

ポタシウムのことが書いてないブログ。

Fig1.17 - Python で PRML #06

PRMLパターン認識と機械学習 上)の実装 その6。

プログラミングの上でちょっとスマートに書くために以下の計算をしている。

 \displaystyle{
\mathbf{\Phi}=\left(
\begin{array}{cccc}
\boldsymbol{\phi}(x_0)& \boldsymbol{\phi}(x_1)&\cdots & \boldsymbol{\phi}(x_{N-1})
\end{array}
\right)
}とおくと、
 \displaystyle{
\begin{array}{rcl}
\mathbf{\Phi}\mathbf{\Phi}^{\rm T}&=&
\left(
\begin{array}{cccc}
\boldsymbol{\phi}(x_0)& \boldsymbol{\phi}(x_1)&\cdots & \boldsymbol{\phi}(x_{N-1})
\end{array}
\right)
\left(
\begin{array}{c}
\boldsymbol{\phi}(x_0)^{\rm T}\\
\boldsymbol{\phi}(x_1)^{\rm T}\\
\vdots \\
\boldsymbol{\phi}(x_{N-1})^{\rm T}
\end{array}
\right)\\
&=&\sum_{n=0}^{N-1}\boldsymbol{\phi}(x_n)\boldsymbol{\phi}(x_n)^{\rm T} 
\end{array}
}
と書けるので行列inv_matSを求める際に使用した。

また、 \displaystyle{
\mathbf{\Phi}(\mathbf{xx})=\left(
\begin{array}{cccc}
\boldsymbol{\phi}(xx_0)& \boldsymbol{\phi}(xx_1)&\cdots & \boldsymbol{\phi}(xx_{D-1})
\end{array}
\right)
}とおくと、
 \displaystyle{\begin{array}{rcl}
\mathbf{\Phi}(\mathbf{xx})^{\rm T}\mathbf{S}\mathbf{\Phi}(\mathbf{xx})&=&
\left(
\begin{array}{c}
\boldsymbol{\phi}(xx_0)^{\rm T}\mathbf{S}\\
\boldsymbol{\phi}(xx_1)^{\rm T}\mathbf{S}\\
\vdots \\
\boldsymbol{\phi}(xx_{D-1})^{\rm T}\mathbf{S}
\end{array}
\right)
\left(
\begin{array}{cccc}
\boldsymbol{\phi}(xx_0)& \boldsymbol{\phi}(xx_1)&\cdots & \boldsymbol{\phi}(xx_{D-1})
\end{array}
\right)\\
&=&(\boldsymbol{\phi}(xx_i)^{\rm T}\mathbf{S}\boldsymbol{\phi}(xx_j))_{i,j=0,1,\cdots, D-1}
\end{array}
}
と書けるのでこれのdiagonal()によって分散が算出される。

題材

PRML 上巻 1章 図1.17

コード

出力結果


参考

後半部分の説明が勉強になった。なお、出力形式はこちらを参考にした。
この blog ではforを使って m(x) や s(x) を出している。