「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[DS:数学的基礎]] ---線形代数 ---[[微分・積分>DS:数学的基礎 - 微分・積分]] ---[[微分・偏微分>DS:数学的基礎 - 微分・偏微分]] ---[[確率・統計>DS:数学的基礎 - 確率・統計]] --[[データサイエンス力]] > [[データ分析]] ---[[ベイズ統計]] --[[ニューラルネットワーク(学習)]] *目次 [#i07fc9bd] #contents *概要 [#k757c95e] *詳細 [#s3e89929] **スカラ、ベクトル、行列 [#w81894f7] ***スカラ [#i81f0d5e] 数値 ***ベクトル [#ze383257] ベクトルは、 -スカラの組合せ。 -大きさ・向きを持つ。 -矢印で表される。 -ある種の演算ができる。 --ベクトルの加減算 --ベクトルの内積・外積 ***行列 [#ac9578ac] 行列は、 -スカラの組合せ。 -列ベクトルを並べたもの。 -ある種の演算ができる。 --ベクトルの変換 ---行列とベクトルの積 ---行列と行列のドット積、アダマール積 --連立方程式を解く。 **行列とベクトルの積 [#u3b86c56] ***...はベクトルの変換 [#nb849503] 行列はベクトルAをベクトルの変Bに変換している。 -前提 --Aはj行i列の行列 --eiはi成分のみ1で他は0のベクトル -答え1:Aはベクトルeiをaiに変換する。 Aei=ai -答え2:Aはベクトルpiをλi倍(λipiに変換)する。~ (詳しくは[[対角化>#h5a18d6f]]を参照) Api=λipi -ajiはAeiの第j成分(答え1の延長上で) --Aeiでi列の列ベクトルが取り出される。 --この列ベクトルのj成分がajiになる。 -解り易さ(解り難さ)保存の法則 --ベクトルeiは解り易いが、aiは良く解らない。 --ベクトルpiは良く解らないが、λiは解り易い。 ***...は電車の乗り継ぎ [#k5b5a32b] -Aはj行i列の行列で、行列のn列の列ベクトルを電車とする。 -このn列の列ベクトル(電車)をベクトルのn成分で数値倍する(x駅進む)。 -上記のi個の列ベクトル(全電車)を合成した(乗り継いだ)ベクトルが行き先。 ***...は内積を縦に並べたもの。 [#q03a97b6] -Aはj行i列の行列で、行列のn行の行ベクトル -この行ベクトルとベクトルの内積を計算する -コレを立てに並べると計算結果になる。 -内積は「類似度」や「データと係数の積」などで使用。 **行列で連立方程式を解く。 [#k6cc6fc1] 行列は連立方程式を扱うようになって発達した。 ***行基本変形 [#fcd932be] 連立方程式の加減法を行列の行基本変形で計算できる。 -行基本変形~ 行基本変形は、単位行列に同じ行基本変形をした正則行列を左からかける。 --二つの行を入れ替える。 --ある行を 0 でない定数倍する。 --ある行に、他のある行の定数倍を加える。 -列基本変形~ 列基本変形は、単位行列に同じ行基本変形をした正則行列を右からかける。 --二つの列を入れ替える。 --ある列を0でない定数倍する。 --ある列に、他のある列の定数倍を加える。 -行列を簡単にする掃き出し法は、 --1行1列を1にして、1行x列、x行1列の値を0にする。 --2行2列を1にして、2行x列、x行2列の値を0にする。 --...。 ※ 列基本変形を行っても同じ解が得られるため、通常は行基本変形が優先される。 ***逆行列 [#f43a484c] -逆行列は、当該行列とドット積で計算すると、単位行列(I)が得られる様な行列。 -行列Aの逆行列はA^-1と書き、インバースと読み、A^-1 A = A A^-1 = I(単位行列)となる様な行列。 -逆行列の求め方 --行基本変形は行列のドット積で計算でき、変形の行列をドット積で纏めると逆行列になる。 --掃き出し法の拡大行列(?)の左側に対角線に1が並ぶように行基本変形すると右側が逆行列になる。 --2行2列の行列の逆行列なら公式で計算できる。 ┌a b┐ A =└c d┘ ┌ d -b ┐ A^-1 = 1/(ab-cd)└ -c a ┘ --3行3列の行列の逆行列なら掃き出し法の拡大行列で計算できる。 ┌a b c┐ A = │d e f│ └g h i┘ ┌a b c┐ ┌a b c | 1 0 0┐ ┌1 0 0 | r s t┐ │d e f│→│d e f | 0 1 0│→│0 1 0 | u v w│ └g h i┘ └g h i | 0 0 1┘ └0 0 1 | x y z┘ ┌r s t┐ A^-1 = │u v w│ └x y z┘ --3行3列以上の行列の逆行列なら ---掃き出し法の拡大行列で計算できる。 ---行列式の余因子を用いて計算することもできる。 --参考:https://manabitimes.jp/math/1153 -逆行列はi列のベクトルaiをei(i成分のみ1で他は0のベクトル)に変換(A^-1 ai = ei) --Aei = ai(自明) → A^-1 Aei = A^-1 ai → ei = A^-1 ai --A^-1 A = A^-1(a1, a2, ... ai, ... an) = (e1, e2, ... ei, ... en) = I -連立方程式を逆行列で計算できる。 --逆行列が存在する場合、yは一次結合で表せる。 Ax = y → A^-1 Ax = A^-1 y → x = A^-1 y --逆行列が存在しない場合、~ これは、≒ 連立方程式の解が無い場合で、2以上のベクトル(=行、横ベクトル)が並行で面積がゼロの場合 ---交点がなくて並行の場合(2つのベクトルが「平行」) ---交点があって並行の場合(2つのベクトルが「同じ」か「長さが異なるダケ≒同じ」) -正方行列Aの逆行列A^-1は成分抽出(A^-1(∑xi ai) = x) --コレは行列とベクトルの積を列ベクトルとベクトルの内積の計算に置き換えたもの --コレに逆行列をかけると、A^-1 Ax = A^-1(∑xi ai) → x = A^-1(∑xi ai) となり、 --∑xi ai = y とすると、x = A^-1 y となる。これによって、一次結合の係数x(≒成分)を求めることができる。 --電車の式 A乗り継ぎx = 行き先y の逆を求める A^-1 A(乗り継ぎ)x = A^-1(行き先)y → x = A^-1 y 的な話。 ***行列式 [#l7a8ee99] 行列式によって連立方程式の解の有無を判別できる。 -行列式とは --一次方程式の可解性を判定する指標 --正方行列で列をベクトルに見立てる。 --n個のベクトルからなる面積・体積を考える。 -行列式の特性 > +1つでも平行なベクトル、同じベクトルがあれば、面積・体積はゼロで解は無い。 +1つのベクトルが*nされれば、行列式(≒面積・体積)全体がn倍される。 +1つのベクトルが+wされれば、行列式(≒面積・体積)の足し算に展開される。 +ベクトルを入れ替えると行列式はマイナスになる(が、コレは面積・体積の性質ではない。~ 入れ替え前と後のベクトルを足し算すると2つの同じベクトルがある行列式(面積・体積=0)になるので。 -行列式の計算 --たすき掛けの計算方法は3行3列の行列式までしか使えない。 ---2行2列 ┌a11 a12┐ └a21 a22┘ =a11a22-a12a21 ---3行3列 ┌a11 a12 a13┐ │a21 a22 a23│ └a31 a32 a33┘ =a11a22a33+a12a23a31+a13a21a32-a13a22a31-a12a21a33-a11a23a32 --3行3列以上の行列式は余因子展開でn-1行n-1列の行列式の計算に変換。 ---この計算は、体積の計算を面積✕高さに変換する的な話らしい。 ---この際、「行列式の特性(4)」を使用するので符号が切り替わる。 #ref(matrix-det3-1024x608.png,left,nowrap,60%) **固有値分解 [#m9ae68cd] -ある正方行列Aを直交行列と対角行列の積に分解する計算 A = 𝑉𝛬𝑉^-1 --行列の特徴が見えやすくなり、A^nの計算がラク。 --ゼロに近い[[固有値>#z8ef8aab]]は行列全体に与える影響が小さいため、~ この[[固有値>#z8ef8aab]]を無視することで、高精度で近似計算できる。 -Aが正方行列の場合、 A=┌ab┐ └cd┘ -Aの[[固有値>#z8ef8aab]]・[[固有ベクトル>#o7fc1c72]]は、 → → Av = λv -具体例 ┌1 4┐┌1┐ = ┌5┐ = 5┌1┐ └2 3┘└1┘ └5┘ └1┘ -Aの対角化 = 固有ベクトル(A = 𝑉𝛬𝑉^-1、𝛬 = 𝑉^-1A𝑉) -累乗計算が簡単になる式(A^n = 𝑉 𝛬^n 𝑉^-1)に実際値を代入([[逆行列>#w69521bd]])。 ***固有値 [#z8ef8aab] λ λは行列ではなくスカラ ***固有ベクトル [#o7fc1c72] → v ≠ 0 -λ毎にある。 -「固有ベクトルの内の一つ」というのは、ある特定の比率になっている全ベクトルの一つの意味。 ***計算方法 [#c08b060a] -以下を解くとn個の[[固有値>#z8ef8aab]]λが求まる。 -- → → Av = λv -- → → Av - λv = 0 -- → (A-λI)v = 0 -- → v ≠ 0 --|A-λI|が逆行列を持たない([[行列式>#l7a8ee99]] = 0)で解く。 --- |A-λI| = 0 --- ┌ a-λ b ┐= 0 └ c d-λ ┘ --- (a - λ)(d - λ) - bc = 0 --- (λ - x)(d - y) = 0 --- λ1 = x, λ2 = y -[[固有値>#z8ef8aab]]λの個数分、[[固有ベクトル>#o7fc1c72]]が導かれる。~ ([[固有ベクトル>#o7fc1c72]]はxn間の比率が解りさえすれば良い) -- --- → → Av = λv --- ┌ab┐┌x┐=λn┌x┐ └cd┘└y┘ └y┘ --λnに対応する[[固有ベクトル>#o7fc1c72]]、vn ---計算方法 ax + by = λnx cx + dy = λny ---[[固有ベクトル>#o7fc1c72]]、vn = (x, y)^T -[[固有値分解>#m9ae68cd]] --対角行列:正方行列の対角線上にλnを並べたもの。 ┌λ1 0 0 ┐ 𝛬 =│0 λ2 0 └0 0 ...┘ --直交行列:λnに対応する[[固有ベクトル>#o7fc1c72]]、vnを並べたもの。 𝑉 =┌→ → ┐ └v1 v2 ...┘ --A = 𝑉𝛬𝑉^-1 ---A𝑉 = 𝑉𝛬 ---A = A𝑉𝑉^-1 = 𝑉𝛬𝑉^-1 ---𝛬 = 𝑉^-1𝑉𝛬 = 𝑉^-1A𝑉 -累乗計算が簡単になる --A^n = 𝑉 𝛬^n 𝑉^-1 ---AA = (𝑉𝛬𝑉^-1)(𝑉𝛬𝑉^-1) = 𝑉𝛬(𝑉^-1𝑉)𝛬𝑉^-1 = 𝑉 𝛬^2 𝑉^-1 ---AAA = (𝑉𝛬𝑉^-1)(𝑉𝛬𝑉^-1)(𝑉𝛬𝑉^-1) = 𝑉𝛬(𝑉^-1𝑉)𝛬(𝑉^-1𝑉)𝛬𝑉^-1 = 𝑉 𝛬^3 𝑉^-1 --𝛬^n = 𝑉^-1 A^n 𝑉𝛬 ---𝛬𝛬 = (𝑉^-1𝑉𝛬)(𝑉^-1𝑉𝛬) = 𝑉^-1(𝑉𝛬𝑉^-1)𝑉𝛬 = 𝑉^-1 A 𝑉𝛬 ---𝛬𝛬𝛬 = (𝑉^-1𝑉𝛬)(𝑉^-1𝑉𝛬)(𝑉^-1𝑉𝛬) = 𝑉^-1(𝑉𝛬𝑉^-1)(𝑉𝛬𝑉^-1)𝑉𝛬 = 𝑉^-1 A^2 𝑉𝛬 -試験対策 --3*3行列の計算は大変だが、 --時間内で計算可能になるようにゼロが多く計算が楽になっている。 --また、vの穴埋め問題は以下で計算可能になっている。 → → Av = λv **特異値分解 [#eb2ec602] -あるm行n列の長方行列を直交行列と対角行列の積に分解する計算 𝑀 = 𝑈𝑆𝑉^T --[[固有値分解>#m9ae68cd]]では、Aは正方行列 --特異値分解では、Mが長方行列(主に2行3列)だが~ 𝑀^Tを掛けて𝑀𝑀^Tと正方行列化することで似たように処理する。 ---MM^T(2行2列)を固有値分解すれば左特異ベクトル。 ---M^TM(3行3列)を固有値分解すれば右特異ベクトル(やっている時間はない) -特異値σは固有値√λだが、特異値分解の計算は固有値分解(λ)で行う。 -𝑀の[[特異値>#ied62513]]σ・[[特異ベクトル>#le220e49]]uvは、 -- → → 𝑀v = σu -- → → 𝑀^Tu = σv -[[固有値分解>#m9ae68cd]]に対し特異値分解は --[[固有値分解>#m9ae68cd]] A = 𝑉𝛬𝑉^-1 --特異値分解 𝑀 = 𝑈𝑆𝑉^-1 --𝑀𝑀^Tとか𝑀^T𝑀(対称行列)を[[固有値分解>#m9ae68cd]] -特異値分解の利用例、白黒画像の --圧縮などに利用できる。 --特異値が似ていれば分類できる可能性がある。 ***特異値 [#ied62513] σ ***特異ベクトル [#le220e49] -左特異ベクトル → u -右特異ベクトル → v -それぞれ、 --直交する。 --[[単位ベクトル>#rd8760e7]] ---大きさを変えないため。 ---UV直交行列を単位行列にすると転置すると逆行列になる。 ***単位ベクトル [#rd8760e7] 以下の計算から各要素の二乗の合計の平方根になる。 ┌x┐ ┌cx┐ c│y│=│cy│ └z┘ └cz┘ (cx)^2+(cy)^2+(cz)^2 = 1 c^2 * (x^2 + y^2 + z^2) = 1 c = 1 / √(x^2 + y^2 + z^2) ***計算方法 [#r5220359] -[[特異値>#ied62513]]σは以下のようなもの。 -- → → 𝑀v = σu -- → → 𝑀^Tu = σv -特異値分解 --対角行列:r行r列の正方行列の対角線上にσを並べたもの。 ┌σ1 0 0 ┐ 𝑆=│0 σ2 0 └0 0 ...┘ --直交行列は[[特異ベクトル>#le220e49]]を並べたもの。 ---左特異ベクトルは𝑀𝑀^T固有値分解の直交行列(転置で逆行列) 𝑈=┌→ → ┐ └u1 u2 ...┘ ---右特異ベクトルは𝑀^T𝑀の固有値分解の直交行列(転置で逆行列) 𝑉=┌→ → ┐ └v1 v2 ...┘ --𝑀𝑀^T、𝑀^T𝑀の ---√λ([[固有値>#z8ef8aab]]) = σ([[特異値>#ied62513]])~ ---[[固有ベクトル>#o7fc1c72]]がそれぞれ[[特異ベクトル>#le220e49]] 𝑈(左)、𝑉(右)となるらしい。 ---([[特異ベクトル>#le220e49]]は[[固有ベクトル>#o7fc1c72]]なので計算にはλ([[固有値>#z8ef8aab]])を使う) ---𝑀 = 𝑈𝑆𝑉^T ---𝑀𝑉 = 𝑈𝑆𝑉^T𝑉 = 𝑈𝑆 ---𝑀^T = 𝑉𝑆^T𝑈^T ---𝑀^T𝑈 = 𝑉𝑆^T𝑈^T𝑈 = 𝑉𝑆^T ---𝑀𝑀^T = (𝑈𝑆𝑉^T)(𝑉𝑆^T𝑈^T) = 𝑈𝑆(𝑉^T𝑉)𝑆^T𝑈^T = 𝑈 (𝑆𝑆^T) 𝑈^T ---𝑀^T𝑀 = (𝑉𝑆^T𝑈^T)(𝑈𝑆𝑉^T) = 𝑉𝑆^T(𝑈^T𝑈)𝑆𝑉^T = 𝑉 (𝑆^T𝑆) 𝑉^T -試験対策 --3*3行列の計算は大変だが、 --時間内で計算可能になるようにゼロが多く計算が楽になっている。 --また、𝑉、𝑈の穴埋め問題は、𝑈を正規直行性で算出し、 --𝑉のx=xとかy=yの場合の±1の符号を選択させるなど。 **後付の、そもそも対角化とは? [#h5a18d6f] 対角化([[固有値分解>#m9ae68cd]]、[[特異値分解>#eb2ec602]])は[[変換の表現技法の一つ。>#nb849503]] ***[[Api = λipi>#nb849503]] [#y4bb0500] [[固有値分解>#m9ae68cd]]:piにAをかけるとpiのλi倍になる。 -λi:固有値 -pi:固有ベクトル -証明 --A = 𝑉𝛬𝑉^-1 --Api = 𝑉𝛬𝑉^-1 pi --[[逆行列>#f43a484c]]はi列のベクトルaiをeiに変換(A^-1ai = ei)するので、 --Api = 𝑉𝛬 ei --Aはベクトルeiをaiに変換(Aei=ai)、 --且つaiはeiが1の成分のみλi(ai=λiei)なので --Api = 𝑉λiei --λi(固有値)はスカラなので外に出せる。 --Api = λi𝑉ei --Aはベクトルeiをaiに変換(Aei=ai)するので、 --Api = λipi ***A∑xi pi = ∑λi xi pi [#f99c83b8] [[固有値分解>#m9ae68cd]]:Ayを計算する際(Aは正方行列、yはベクトル)。 -y = ∑xi pi = x1 p1 + x2 p2 とする。 -A = λ1 p1 + λ2 p2 なので、 -Ay = A∑xi pi = λ1 x1 p1 + λ2 x2 p2 = ∑λi xi pi -A^n y = A^n ∑xi pi = λ1^n x1 p1 + λ2^n x2 p2 = ∑λi^n xi pi とできる(x1, x2をどうやって求めるか?は[[次回>#af686403]]に説明)。 ***A = 𝑉𝛬𝑉^-1 [#af686403] -[[固有値分解>#m9ae68cd]]:Ay を Ay = 𝑉𝛬𝑉^-1 y で計算できる。 --y = ∑xi pi = x1 p1 + x2 p2 のx1, x2は、~ [[逆行列の成分抽出>#f43a484c]]で求める事が出来る(x = 𝑉^-1 y)。 ---pi なので 𝑉 を使う。 y = 𝑉┌x1┐ └x2┘ ---コレを求めるには𝑉^-1を使う。 𝑉^-1 y = 𝑉^-1 𝑉┌x1┐ = ┌x1┐ └x2┘ └x2┘ --で、 Ay = 𝑉𝛬 ┌x1┐ └x2┘ --で、 Ay = 𝑉 ┌λ1x1┐ └λ1x2┘ --[[前回>#f99c83b8]]の式に戻る。 Ay = p1 λ1 x1 + p2 λ2 x2 = ∑λi xi pi -上記を要約すると Ay = 𝑉𝛬𝑉^-1 y を以下の3ステップ(式を右から計算)で解くことが出来る。 --ステップ1:𝑉^-1 yでは、yをpで表した際のx成分を計算し、 --ステップ2:これに左から対角行列𝛬をかけるので、x1はλ1倍、x2はλ2倍 ... xnはλn倍 と固有値倍し、 --ステップ3:これに左から𝑉をかけるので = p1 λ1 x1 + p2 λ2 x2 + ... + pn λn xn = ∑λi xi pi と固有ベクトルでベクトルに戻す。 *参考 [#s56df69b] **[[NumPy]] [#ycf9b306] **Qiita [#x9a28fd1] -【ハックしないE資格対策記-02-】~固有値分解って結局何なの?圏を突破しよう~ #機械学習~ https://qiita.com/Nuka-san-Engineering/items/e4045942d3e95f6c26d9 -【ハックしないE資格対策記-03-】~さようなら、全ての付け焼刃特異値分解~ #機械学習~ https://qiita.com/Nuka-san-Engineering/items/ebc63564db8c525cf75d **YouTube [#c34a3b54] -線型代数基礎シリーズ~ https://www.youtube.com/playlist?list=PLhDAH9aTfnxKfmufxF59vaZECZJD5j6rd