医療職からデータサイエンティストへ

統計学、機械学習に関する記事をまとめています。

第6回:RとPythonで学ぶデータサイエンス数学~ベクトル、行列の微分~

スポンサーリンク

前回までで、微分、偏微分、最小二乗法、ベクトル、行列までを書いてきました。

www.medi-08-data-06.work

www.medi-08-data-06.work

www.medi-08-data-06.work

www.medi-08-data-06.work

今回は、今までの知識を総動員し、ベクトルと行列による微分について書いていきます。ここまでの内容は、かの有名なディープラーニングにも使われています!

www.medi-08-data-06.work

今回の目的は以下になります。

  • 回帰モデルをベクトルと行列を使って表現できる。
  • ベクトルや行列の式変形に慣れる。
  • ベクトルを使った微分を理解する。

誰が読んでも理解できることを目指していますので、分かりにくい、理解できない等ありましたら、お気軽にコメント頂けると幸いです。なお、RやPythonを使わなくても、学ぶことができる内容ですので、数学の知識だけ学びたいという方も是非ご覧ください(^^)

行列を使って回帰モデルを表す。

さて前回までの記事で、ベクトル・行列は"たくさんある式をコンパクトにまとめられる"ことがメリットであると書きました。前回の記事で偏微分を使って作成した回帰モデルですが、ベクトルと行列を使うことで、コンパクトに、スマートに、回帰モデルを作成できます。

前回同様に、メール数と売上データを使います。こんなデータでした。

mail sales
1 12500
2 19700
3 29600
4 53700
5 47700
6 75200
7 54500
8 85800
9 91200
10 102200

データサイエンス数学

このmailをx、salesをy、線形モデルの切片は \beta_{1}、傾きを \beta_{2}として、それぞれベクトルと行列で表現してみます。以前の記事で補足として書いた誤差を使った表し方です。

 \boldsymbol{y} =\boldsymbol{X}\boldsymbol{\beta}+ \boldsymbol{\epsilon}

データサイエンス数学

www.medi-08-data-06.work

ここでも横×縦の考え方です。メールの数であるxは、すべて1のベクトルをくわえることで、2行10列の行列となり、係数ベクトル\boldsymbol{\beta}とのかけ算を可能にし、切片係数の \beta_{1}を式の中に加えることができます。一種のお作法のようなものですね(^^;)

上記の式を展開してみると、

\begin{pmatrix}
y_{1}\\
y_{2}\\
\vdots\\
y_{10}
\end{pmatrix}
=
\begin{pmatrix}
\beta_{1}+\beta_{2}x_{1}+\epsilon_{1}\\
\beta_{1}+\beta_{2}x_{2}+\epsilon_{2}\\
\vdots\\
\beta_{1}+\beta_{2}x_{10}+\epsilon_{10}\\
\end{pmatrix}

となって、全部で10この式が、1行にまとめられていることがわかります。

行列を使って誤差の平方和を表す。

さて、ここから誤差を最小にするためには、誤差\epsilon=\boldsymbol{y}-\boldsymbol{X\beta}の平方和を最小にする必要がありますが(最小二乗法)、誤差はベクトルとなっていて二乗することができません。そこで、転置をした同じ誤差ベクトルとの内積を求めます。(前回まででやったように、ベクトルや行列のかけ算は内積でしたね。)

 \epsilon^{T}\epsilon = (\boldsymbol{y}-\boldsymbol{X\beta})^{T}(\boldsymbol{y}-\boldsymbol{X\beta})

 (\boldsymbol{y}-\boldsymbol{X\beta})^{T}(\boldsymbol{y}-\boldsymbol{X\beta})
\\=\boldsymbol{y}^{T}\boldsymbol{y}-\boldsymbol{y}^{T}(\boldsymbol{X\beta})-(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})

ここから行列における以下の二つのルールを用いて式変形を行います。

1.スカラーは転置しても値は同じ 
例: 5^{T} = 5

2.行列の内積の転置はそれぞれを転置して順番を逆にする。 
\begin{pmatrix}
AB
\end{pmatrix}^{T}=B^{T}A^{T}

1のルールは分かりやすいですね。2のルールは、実際に計算してみましょう。


A=\begin{pmatrix}
1&2\\
1&2\\
1&2
\end{pmatrix}
\, B=\begin{pmatrix}
3\\
4\\
\end{pmatrix}
\\
\begin{pmatrix}
AB
\end{pmatrix}^{T}=\left[
\begin{pmatrix}
1&2\\
1&2\\
1&2
\end{pmatrix}
\begin{pmatrix}
3\\
4\\
\end{pmatrix}\right]^{T}
\\
B^{T}A^{T} =
\begin{pmatrix}
3&
4
\end{pmatrix}
 \begin{pmatrix}
1&1&1\\
2&2&2
\end{pmatrix}

と確かに同じになっていることが分かります。このルールを式に適応してみると、\boldsymbol{y}^{T}(\boldsymbol{X\beta})はスカラーになるので、

\boldsymbol{y}^{T}(\boldsymbol{X\beta})
\\=\left[\boldsymbol{y}^{T}(\boldsymbol{X\beta})\right]^{T}←ルール1
\\=(\boldsymbol{X\beta})^{T}\boldsymbol{y}←ルール2

と変形できます。すると

 \boldsymbol{y}^{T}\boldsymbol{y}-\boldsymbol{y}^{T}(\boldsymbol{X\beta})-(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})
\\=\boldsymbol{y}^{T}\boldsymbol{y}-2(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})

となります。これで誤差の平方和を行列で表すことができました。

ベクトルとベクトルの微分

さて、前回の記事で、最小二乗法を解くために偏微分を使いました。今回も微分を使って、誤差が最小となる値を求めるのですが、ここでベクトルや行列で微分をすると、一気に値を求めることができます。先ほどの式を\beta_{1}, \beta_{2}を要素としてもつベクトル\boldsymbol{\beta}で微分してみます。微分は、足してから微分しても、微分してから足しても同じという性質を使うと以下のようになります。

\dfrac{d}{d\boldsymbol{\beta}}
\boldsymbol{y}^{T}\boldsymbol{y}-2(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})
\\=-2\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}\boldsymbol{y}+
\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})

\boldsymbol{y}^{T}\boldsymbol{y}\boldsymbol{\beta}と関係ないので、微分によって消えます。次の項についてですが、これがベクトルをベクトルで微分する項になります。まずは

 -2\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}\boldsymbol{y}

の項からみていきましょう。ここでも微分の性質である、かけてから微分しても、微分してからかけても同じという性質を使って、

\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})

の微分を考えていきます。\boldsymbol{X\beta}は10行1列のベクトルです。

\boldsymbol{X\beta}=\begin{pmatrix}
\beta_{1}+\beta_{2}x_{1}\\
\vdots\\
\beta_{1}+\beta_{2}x_{10}\\
\end{pmatrix}

これをベクトルである\boldsymbol\betaで微分すると、以下のようなイメージになります。

データサイエンス数学

ポイントは、ベクトルをベクトルで微分すると行列になるところです。これが分かれば、あとは偏微分するだけなので、

-2(\dfrac{d}{d\boldsymbol{\beta}}\boldsymbol{X\beta})^{T}\boldsymbol{y}=
-2\left[\begin{pmatrix}
1&x_{1}\\
\vdots&\vdots\\
1&x_{10}
\end{pmatrix}\right]^{T}\boldsymbol{y}
\\=-2\boldsymbol{X}^{T}\boldsymbol{y}

となっていきます。ここで注目して欲しいのが、

\dfrac{d}{d\boldsymbol{\beta}}\boldsymbol{X\beta}
=\boldsymbol{X}

となる点です。例えば、ベクトルではなく、スカラーの微分では、

\dfrac{d}{d\beta}x \beta
=x

となりますよね。これはベクトルの微分でも同じように適応できるところがポイントです。

 二次形式の微分

さて、次に

 \dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})

を計算してみましょう。実は上記の微分は二次形式の微分という公式を用いることができます。その公式前に二次形式について紹介していきましょう。

二次形式とは、

  • 変数の二次の項のみからなる式
  • ベクトル\,対称行列\,ベクトルの形に変換できる。

という特徴を持っています。例えば、こんな式です。

\beta_{1}^{2}+2\beta_{1}\beta_{2}+2\beta_{2}\beta_{1}+4\beta_{2}^{2}

上記の式の中にある項は全て、\beta_{1}\beta_{2}の二次の項からなっていますね。これを以下のように変形してみます。

\beta_{1}^{2}+2\beta_{1}\beta_{2}+2\beta_{2}\beta_{1}+4\beta_{2}^{2}
=\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}^{T}

\begin{pmatrix}
1&2\\
2&4
\end{pmatrix}

\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}

これはまさしく、ベクトル\,対称行列\,ベクトルの形になっていますね!実は、式が2次形式の形であればどんな式でも上記の形に変形することができます。ここで、最初の式をベクトルで微分したらどうなるでしょうか?ポイントは、スカラーをベクトルで微分するとベクトルになるということです。やってみましょう。

\dfrac{d}{d\boldsymbol{\beta}}
\beta_{1}^{2}+2\beta_{1}\beta_{2}+2\beta_{2}\beta_{1}+4\beta_{2}^{2}
\\=\begin{pmatrix}
\dfrac{\partial}{\partial\beta_{1}}
\beta_{1}^{2}+2\beta_{1}\beta_{2}+2\beta_{2}\beta_{1}+4\beta_{2}^{2}\\
\dfrac{\partial}{\partial\beta_{2}}
\beta_{1}^{2}+2\beta_{1}\beta_{2}+2\beta_{2}\beta_{1}+4\beta_{2}^{2}
\end{pmatrix}←スカラーをベクトルで微分するとベクトルになる。
\\=
\begin{pmatrix}
2\beta_{1}+2\beta_{2}+2\beta_{2}\\
2\beta_{1}+2\beta_{1}+8\beta_{2}
\end{pmatrix}
\\=
2\begin{pmatrix}
\beta_{1}+\beta_{2}\\
2\beta_{1}+4\beta_{2}
\end{pmatrix}
\\=
2
\begin{pmatrix}
1&2\\
2&4
\end{pmatrix}
\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}

となります。つまり、

\dfrac{d}{d\boldsymbol{\beta}}
\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}^{T}
\begin{pmatrix}
1&2\\
2&4
\end{pmatrix}
\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}=
2\begin{pmatrix}
1&2\\
2&4
\end{pmatrix}
\begin{pmatrix}
\beta_{1}\\
\beta_{2}
\end{pmatrix}

です。これが二次形式の微分の公式です。これは、

\dfrac{d}{d \beta} x\beta^{2}= 2x\beta

となるような二乗微分のベクトル版とも言えますね。

データサイエンス数学

この公式を使うと

 \dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})
\\=\dfrac{d}{d\boldsymbol{\beta}}\boldsymbol{\beta}^{T}\boldsymbol{X}^{T}\boldsymbol{X\beta}
\\=2\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{\beta}

と変形することができます。これは、\boldsymbol{X}^{T}\boldsymbol{X}を計算してみると対称行列になることを利用しています。

正規方程式から回帰モデルのパラメーターを求める。

さて、これで準備が整いました。式を整理してみましょう。

\epsilon^{T}\epsilon
\\= (\boldsymbol{y}-\boldsymbol{X\beta})^{T}(\boldsymbol{y}-\boldsymbol{X\beta}) ← 回帰モデルの誤差平方和を表す式
\\=\boldsymbol{y}^{T}\boldsymbol{y}-2(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta}) ← 行列の変形ルールを用いて変形

\dfrac{d}{d\boldsymbol{\beta}}
\boldsymbol{y}^{T}\boldsymbol{y}-2(\boldsymbol{X\beta})^{T}\boldsymbol{y}+(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})←ベクトルで微分
\\=-2\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}\boldsymbol{y}+
\dfrac{d}{d\boldsymbol{\beta}}(\boldsymbol{X\beta})^{T}(\boldsymbol{X\beta})
\\=-2\boldsymbol{X}^{T}\boldsymbol{y}+
2\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{\beta}←ベクトル同士の微分と二次形式の微分

最小二乗法で学んだように、微分した結果が0になるところが最小となる値となるので、

-2\boldsymbol{X}^{T}\boldsymbol{y}+
2\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{\beta}=0
\\ \boldsymbol{X}^{T}\boldsymbol{y}=
\boldsymbol{X}^{T}\boldsymbol{X}\boldsymbol{\beta}
\\ \boldsymbol{\beta}=(\boldsymbol{X}^{T}\boldsymbol{X})^{-1}\boldsymbol{X}^{T}\boldsymbol{y}

を解けば回帰モデルのパラメーターを求めることができます。この一番したの式を正規方程式とよび、多くの参考書等でいきなり出てくることがありますが、導出方法は上記の通りです!

あとは前回行列の回で扱った逆行列の知識を使えば、正規方程式を解くことができます。

www.medi-08-data-06.work

\boldsymbol{\beta}
\\=(\boldsymbol{X}^{T}\boldsymbol{X})^{-1}\boldsymbol{X}^{T}\boldsymbol{y}
\\= \begin{pmatrix}
3253...\\
9810...
\end{pmatrix}

これで回帰モデルは、

y=3253+9810x+\epsilon

と求めることができます。

RとPythonによる実践

最後に実際にRとPythonを使って正規方程式をとき、\boldsymbol{\beta}を計算してみましょう。

#データの作成
mail <- seq(1,10)
sales <- c(12500,19700,29600,53700,47700,75200,54500,85800,91200,102200)

y <- sales
X <- matrix(c(rep(1, 10), mail),ncol = 2)

#正規方程式をとく
beta <- solve(t(X) %*% X) %*% t(X) %*% y  
print(beta)

>        [,1]
[1,] 3253.333
[2,] 9810.303
#データの生成
mail = np.arange(1,11)
sales = np.array([12500,19700,29600,53700,47700,75200,54500,85800,91200,102200])

X = np.zeros((10,2))
X[:,0] = 1
X[:,1] = mail
y = sales

#正規方程式を解く
inv_XTX = np.linalg.inv(np.dot(X.T, X))
beta = np.dot(np.dot(inv_XTX, X.T),y)
print(beta)

>[3253.33333333 9810.3030303 ]

まとめ

ベクトルを使った微分は、データサイエンスの中でも肝となる部分で、逆にここをしっかりと理解することで、基礎的な統計学からディープラーニング を始めとする機械学習手法まで、幅広く理解することができます。最後に本記事のポイントをまとめてみます。

  • 回帰式は \boldsymbol{y} =\boldsymbol{X}\boldsymbol{\beta}+ \boldsymbol{\epsilon}と表すことができる。
  • スカラーは転置しても値は同じ  例: 5^{T} = 5

  • 行列の内積の転置はそれぞれを転置して順番を逆にする。  \begin{pmatrix} AB \end{pmatrix}^{T}=B^{T}A^{T}

  • スカラーをベクトルで微分するとベクトルに、ベクトルをベクトルで微分すると行列になる。

  • 変数の二次の項のみからなる式を二次形式と呼ぶ。

  • 正規方程式を解くことで、回帰モデルのパラメーターを求めることができる。

※本記事は筆者が個人的に学んだことをまとめた記事なります。所属する組織の意見・見解とは無関係です。また、数学の記法や詳細な理論、用語等で誤りがあった際はご指摘頂けると幸いです。

参考

データサイエンスで必要となる数学がほとんど網羅されています。初めての方には、少し難易度が高いですが、数式の導出など丁寧にまとめてあり、脱初心者を目指す方にはとてもおすすめです。

データサイエンスを学び始めて右も左も分からなかったときこの本に出会い、”統計、機械学習を学ぶための数学を学ぶ本”というコンセプトがぴったりで感動した。今、読み直してみるとさらに理解が深まり、データサイエンス数学入門書としては間違いなくおすすめです。

最適化となっていますが、第一章の数学基礎は、具体例とともにすごく分かりやすくまとまっています。本記事を書くにあたり、二次形式の部分は本書を参考にしました。

正規方程式の導出で、参考にさせて頂きました。

ベクトルの微分、ベクトルで微分 - 具体例で学ぶ数学