主成分回帰(PCR)と部分最小二乗法(PLS)の導出について

POINT

  • PCAとPLSの導出に関する計算メモ.

【関連記事】

次の書籍の計算メモです.

用語

1回の測定で$M$個の測定値が得られるとし,$i$回目の測定のデータを$\bm{x}_{i} = {}^t\!(x_{i1},\ldots ,x_{iM})$とする.このとき,データ行列を
\begin{aligned}
X =
\begin{pmatrix}
{}^t\!\bm{x}_{1} \\
\vdots \\
{}^t\!\bm{x}_{N} \\
\end{pmatrix}
=
\begin{pmatrix}
x_{11} & \cdots & x_{1M} \\
\vdots & \ddots & \vdots \\
x_{N1} & \cdots & x_{NM}
\end{pmatrix}
\end{aligned}
と定める.


PCR - 主成分回帰

$X$をデータ行列とする.主成分分析によって得られた主成分得点$\{\bm{t}_{r}\}_{r=1}^{M}$を並べた主成分行列を$T=(\bm{t}_{1},\ldots,\bm{t}_{M})$,ローディングベクトル$\{\bm{p}_{r}\}_{r=1}^{M}$を並べたローディング行列を$P=(\bm{p}_{1},\ldots,\bm{p}_{M})$とすると,
\begin{aligned}
\bm{t}_{r}
& =
\begin{pmatrix}
{}^t\!\bm{x}_{1} \bm{p}_{r} \\
\vdots \\
{}^t\!\bm{x}_{N} \bm{p}_{r} \\
\end{pmatrix} = X \bm{p}_{r}
\end{aligned}
より
\begin{aligned}
T = XP
\end{aligned}
となる.

ここで,$P$は直交行列なので

\begin{aligned}
X
&= T \,{}^t\!P \\
&= (\bm{t}_{1},\ldots,\bm{t}_{M})
\begin{pmatrix}
{}^t\!\bm{p}_{1} \\
\vdots \\
{}^t\!\bm{p}_{M} \\
\end{pmatrix}
=\sum_{r=1}^{M} \bm{t}_{r} {}^t\!\bm{p}_{r}
\end{aligned}
が成り立つ.

第$R(\leq M)$主成分までで$X$を表すと,$T_{R} =(\bm{t}_{1},\ldots,\bm{t}_{R})$,$P_{R} =(\bm{p}_{1},\ldots,\bm{p}_{R})$,残差行列を$E$として

\begin{aligned}
X &= T_{R} \,{}^t\!P_{R} + E \\
&= \sum_{r=1}^{R} \bm{t}_{r} {}^t\!\bm{p}_{r} + E
\end{aligned}
となる.

データ行列を$T_{R}$,目的変数を$\bm{y}$として,最小二乗法で回帰係数を求めると

\begin{aligned}
\bm{\beta}_{R} = ({}^t T_{R}T_{R})^{-1} \,{}^t T_{R} \bm{y}
\end{aligned}
だから,予測式は
\begin{aligned}
\hat{y}
&= \,{}^t\! \bm{\beta}_{R} \bm{t}
\end{aligned}
である.データ$\bm{x}$に対して
\begin{aligned}
\bm{t} =
\begin{pmatrix}
{}^t\!\bm{p}_{1} \bm{x} \\
\vdots \\
{}^t\!\bm{p}_{R} \bm{x} \\
\end{pmatrix}
= \,{}^t\!P_{R} \bm{x}
\end{aligned}
だから,
\begin{aligned}
\hat{y}
&= \,{}^t\! (P_{R} \bm{\beta}_{R}) \bm{x}
\end{aligned}
となる.


PLS - 部分最小二乗法

PLS1 - 目的変数が1つの場合

データ行列$X$と目的変数$\bm{y}$を共通の潜在変数行列$T=(\bm{t}_{1},\ldots,\bm{t}_{R})$で
\begin{aligned}
X &= T \,{}^t\! P + E = \sum_{r=1}^{R} \bm{t}_{r} {}^t\!\bm{p}_{r} + E \\
\bm{y} &= T \bm{d} + \bm{f} = \sum_{r=1}^{R} d_{r} \bm{t}_{r} + \bm{f}
\end{aligned}
と表現する.ここで,潜在変数の数を$R(\leq M)$,ローディング行列を$P=(\bm{p}_{1},\ldots,\bm{p}_{R})$,回帰係数を$\bm{d}$,誤差を$E, \bm{f}$とした.

潜在変数が説明変数の線形結合で表現されるとすれば

\begin{aligned}
\bm{t}_{1}
& =
\begin{pmatrix}
{}^t\!\bm{x}_{1} \bm{w}_{1} \\
\vdots \\
{}^t\!\bm{x}_{N} \bm{w}_{1} \\
\end{pmatrix} = X \bm{w}_{1}
\end{aligned}
となる.$\| \bm{w}_{1} \| = 1$の条件下で共分散
\begin{aligned}
\sigma_{yt_{1}}^{2} = \frac{1}{N-1} {}^t\!\bm{y} \bm{t}_{1}
\end{aligned}
を最大化する$\bm{w}_{1}$を求めると,
\begin{aligned}
\bm{w}_{1}
= \frac{{}^t\!X \bm{y}}{\|{}^t\!X \bm{y}\|}
\end{aligned}
となる.これにより$\bm{t}_{1} = X \bm{w}_{1}$が定まる.

ここで,

\begin{aligned}
X
&= \bm{t}_{1} {}^t\!\bm{p}_{1} + E_{1} \\
&= (\bm{t}_{1} p_{11} + (\bm{E}_{1})_{1} ,\ldots , \bm{t}_{1} p_{1M} + (\bm{E}_{1})_{M})
\end{aligned}
において,$X = (\bm{X}_{1},\ldots , \bm{X}_{M})$とすれば
\begin{aligned}
\bm{X}_{i} = \bm{t}_{1} p_{1i} + (\bm{E}_{1})_{i}
\end{aligned}
となる.データ行列(ベクトル)を$\bm{t}_{1}$,目的変数を$\bm{X}_{i}$として最小二乗法解を求めると
\begin{aligned}
p_{1i}
& = (\,{}^t\!\bm{t}_{1} \bm{t}_{1})^{-1} \,{}^t\!\bm{t}_{1} \bm{X}_{i} \\
&= \frac{\,{}^t\!\bm{t}_{1} \bm{X}_{i}}{\| \bm{t}_{1} \|^{2}}
\end{aligned}
となる.したがって,
\begin{aligned}
\bm{p}_{1}
&= {}^t \! (p_{11}, \ldots , p_{1M}) \\
&= \frac{1}{\| \bm{t}_{1} \|^{2}}
{}^t \! (\bm{X}_{1}, \ldots , \bm{X}_{M}) \bm{t}_{1} \\
&=\frac{{}^t \! X \bm{t}_{1} }{\| \bm{t}_{1} \|^{2}}
\end{aligned}
となる.

さらに

\begin{aligned}
\bm{y} = \bm{t}_{1} d_{1} + \bm{f}_{1}
\end{aligned}
については,上で$p_{1i} $を求めたのと全く同様にして
\begin{aligned}
d_{1}
&= \frac{\,{}^t\!\bm{t}_{1} \bm{y}}{\| \bm{t}_{1} \|^{2}}
\end{aligned}
となる.


以後,

\begin{aligned}
X & \to X - \bm{t}_{1} {}^t\!\bm{p}_{1} \\
\bm{y} & \to \bm{y} - \bm{t}_{1} d_{1}
\end{aligned}
と(デフレーション)して繰り返せば良い.

回帰係数を計算する.

Pythonのライブラリ

全体の説明は以下:
1.8. Cross decomposition — scikit-learn 1.4.0 documentation

いくつか種類があるが,sklearn.cross_decomposition.PLSRegression — scikit-learn 1.4.0 documentationがcomponents の制限がmin(n_samples, n_features)と他より緩い.