うさぎでもわかる線形代数 応用編第9羽 行列を使って最小2乗法を解いてみよう!

スポンサードリンク

こんにちは、ももやまです。

前回の第08羽では、逆行列 A1 を持たない行列に対して、無理やり逆行列っぽいもの(擬似逆行列)について求めてから掃き出し計算なしに解を計算する方法について説明しました。

今回の第09羽では、そもそも解をもたないような連立方程式 Ax=b に対して、最もそれっぽい解 x を計算する方法である最小2乗法について説明していきます。

この最小2乗法は、実験のデータ解析や、研究分野など様々な分野で応用が利くので、是非マスターしていきましょう!

スポンサードリンク

行列と連立方程式 [復習]

うさぎでもわかる線形代数 第02羽では、行列を用いて連立方程式を解く方法について説明しました。

本題の最小2乗法に入る前に、まずは今回使う知識「行列と連立方程式」について軽く復習しましょう。

皆さんは、下のようにm 個の式、n 個の未知数がある連立方程式{a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2am1x1+am2x2++amnxn=bmを下のように係数行列 A、解ベクトル x、右辺を集めたベクトル b で表すことを勉強しました。

この連立方程式が解をもつかどうかは mn 列の行列 A と拡大係数行列 B=(A|b) を比べることでわかるのでしたね。

具体的には、

  • Rank A<Rank B のときは解なし
  • Rank A=Rank B のときはさらに場合分け
    • Rank A=n のときはただ1つの解をもつ
    • Rank A<n のときは無数の解をもつ。
      (どのような解をもつかは nRank A 個の任意定数で表現可)

でしたね。

今回「行列を用いた最小2乗法」では、

  • 解なしのとき
  • ただ1つの解をもつとき

の2つに着目していきたいと思います。

スポンサードリンク

1. 擬似逆行列(一般化逆行列)

前回の第08羽で擬似逆行列について勉強しましたが、もう1度擬似逆行列について復習をしてから本題の最小2乗法に入りましょう。

(1) 擬似逆行列とは

たとえ、係数行列 A がただ1つの解をもつとしても、A が正方行列ではない場合、逆行列 A1 を計算できないため、連立方程式 Ax=bx=A1b と計算することができません。

そこで、両辺に A を掛けて、Ax=bAAx=Ab(AA)1(AA)x=(AA)1Abx=(AA)1AA+bと変形することで、解 x を計算することができます。

このときに出てくる (AA)1AA+ としたものが擬似逆行列です。
(疑似逆行列・一般化逆行列・一般逆行列と呼ばれることもあります)

擬似逆行列とは

連立方程式 Ax=b の係数行列 A が正方行列ではなかった場合でも、x=(AA)1Ab=A+bとおくことで、掃き出し法を計算せずに解 x を計算できる。このときの A+ を擬似逆行列と呼ぶ。

(2) 解をもたない場合

擬似逆行列は、n 次正方行列 AA が正則[1]AA の逆行列を計算するため、AA が正則でないとダメ。 でないと計算できません。

この条件は、行列 A が正則、つまり Rank A=n と言い換えることができます。

しかし、Rank A=n だったとしても、Rank(A|b)>n だった場合、Rank A<Rank b となり、解をもちません。

一方、擬似逆行列が計算できる条件は Rank A=n なので、擬似逆行列 A+ が計算できてしまいます。擬似逆行列が計算できるいうことは、解 x=A+b も計算できてしまいます。本当は解がないはずなのに。あら不思議。

実は解がない連立方程式 Ax=b の中に対しては、擬似逆行列で出てくる解 x必ず最も連立方程式の左辺 Ax と右辺 b が近くなるような解(それっぽい解)となるのです!

なぜそんなことができるのかは、3章にて詳しく説明します。

スポンサードリンク

2. 最もそれらしい解とは - 最小2乗法の始まり

最もそれらしい解と言われても、人によって「それらしい」の解釈が変わってきます。そこで、「それらしい解かどうかの基準」を明確に設定しましょう。

まず、連立方程式 Ax=b を変形すると、Axb=0 とできます。

ここで、左辺 Axb がどれだけ 右辺 b に近くなるかでそれらしい解かどうかを判断しましょう。とはいっても、ベクトルの大小はそのままでは比べることができません

そこで登場するのがノルム(長さ・大きさ)です。

まず、右辺 0 のノルムは当然0です。なので左辺 Axb はどれだけ右辺のノルム(0に近いのか)で最もそれらしい解かどうかを判断することを考えましょう。

ここで、ノルムは必ず0以上となるのでしたね。つまり、Axb0 も成り立ちますね。

そのため、 Axb が最も小さくなるような x が最もそれらしい解であると言い換えることができますね[2]今までの記事では、ベクトルのノルムを |x| のように絶対値っぽく表してきましたが、本記事ではベクトルのノルム(長さ)を \( \| \vec{x} … Continue reading

また、 Axb は、連立方程式 Ax=b の左辺 Axが右辺 b とどの程度ずれているかを表す誤差の指標にもなります。

この「それっぽい解 x」を求める方法、より数学的に言うと誤差 Axb を最も小さくなるような x を求める方法のことを、最小2乗法と呼びます。

3. 擬似逆行列で最小2乗法が計算できる仕組み

ここからは、連立方程式 Ax=b に対し、x=(AA)1Ab=A+bと擬似逆行列 A+ を使うだけで、誤差 Axb を最小にする最小2乗法が実現できる仕組みを説明していきます。

(1) 前提知識 - ベクトルの偏微分

(i) ベクトルの偏微分とは?

皆さんは、高校の数2、数3、大学の解析学の前半で微分を、解析学の後半では偏微分を習いましたね。これらの微分は、xx5y4=5x4y4のように、スカラーをある1つのスカラー変数で微分するのでしたね。

最小2乗法では、下のようにこの偏微分の概念を拡張した「スカラーをある1つのベクトルで偏微分する」ということをします。fx=(fx1fx2fxn)

とは言っても、いまいち実感がわかないと思うので、まずは計算例を見てみましょう。

例題1

ベクトル x、および f(x)x=(x1x2x3)f(x)=f(x1,x2,x3)=5x12+3x24x33とする。このとき、fxを計算しなさい。

[解説1]

fx=(fx1fx2fx3)=(10x112x233x32)

(ii) 最小2乗法で使うベクトルの偏微分の導出

最小2乗法の公式を計算する際には、n 次実対称行列 A、および n 次のベクトル b および解ベクトル x

  1. xAx ※ A は実対称行列
  2. xb

を微分する場面が出てきます。

この2式の微分を導出してみましょう。

[1] xAx の偏微分

n 次のときを導出すると計算量がえげつなさすぎるので、n=2 のときで確かめることにします。

まず、n=2 なので、A=(uppv),   x=(x1x2),   b=(b1b2)とします。

すると、xAx=(x1x2)(uppv)(x1x2)=(x1x2)(ux1+px2px1+vx2)=x1(ux1+px2)+x2(px1+vx2)=ux12+2px1x2+vx22と計算できます。

この式を x で偏微分すると、xxAx=xux12+2px1x2+vx22=(x1ux12+2px1x2+vx22x2ux12+2px1x2+vx22)=(2ux1+2px2+2px1+2vx2)=2(uppv)(x1x2)=2Axとなります。

よって、xAxx 偏微分するとxxAx=2Axと導出ができます。

n=3 以上のときも同様の手順で導出できます。計算がしんどいですが…

[2] xb の偏微分

こちらは、n 次の場合でも計算量が大したことないので、n 次のままで導出します。つまり、x=(x1x2xn),   b=(b1b2bn)です。まずは、xb を展開します。

xb=(x1,x2,,xn)(b1b2)=x1b1+x2b2++xnbn=b1x1+b2x2++bnxn

さらに微分すると、xxb=(x1(b1x1+b2x2++bnxn)x2(b1x1+b2x2++bnxn)xn(b1x1+b2x2++bnxn))=(b1b2bn)=bと計算できるため、xbx で偏微分した結果をxxb=bと導出ができます。

(2) 勾配と最小値

皆さんは、数2・数3で、「スカラーな変数(x など)を微分し、増減表を書くことで極大値・極小値(最大値・最小値)を求めるような経験」をしましたね。

例えば、2次関数 f(x)=(xa)2=x22ax+a2 の極小値であれば、f(x)=2x2aと微分し、傾き f(x)=2x2a=0 となる x、つまり x=a が極小値になりますね。

また、増減表やグラフを書くことで、グラフ f(x)=(xa)2 が下に凸になることがわかりますね。

よって、極小値 x=a が最小値になることが確認できます。

ベクトルの場合も同じように、「ベクトル x を微分することで、極大値や極小値を求める」ことがスカラー変数と同じように実現できるのです!

スカラー変数の場合は、傾き f(x)=0 となる点が極値(最大値・最小値の候補)となるように、ベクトルの場合も勾配 f(x)=0 となる点が極値(最大値・最小値の候補)となるのです。ただし、f(x)=fxとします(勾配ベクトル)。

ここで、最小2乗法で求めたい式f(x)=Axbにおいて、最小にする x を求めることを考えましょう。

まず、極値は勾配 f(x)=0 を計算することで求められますね。

次に、極値が最小値を取るかどうかの確認ですが、Axb は「まるでスカラー変数 x で表される2次関数 g(x)=(axb)2=a2x22ab+b2 のような形」になっていますね。

ここで、g(x) は、a20 となるので、グラフの形は a0 のときを除き、下のような形(下に凸)になりますね。

この形の場合、極値 g(x)=0 となる x は最小値となることがわかりますね。

ベクトル関数 fx)=Axb もスカラーの場合と同じように、勾配 f(x)=0 となる x を計算すれば最小値が求まりそうですね。

(3) 最小2乗法の導出

ここからは、実際に f(x)=0 となる x を計算することで、Axb を最小にする x を求めていきます。

まず、Axb0 なので、2乗して Axb2 としても最小値をとる x は変わりませんよね。

なので、Axb2 を最小にする x を導出していきましょう。

まず、x2=xx ですね。よって、Axb2=(Axb)(Axb)が成り立ちますね。

さらに、この式を展開することで、Axb2=(Axb)(Axb)={(Ax)b}(Axb)=(xAb)(Axb)=xAAxxAbbAxbbとなりますね。

ここで、bAx はスカラー値(1×1の行列)となるため、転置しても値はそのままですね。よって、(bAx)=xA(b)=xAbと変形できます。

また、bb=b2 ですね。

したがって、Axb2 は、Axb2=xAAxxAbbAxbb=xAAxxAbxAbbb=xAAx2xAb+b2と変形できますね。

ここからは、上の式を x で偏微分していきます。ここで、(1)のxxAx=2Ax   (A )xxb=bを使います。すると、xAxb2=xxAAx2xxAb+xb20=2AAx2Ab

となりますね[3]AA は必ず実対称行列となる。また、転置の公式 (ABC)=CBA … Continue reading

よって、勾配が0となる x は、2AAx2Ab=02AAx=2Ab(AA)x=Ab(AA)1(AA)x=(AA)1Abx=(AA)1Abと求められますね。

この形、まさに擬似逆行列から x を計算する式x=(AA)1Ab=A+bと同じですね! よって、擬似逆行列 A+ を計算し、x=A+b とすることで最小2乗法、つまり Axb を最小にすることができますね。

最小2乗法擬似逆行列とは

連立方程式 Ax=b の誤差を Axb で定義する。

この誤差を最小にするような x を求める手法を最小2乗法と呼び、x のことを最小2乗解と呼ぶ。

最小2乗解 xは 擬似逆行列 A+ を用いてx=(AA)1Ab=A+bで計算できる。

4. 例題で最小2乗法の計算方法を確認しよう

では、例題を見てみましょう。

例題1

つぎの解をもたない連立方程式{  2x2y=24x+3y=   22x+  y=   05x+4y=   1がある。この連立方程式に対して、最小2乗法を適用したい。

ここで、行列 A、ベクトル b、解ベクトル xA=(22432154),   b=(2201),   x=(xy)とすることで、連立方程式を Ax=x と表現する。次の(1), (2)の問いに答えなさい。

(1) 擬似逆行列 A+ を計算しなさい。
(2) (1)の誤差 Axb が最も小さくなるような最小2乗解 x を計算することで、最小2乗法を適用しなさい。

[解説1]

(1) 擬似逆行列 A+=(AA)1A

  1. AA の計算
  2. (AA)1 の計算
  3. (AA)1A の計算

の3ステップにわけて計算する。

[Step1] AA の計算

AA=(24252314)(22432154)=(4+16+4+254122204122204+9+1+16)=(49383830)

[Step2] (AA)1 の計算

(AA)1=1|AA|(30383849)=114701444(30383849)=126(30383849)

[Step3] 擬似逆行列 A+=(AA)1A の計算

A+=(AA)1A=126(30383849)(24252314)=126(6076120+11460+38150+1527698152+14776+49190+196)=126(166222225276)

(2)

最小2乗解 x は、擬似逆行列 A+ からx=(AA)1Ab=A+bで計算できる。

よって、( \vec{x} \) はx=A+b=126(166222225276)(2201)=126(3212+0+24410+0+6)=126(2240)=113(1120)と計算できるため、最小2乗解 xx=(xy)=113(1120)となる。

※ 行列に使わずに書くと、最小2乗解はx=1113,   y=2013となる。

5. 実験と最小2乗法(回帰直線)

(大学の)物理実験では、「条件を変えて得られた2つのデータの組 (x,y)=(xk,yk) を直線 y=px+q に当てはめていき、最もそれっぽい p, q を求める」ということをします。これが実験でよく使う最小2乗法です。

1つ最小2乗法を使う物理実験の例を出してみましょう。皆さんは、オームの法則を中学校や高校で習いましたね。これは、電圧 V、電流 I、抵抗 R に対して V=RI が成り立つという法則でしたね。

しかし、実世界ではこれに加えて初期の起電力 V0 を考えて、V=RI+V0 とする必要があります。

そこで、抵抗値 R が未知の抵抗に対して、ある電流値 x=I を与えたときの観測される電圧 y=V を調べていきます。

すると、式 y=px+q(つまり V=RI+V0)が大量に出てきますね。この導出された式から、最も適した p=R , q=V0 を計算していきます。

通常であれば、共分散 sxy, データ xi の分散 sx2、データ x, y のそれぞれの平均 x¯, y¯ を用いてp=sxysx2q=y¯ax¯と計算できるのですが、今回はこれを行列の力で解いてみます。

※ もし、実験で使う最小2乗法の仕組みについて詳しく勉強してみたいよという人は、こちらの記事もぜひご覧ください。

(1) 行列を用いた形 Ax=b への変換

まず、2つのデータの組 x,y=Ik,Vk を下のように得られたとします。

電流 I [A]電圧 V [V]
0.0000.000
0.5021.000
1.0052.000
1.5083.000
2.0124.001
2.5165.001
3.0196.001

すると、得られたデータの組から、連立方程式{0.000=0.000p+q1.000=0.502p+q2.000=1.005p+q3.000=1.508p+q4.001=2.012p+q5.001=2.516p+q6.001=3.019p+qが得られますね。

ここで、A=(0.00010.50211.00511.50812.01212.51613.0191),   x=(pq),   b=(0.0001.0002.0003.0004.0015.0016.001)とすることで、行列を用いた連立方程式の形 b=Ax、つまり Ax=b に変形できるので、あとは、x=(AA)1Ab=A+bを計算することで最小2乗解 x を求められます。

(2) Python, MATLABで計算

さすがに手計算で A+ やら x=A+b を計算するのはさすがに少ししんどいので、今回はPythonとMATLABを使って計算したいと思います。

Pythonで計算する場合(プログラム)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np # numpyを用いた行列計算に必要
## プロットデータ(x_k,y_k)から、回帰直線 y = px + q を擬似逆行列 np.linalg.pinv(A) で計算
def find_kaiki_line(x_data,y_data):
    n = len(x_data) # 連立方程式の数
    A = np.zeros( (n,2) ) # 係数行列のサイズ: n×2
    ## Ax = b の形に変更
    A[:,0] = x_data[:,0]
    A[:,1] = 1
    b      = y_data
    ## 擬似逆行列を用いて最小2乗解を計算
    x = np.matmul(np.linalg.pinv(A),b)
     
    return x
## 処理データをここに書く
ampere  =  np.array([[-0.001],[0.502],[1.005],[1.508],[2.012],[2.516],[3.019]]) # 電流Iの観測結果
voltage =  np.array([[ 0.000],[1.000],[2.000],[3.000],[4.001],[5.001],[6.001]]) # 電圧Vの観測結果
## 結果
result = find_kaiki_line(ampere,voltage)
print('回帰直線: y = {p:0.4f}x {q:0=+0.4f}'.format(p = result[0,0],q = result[1,0]))

MATLABで計算する場合(プログラム)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%% 処理データをここに書く
voltage = [ 0.000; 1.000; 2.000; 3.000; 4.001; 5.001; 6.001];
ampere  = [-0.001; 0.502; 1.005; 1.508; 2.012; 2.516; 3.019];
%% 結果
result = find_kaiki_line(ampere,voltage);
disp(strcat("回帰直線: y = ",sprintf("%0.4f",result(1)),"x ",sprintf("%+0.4f",result(2))))
%% プロットデータ(x_k,y_k) から、回帰直線 y = px + q を擬似逆行列 pinv(A) で計算
function [x] = find_kaiki_line(x_data,y_data)
    n = numel(x_data); % 連立方程式の数
    A = zeros(n,2);    % 係数行列のサイズ(n×2)
    %% Ax = b の形に変更
    A(:,1) = x_data;
    A(:,2) = 1;
    b = y_data;
     
    %% 擬似逆行列を用いて最小2乗解を計算
    x = pinv(A) * b; % p = x(1), q = x(2)
end

実行結果(Python, MATLAB共通)

1
回帰直線: y = 1.9869x +0.0027

実行結果から、抵抗 R=p=1.9869 [Ω]、起電力V0=q=0.0027 と推定できました。

(3) 計算結果があっているかExcelで確認

Excelの近似機能を使って、本当に最小2乗法の計算が正しくできているかを y=px+qp, q の値で確認しましょう。

確かに行列で最小2乗法を計算した場合と一致していますね!

回帰直線と最小2乗法

結果が y=px+q に比例するデータが (x,y)=(x1,y1),(x2,y2),,(xn,yn) とある。

このとき、A=(x11x21xn1),   x=(pq),   b=(y1y2yn)おくことで、連立方程式 Ax=b の形に持ち込める。

さらに、A の擬似逆行列 A+ を求めることで p, q を下のように求めることができる。x=(AA)1Ab=A+b=(pq)

6. 練習問題

それでは、もう1問「行列を用いた最小2乗法の計算練習」をしましょう。

練習問題

つぎの解をもたない連立方程式{    x  y=2  4x2y=   23x+2y=   0  5x3y=   04x+3y=   4がある。この連立方程式に対して、最小2乗法を適用したい。

ここで、行列 A、ベクトル b、解ベクトル xA=(1142325343),   b=(22004),   x=(xy)とすることで、連立方程式を Ax=b と表現する。

A の擬似逆行列 A+ を求めなさい。さらに、連立方程式の計算誤差 Axb が最も小さくなるような最小2乗解 xA+ を用いて計算し、最小2乗法を適用しなさい。

7. 練習問題の答え

最小2乗解 x を擬似逆行列 A+ を用いて、x=(AA)1Ab=A+bとなるので、これを計算すればOK。

まずは3ステップで擬似逆行列 A+ を計算する。

[Step1] AA の計算

AA=(1435412233)(1142325343)=(1+16+9+25+16186151218615121+4+4+9+9)=(67424227)

[Step2] (AA)1 の計算

(AA)1=1|AA|(67424227)=118091764(27424267)=145(27424267)

[Step3] 擬似逆行列 A+=(AA)1A の計算

A+=(AA)1A=145(27424267)(1435412233)=145(27421088481+84135126108+1264267168134126+134210201168+201)=145(2524391815348933)

[Step4] 解ベクトル b の計算

x=(AA)1Ab=A+b=145(2524391815348933)(22004)=145(50+48+0+0+7230+68+0+0+132)=145(170230)=19(3446)

よって、最小2乗解 xx=(xy)=19(3446)となる。

※ ベクトル表記をしない場合は、x=349,   y=469となる。

8. さいごに

今回は、行列(擬似逆行列)を使った最小2乗法について説明しました。

まずは、1枚の画像で最小2乗法の計算方法について振り返りましょう。

最小2乗法は、単なる計算だけでなく、実験データの解析や研究など様々な分野で使えるので、是非理系の皆さんは使いこなせるようになりましょう!

それでは、また次の記事で。

注釈

注釈
1 AA の逆行列を計算するため、AA が正則でないとダメ。
2 今までの記事では、ベクトルのノルムを |x| のように絶対値っぽく表してきましたが、本記事ではベクトルのノルム(長さ)を x のように2重線で表現します。なお、念のため説明しますが、今回出てくるベクトルのノルムはすべて2ノルム(ユークリッドノルム)です。
3 AA は必ず実対称行列となる。また、転置の公式 (ABC)=CBA を多用している(転置をバラバラにすると、積の順番が逆になる。)

関連広告・スポンサードリンク

おすすめの記事