multivariate function
multivariable function(ℝⁿ⇨ℝ)
「多變數函數」、「多元函數」。輸入推廣成向量。
一個函數,輸入推廣成多個數值。
f(x, y, z) = x + yz
多個數值甚至組成向量。多個數值視作一個元件,佯裝成普通的函數。
⎡ x ⎤ f( ⎢ y ⎥ ) = x + yz ⎣ z ⎦ f(x) = y
方便起見,我們重新設定變數名稱,依序標上編號。數學家從1開始,計算學家從0開始。因為這是數學式子,所以從1開始。
⎡ x₁ ⎤ f( ⎢ x₂ ⎥ ) = x₁ + x₂x₃ ⎣ x₃ ⎦ f(x) = y
multivariate function(ℝⁿ⇨ℝᵐ)(nonlinear function)
「多變量函數」。輸入輸出推廣成向量。
多個函數。共用輸入。
⎧ f₁(x, y) = x + y ⎨ f₂(x, y) = 2x² + 1 ⎩ f₃(x, y) = 1 / y
數學家重新解讀為:一個函數,輸入與輸出推廣成多個數值。微觀是多個函數,宏觀是一個函數。
F(x, y) = (x + y, 2x² + 1, 1 / y)
多個數值甚至組成向量。多個數值視作一個元件,佯裝成普通的函數。「多個函數」佯裝成「一個多變量函數」。寫來簡便,讀來卻傷腦筋,初學者可能要花時間習慣一下。
⎡ x + y ⎤ F( ⎡ x ⎤ ) = ⎢ 2x² + 1 ⎥ ⎣ y ⎦ ⎣ 1 / y ⎦ F(x) = y
方便起見,我們重新設定變數名稱,依序標上編號。數學家從1開始,計算學家從0開始。因為這是數學式子,所以從1開始。
⎡ x₁ + x₂ ⎤ F( ⎡ x₁ ⎤ ) = ⎢ 2x₁² + 1 ⎥ ⎣ x₂ ⎦ ⎣ 1 / x₂ ⎦ F(x) = y
multivariate root finding
multivariate root finding(nonlinear equation)
「多變量求根」。多變量函數求根。
輸出變成多個數值,衍生一個問題:如何求斜率?
導數們從上到下、從左到右依序併成矩陣。細節請見後面章節。
⎡ f₁(x) ⎤ F(x) = ⎢ f₂(x) ⎥ ⎣ f₃(x) ⎦ ∂ ⎡ | | | ⎤ F′(x) = —— F(x) = ⎢ f₁′(x) f₂′(x) f₃′(x) ⎥ ∂x ⎣ | | | ⎦
演算法(ℝ⇨ℝ Newton's method)
從頭複習一遍牛頓法吧。
座標(x, f(x))的切線,與座標軸相交之處,作為下一個x。
斜率是直除以橫。得到一道等式。
高度f(xₜ),除以跨距(xₜ - xₜ₊₁),得到切線斜率f′(xₜ)。
f′(xₜ) = f(xₜ) / (xₜ - xₜ₊₁)
只有乘法,沒有除法。
f′(xₜ) (xₜ - xₜ₊₁) = f(xₜ)
移項整理,提出xₜ₊₁。得到牛頓法公式。
xₜ₊₁ = xₜ - f(xₜ) / f′(xₜ)
時間複雜度O(T),T是遞推次數。
演算法(ℝⁿ⇨ℝ Newton's method)
牛頓法,推廣成許多個輸入變數。
斜率推廣成梯度。切線推廣成切面。交點推廣成交線。
k[x_, y_] := Sqrt[(1.5*x*x*x)^2] + Sqrt[(2*y*y*y)^2] + 0.5*x*y - 0.05; f[x_, y_] := k[x + .4, y + .3]; x0 = .5 - .4; y0 = .65 - .3; f0 = f[x0,y0]; gx0 = N[Derivative[1,0][f][x0,y0]]; gy0 = N[Derivative[0,1][f][x0,y0]]; xyplane = Graphics3D[{Opacity[0], Polygon[{{-1,-1,0},{-1,1,0},{1,1,0},{1,-1,0}}]}, Boxed -> False (*, ViewPoint -> {0, 0, -Infinity}*) ]; func = Plot3D[f[x,y], {x, -1, 1}, {y, -1, 1}, PlotRange -> {-1, 1}, ClippingStyle -> None, Mesh -> None, PlotStyle->Opacity[0.8], RegionFunction -> Function[{x, y, z}, 0 <= z <= 1], ColorFunction -> (ColorData["CherryTones"][Rescale[#3, {-2, 2}]] &)]; plane = Plot3D[gx0*(x-x0)+gy0*(y-y0)+f0, {x, -1, 1}, {y, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.8], ColorFunction -> (RGBColor[0,112,192] &), RegionFunction -> Function[{x, y, z}, 0 <= z <= 1]]; root = Plot3D[0, {x, -1, 1}, {y, -1, 1}, PlotRange -> {-1, 1}, PlotStyle -> Opacity[0], Mesh -> None, RegionFunction -> Function[{x, y, z}, f[x,y] > 0]]; levelset = SliceContourPlot3D[f[x,y], z == 0, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, PlotRange -> {-1, 1}, Contours -> Table[i,{i,0,1,0.1}], ContourShading -> None, ContourStyle -> LightGray, BoundaryStyle -> LightGray]; x0bar = Graphics3D[{Black, Line[{{x0, -1, 0},{x0, y0, 0}}]}]; y0bar = Graphics3D[{Black, Line[{{-1, y0, 0},{x0, y0, 0}}]}]; f0bar = Graphics3D[{Thickness[0.01], CapForm["Butt"], Black, Line[{{x0, y0, 0},{x0, y0, f0}}]}]; f0point = Graphics3D[{Black, Sphere[{x0, y0, f0}, 0.05]}]; x1 = x0 - f0 * gx0 / ((gx0 ^ 2) + (gy0 ^ 2)); y1 = y0 - f0 * gy0 / ((gx0 ^ 2) + (gy0 ^ 2)); x1bar = Graphics3D[{Black, Line[{{x1, -1, 0},{x1, y1, 0}}]}]; y1bar = Graphics3D[{Black, Line[{{-1, y1, 0},{x1, y1, 0}}]}]; line = Graphics3D[{Black, Line[{{x0, y0, f0},{x1, y1, 0}}]}]; xs = -f0 / gx0 + x0; ys = -f0 / gy0 + y0; xsline = Graphics3D[{Black, Line[{{xs, y0, 0},{x0, y0, f0}}]}]; ysline = Graphics3D[{Black, Line[{{x0, ys, 0},{x0, y0, f0}}]}]; xspoint = Graphics3D[{Black, Sphere[{xs, y0, 0}, 0.05]}]; yspoint = Graphics3D[{Black, Sphere[{x0, ys, 0}, 0.05]}];
Show[xyplane,func,plane,f0point,f0bar,x0bar,y0bar] (* RGBColor[168,206,234] *) Show[xyplane,plane,f0point,f0bar,x0bar,y0bar,x1bar,y1bar,line] Show[xyplane,root,plane]
X方向切線與XY平面的交點、Y方向切線與XY平面的交點,兩交點連線,得到交線。
Show[xyplane,plane,f0point,f0bar,x0bar,y0bar,xsline,ysline,xspoint,yspoint] Show[xyplane,func,plane] (* ViewPoint -> {0, 0, -Infinity} *)
切面上有許多切線,可以作為前進方向;交線上有許多點,可以作為下一個x。牛頓法選擇了最短切線:垂直於交線。
Show[xyplane,plane,f0point,f0bar,x0bar,y0bar]
最短切線一定是梯度方向。等高線的垂直方向。
Show[xyplane,plane,levelset,f0point,f0bar,x0bar,y0bar,x1bar,y1bar,line] ContourPlot[f[x,y], {x, -1, 1}, {y, -1, 1}, Frame -> False, ContourShading -> None, Contours -> Table[i,{i,0,1,0.1}]]
接下來把上述概念寫成數學式子。
乘法推廣成點積。得到所有切線。
∇f(xₜ)ᵀ (xₜ - xₜ₊₁) = f(xₜ)
除法推廣成點積反運算(虛擬反矩陣)。得到最短切線。
∇f(xₜ) f(xₜ) ∇f(xₜ) f(xₜ) (xₜ - xₜ₊₁) = ∇f(xₜ)ᵀ⁺ f(xₜ) = ———————————— = —————————————— ‖∇f(xₜ)‖² ∇f(xₜ)ᵀ ∇f(xₜ)
移項整理,提出xₜ₊₁。得到牛頓法公式。
∇f(xₜ) f(xₜ) xₜ₊₁ = xₜ - ∇f(xₜ)ᵀ⁺ f(xₜ) = xₜ - —————————————— ∇f(xₜ)ᵀ ∇f(xₜ)
時間複雜度O(NT),N是變數數量,T是遞推次數。
演算法(ℝⁿ⇨ℝᵐ Newton's method)
牛頓法,推廣成多變量函數。
F′(xₜ)ᵀ (xₜ - xₜ₊₁) = F(xₜ) (xₜ - xₜ₊₁) = F′(xₜ)ᵀ⁺ F(xₜ) xₜ₊₁ = xₜ - F′(xₜ)ᵀ⁺ F(xₜ)
改寫成Jacobian matrix風格。
xₜ₊₁ = xₜ - J(xₜ)⁺ F(xₜ) where J(xₜ) = F′(xₜ)ᵀ
時間複雜度O(N³T),N是變數數量與函數數量較大者,T是遞推次數。
演算法(ℝ⇨ℝ secant method)
從頭複習一遍割線法吧。
座標(x₁, f(x₁))與(x₂, f(x₂))的割線,與座標軸相交之處,作為下一個x。
牛頓法是切線斜率f′(xₜ)。割線法是割線斜率sₜ。
Newton's method f′(xₜ) = f(xₜ) / (xₜ - xₜ₊₁) secant method ⎰ sₜ = (f(xₜ₋₁) - f(xₜ)) / (xₜ₋₁ - xₜ) ⎱ sₜ = (f(xₜ) - 0) / (xₜ - xₜ₊₁)
只有乘法,沒有除法。
⎰ sₜ (xₜ₋₁ - xₜ) = f(xₜ₋₁) - f(xₜ) ⎱ sₜ (xₜ - xₜ₊₁) = f(xₜ) - 0
二式移項整理,提出xₜ₊₁。
xₜ₊₁ = xₜ - f(xₜ) / sₜ
一式代入二式,得到割線法公式。
xₜ₊₁ = xₜ - f(xₜ) (xₜ₋₁ - xₜ) / (f(xₜ₋₁) - f(xₜ))
改寫成跨距風格。負負得正。
xₜ₊₁ = xₜ - f(xₜ) Δxₜ / Δfₜ where Δxₜ = xₜ - xₜ₋₁ Δfₜ = f(xₜ) - f(xₜ₋₁)
時間複雜度O(T),T是遞推次數。
演算法(ℝⁿ⇨ℝ secant method)
割線法,推廣成許多個輸入變數。
斜率推廣成梯度。割線推廣成割面。交點推廣成交線。
k[x_, y_] := Sqrt[(1.5*x*x*x)^2] + Sqrt[(2*y*y*y)^2] + 0.5*x*y - 0.05; f[x_, y_] := k[x + .4, y + .3]; x0 = .5 - .4; y0 = .65 - .3; f0 = f[x0,y0]; x1 = .425 - .4; y1 = .45 - .3; f1 = f[x1,y1]; dx = x0 - x1; dy = y0 - y1; df = f0 - f1; d = (dx ^ 2) + (dy ^ 2); gx1 = df * dx / d; gy1 = df * dy / d; g1 = (gy1 ^ 2) + (gx1 ^ 2); x2 = x1 - f1 * gx1 / g1; y2 = y1 - f1 * gy1 / g1; t[x_, y_] := gx1*(x-x1) + gy1*(y-y1) + f1; x0bar = Graphics3D[{Black, Line[{{x0, -1, 0},{x0, y0, 0}}]}]; y0bar = Graphics3D[{Black, Line[{{-1, y0, 0},{x0, y0, 0}}]}]; f0bar = Graphics3D[{Thickness[0.01], CapForm["Butt"], Black, Line[{{x0, y0, 0},{x0, y0, f0}}]}]; f0point = Graphics3D[{Black, Sphere[{x0, y0, f0}, 0.05]}]; x1bar = Graphics3D[{Black, Line[{{x1, -1, 0},{x1, y1, 0}}]}]; y1bar = Graphics3D[{Black, Line[{{-1, y1, 0},{x1, y1, 0}}]}]; f1bar = Graphics3D[{Thickness[0.01], CapForm["Butt"], Black, Line[{{x1, y1, 0},{x1, y1, f1}}]}]; f1point = Graphics3D[{Black, Sphere[{x1, y1, f1}, 0.05]}]; x2bar = Graphics3D[{Black, Line[{{x2, -1, 0},{x2, y2, 0}}]}]; y2bar = Graphics3D[{Black, Line[{{-1, y2, 0},{x2, y2, 0}}]}]; line = Graphics3D[{Black, Line[{{x0, y0, f0},{x2, y2, 0}}]}]; xyplane = Graphics3D[{Opacity[0], Polygon[{{-1,-1,0},{-1,1,0},{1,1,0},{1,-1,0}}]}, Boxed -> False (*, ViewPoint -> {0, 0, -Infinity}*) ]; func = Plot3D[f[x,y], {x, -1, 1}, {y, -1, 1}, PlotRange -> {-1, 1}, ClippingStyle -> None, Mesh -> None, PlotStyle->Opacity[0.8], RegionFunction -> Function[{x, y, z}, 0 <= z <= 1], ColorFunction -> (ColorData["CherryTones"][Rescale[#3, {-2, 2}]] &)]; plane = Plot3D[t[x,y], {x, -1, 1}, {y, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.8], ColorFunction -> (RGBColor[0,112,192] &), RegionFunction -> Function[{x, y, z}, 0 <= z <= 1]]; intersect = Plot3D[t[x,y]+0.02, {x, -1, 1}, {y, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.8], ColorFunction -> (RGBColor[0,112,192] &), RegionFunction -> Function[{x, y, z}, z >= f[x,y]+0.02]];
Show[xyplane,func,plane,intersect,x0bar,y0bar,f0bar,f0point,x1bar,y1bar,f1bar,f1point] (* RGBColor[168,206,234] *) Show[xyplane,plane,x0bar,y0bar,f0bar,f0point,x1bar,y1bar,f1bar,f1point,x2bar,y2bar,line]
兩點之間有許多割面。割線法選擇了最正割面:其交線垂直於兩點連線。
par = LinearSolve[{{x0, y0, 1}, {x1, y1, 1}, {x0 - 0.07, 0, 1}}, {f0, f1, 0}]; par = LinearSolve[{{x0, y0, 1}, {x1, y1, 1}, {x0 + 0.005, 0, 1}}, {f0, f1, 0}]; planebad = Plot3D[(par[[1]]*x)+(par[[2]]*y)+par[[3]], {x, -1, 1}, {y, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.8], ColorFunction -> (RGBColor[0,112,192] &), RegionFunction -> Function[{x, y, z}, 0 <= z <= 1]]; intersectbad = Plot3D[(par[[1]]*x)+(par[[2]]*y)+par[[3]]+0.02, {x, -1, 1}, {y, -1, 1}, Mesh -> None, PlotStyle -> Opacity[0.8], ColorFunction -> (RGBColor[0,112,192] &), RegionFunction -> Function[{x, y, z}, 1 >= z >= f[x,y]+0.02]]; Show[xyplane,func,planebad,intersectbad,x0bar,y0bar,f0bar,f0point,x1bar,y1bar,f1bar,f1point]
割面上有許多割線,可以作為前進方向;交線上有許多點,可以作為下一個x。割線法選擇了最短割線:垂直於交線。
Show[xyplane,plane,x0bar,y0bar,f0bar,f0point,x1bar,y1bar,f1bar,f1point]
接下來把上述概念寫成數學式子。
點積。得到所有割面。
sₜᵀ (xₜ₋₁ - xₜ) = f(xₜ₋₁) - f(xₜ)
點積反運算(虛擬反矩陣)。得到最正割面。
sₜᵀ = (f(xₜ₋₁) - f(xₜ)) (xₜ₋₁ - xₜ)⁺ = Δfₜ Δxₜ⁺
點積。得到所有割線。
sₜᵀ (xₜ - xₜ₊₁) = f(xₜ) where sₜᵀ = Δfₜ Δxₜ⁺
點積反運算(虛擬反矩陣)。得到最短割線。
(xₜ - xₜ₊₁) = sₜᵀ⁺ f(xₜ) = (Δfₜ Δxₜ⁺)⁺ f(xₜ) = Δxₜ Δfₜ⁺ f(xₜ)
移項整理,提出xₜ₊₁。得到割線法公式。
xₜ₊₁ = xₜ - Δxₜ Δfₜ⁺ f(xₜ)
然而割線法只會走一直線,往往走不到根。沒人使用割線法。
演算法(ℝⁿ⇨ℝᵐ secant method)
割線法,推廣成多變量函數。
xₜ₊₁ = xₜ - Δxₜ ΔFₜ⁺ F(xₜ)
一樣沒人用。
演算法(Broyden's method)
割線法改良版。不選擇最正割面,避免走一直線。
割線法寫成兩道式子,先改良第一式,再改良第二式。
⎰ Sₜᵀ = (F(xₜ₋₁) - F(xₜ)) (xₜ₋₁ - xₜ)⁺ = ΔFₜ Δxₜ⁺ ⎱ xₜ₊₁ = xₜ - Sₜᵀ⁺ F(xₜ)
一、改成遞推更新割面。用前一個割面,求後一個割面。
故意製造Sₜ₋₁。移項整理,提出Sₜ。得到割面遞迴公式。
最初的割面,設定成隨機梯度(隨便亂歪),或者第一點的切面的梯度(不會太歪)。
最初的割面,故意設定成歪的;之後的割面,故意保持是歪的。得以螺旋行進至根。
Sₜᵀ Δxₜ = ΔFₜ (Sₜ - Sₜ₋₁ + Sₜ₋₁)ᵀ Δxₜ = ΔFₜ (Sₜ - Sₜ₋₁)ᵀ Δxₜ + Sₜ₋₁ᵀ Δxₜ = ΔFₜ (Sₜ - Sₜ₋₁)ᵀ Δxₜ = ΔFₜ - Sₜ₋₁ᵀ Δxₜ (Sₜ - Sₜ₋₁)ᵀ = (ΔFₜ - Sₜ₋₁ᵀ Δxₜ) Δxₜ⁺ Sₜᵀ - Sₜ₋₁ᵀ = (ΔFₜ - Sₜ₋₁ᵀ Δxₜ) Δxₜ⁺ Sₜᵀ = Sₜ₋₁ᵀ + (ΔFₜ - Sₜ₋₁ᵀ Δxₜ) Δxₜ⁺
Δxₜ⁺ = Δxₜᵀ / ‖Δxₜ‖² = Δxₜᵀ / (Δxₜᵀ Δxₜ)
第一式改良完畢,得到計算公式。
⎰ Sₜᵀ = Sₜ₋₁ᵀ + (ΔFₜ - Sₜ₋₁ᵀ Δxₜ) Δxₜ⁺ ⎱ xₜ₊₁ = xₜ - Sₜᵀ⁺ F(xₜ)
移項的效果:前後兩個割面,梯度差異盡量小。
min ‖Sₜ - Sₜ₋₁‖² subject to Sₜᵀ Δxₜ = ΔFₜ
二、改成直接紀錄虛擬反矩陣。避免不斷計算虛擬反矩陣。
令Cₜᵀ = Sₜᵀ⁺。
Sₜᵀ Δxₜ = ΔFₜ Cₜᵀ ΔFₜ = Δxₜ (Cₜ - Cₜ₋₁ + Cₜ₋₁)ᵀ ΔFₜ = Δxₜ (Cₜ - Cₜ₋₁)ᵀ ΔFₜ + Cₜ₋₁ᵀ ΔFₜ = Δxₜ (Cₜ - Cₜ₋₁)ᵀ ΔFₜ = Δxₜ - Cₜ₋₁ᵀ ΔFₜ (Cₜ - Cₜ₋₁)ᵀ = (Δxₜ - Cₜ₋₁ᵀ ΔFₜ) ΔFₜ⁺ Cₜᵀ - Cₜ₋₁ᵀ = (Δxₜ - Cₜ₋₁ᵀ ΔFₜ) ΔFₜ⁺ Cₜᵀ = Cₜ₋₁ᵀ + (Δxₜ - Cₜ₋₁ᵀ ΔFₜ) ΔFₜ⁺
ΔFₜ⁺ = ΔFₜᵀ / ‖ΔFₜ‖² = ΔFₜᵀ / (ΔFₜᵀ ΔFₜ)
第二式改良完畢,得到計算公式。
⎰ Cₜᵀ = Cₜ₋₁ᵀ + (Δxₜ - Cₜ₋₁ᵀ ΔFₜ) ΔFₜ⁺ ⎱ xₜ₊₁ = xₜ - Cₜᵀ F(xₜ)
移項的效果:前後兩個割面,梯度的虛擬反矩陣差異盡量小。
min ‖Cₜ - Cₜ₋₁‖² subject to Cₜᵀ ΔFₜ = Δxₜ
時間複雜度O(NMT),N是變數數量,M是函數數量,T是遞推次數。
演算法(fixed point iteration)
不動點遞推法,推廣成多變量函數。
函數和變數必須一樣多個。
xₜ₊₁ = xₜ + λ F(xₜ)
multivariate optimization
multivariate optimization(nonlinear least squares)
「多變量最佳化」。多變量函數最佳化。
輸出變成多個數值,衍生兩個問題:如何比大小?如何求斜率?
比大小有兩種方式:
multiobjective optimization 輸出數值們的加權平均數(非長度函數) multivariate optimization 輸出數值們的平方和(長度平方函數)
本文介紹平方和。目標函數是輸出數值們的平方和‖F(x)‖²。
⎡ f₁(x) ⎤ F(x) = ⎢ f₂(x) ⎥ ⎣ f₃(x) ⎦ ‖F(x)‖² = F(x)ᵀF(x) = f₁(x)² + f₂(x)² + f₃(x)²
演算法(Newton's method)
一次微分等於零的地方是極值、鞍點。
牛頓法求極值。事先微分,然後求根。
xₜ₊₁ = xₜ - f″(xₜ)ᵀ⁺ f′(xₜ)
目標函數是‖F(x)‖²。
xₜ₊₁ = xₜ - [ ∂²/∂x² ‖F(x)‖² ]ᵀ⁺ [ ∂/∂x ‖F(x)‖² ] 求值就不寫了 xₜ₊₁ = xₜ - [ 2 F″(xₜ)ᵀ F(xₜ) + 2 F′(xₜ) F′(xₜ)ᵀ ]ᵀ⁺ [ 2 F′(xₜ) F(xₜ) ]
時間複雜度取決於二階導數F″(xₜ)。大家投機取巧,避開二階導數,衍生兩種流派。
擬牛頓法(割線法):用別的東西代替二階導數,例如DFP、BFGS。
高斯牛頓法:直接無視二階導數,例如GN、LM。
演算法(Davidon–Fletcher–Powell algorithm)
Broyden's method求極值。事先微分,然後求根。
注意到二階導數必須是對稱矩陣。
min ‖Sₜ - Sₜ₋₁‖² subject to Sₜᵀ Δxₜ = ΔFₜ and Sₜᵀ = Sₜ ^^^^^^^^^^^^
演算法(Broyden–Fletcher–Goldfarb–Shanno algorithm)
Broyden's method求極值。事先微分,然後求根。
改成直接紀錄虛擬反矩陣。避免不斷計算虛擬反矩陣。
min ‖Cₜ - Cₜ₋₁‖² subject to Cₜᵀ ΔFₜ = Δxₜ and Cₜᵀ = Cₜ ^^^^^^^^^^^^
演算法(Gauss–Newton algorithm)
牛頓法求極值,但是省略二階導數項,簡化計算過程。
xₜ₊₁ = xₜ - f″(xₜ)ᵀ⁺ f′(xₜ) xₜ₊₁ = xₜ - [ ∂²/∂x² ‖F(x)‖² ]ᵀ⁺ [ ∂/∂x ‖F(x)‖² ] 求值就不寫了 xₜ₊₁ = xₜ - [ 2 F″(xₜ)ᵀ F(xₜ) + 2 F′(xₜ) F′(xₜ)ᵀ]ᵀ⁺ [ 2 F′(xₜ) F(xₜ) ] xₜ₊₁ ≈ xₜ - [ 2 F′(xₜ) F′(xₜ)ᵀ ]ᵀ⁺ [ 2 F′(xₜ) F(xₜ) ] 省略二階導數項 xₜ₊₁ ≈ xₜ - [ F′(xₜ) F′(xₜ)ᵀ ]ᵀ⁺ F′(xₜ) F(xₜ) 分子分母同除2 xₜ₊₁ ≈ xₜ - [ F′(xₜ) F′(xₜ)ᵀ ]⁺ F′(xₜ) F(xₜ) 對稱矩陣,省略轉置
改寫成Jacobian matrix風格。
xₜ₊₁ ≈ xₜ - [ J(xₜ)ᵀ J(xₜ) ]⁺ J(xₜ)ᵀ F(xₜ) ---> xₜ₊₁ = xₜ - (JᵀJ)⁺JᵀF
碰巧是normal equation,精簡成虛擬反矩陣。
xₜ₊₁ ≈ xₜ - J(xₜ)⁺ F(xₜ) ---> xₜ₊₁ = xₜ - J⁺F
計算公式,完完全全就是牛頓法求根。
ℝ⇨ℝ 求根 xₜ₊₁ = xₜ - f(xₜ) / f′(xₜ) ℝⁿ⇨ℝ 求根 xₜ₊₁ = xₜ - f(xₜ) / f′(xₜ)ᵀ = xₜ - J⁺f ℝⁿ⇨ℝᵐ 求根 xₜ₊₁ = xₜ - F(xₜ) / F′(xₜ)ᵀ = xₜ - J⁺F ℝ⇨ℝ 求極值 xₜ₊₁ = xₜ - f′(xₜ) / f″(xₜ) ℝⁿ⇨ℝ 求極值 xₜ₊₁ = xₜ - f′(xₜ) / f″(xₜ)ᵀ = xₜ - H⁺f′ ℝⁿ⇨ℝᵐ 求極值 xₜ₊₁ = xₜ - E′(xₜ) / E″(xₜ)ᵀ ≈ xₜ - J⁺F 註:虛擬反矩陣改寫成矩陣除法風格。 註:E(x) = ‖F(x)‖²
演算法(gradient descent)
不動點遞推法求極值。事先微分,然後求根。
xₜ₊₁ = xₜ - λ f′(xₜ)
目標函數是‖F(x)‖²。
xₜ₊₁ = xₜ - λ [ ∂/∂x ‖F(x)‖² ] xₜ₊₁ = xₜ - λ [ 2 F′(xₜ) F(xₜ) ] xₜ₊₁ = xₜ - λ F′(xₜ) F(xₜ) 倍率2併入步伐大小λ
改寫成Jacobian matrix風格。
xₜ₊₁ = xₜ - λ J(xₜ)ᵀ F(xₜ) ---> xₜ₊₁ = xₜ - λJᵀF
演算法(Levenberg–Marquardt algorithm)
牛頓法求極值:前進方向因地制宜,攻頂路線短。步伐大小不可調整(二階導數的倒數,曲率半徑越大、路線越直、步伐越大),最初只能亦步亦趨。
不動點遞推法求極值:前進方向不可調整(梯度方向),攻頂路線長。步伐大小可以調整,最初就能一步登天。
Gauss–Newton algorithm與gradient descent的前進方向,取加權平均。隨時視情況調整權重,兩害相權取其輕。
xₜ₊₁ = xₜ - (J⁺ + λJᵀ)F ^^ ^^^ Newton fixpoint
有人將gradient descent做梯度正規化。
JᵀJ的對角線元素,是梯度的每個元素的平方。diag(JᵀJ)將之併成一個向量。diag(JᵀJ)⁺形成倒數,即是梯度正規化──然而他忘了開根號。大家將錯就錯。
xₜ₊₁ = xₜ - (J⁺ + diag(JᵀJ)⁺ λJᵀ)F ^^ ^^^^^^^^^^ ^^^ Newton normalize fixpoint
有人從normal equation那道式子下手,寫成另外一種風格。
xₜ₊₁ = xₜ - [JᵀJ + 1/λ diag(JᵀJ)]⁺ JᵀF ^^^ ^^^^^^^^^^^^^ Newton normalized fixpoint
differential calculus: multivariate function
多變量函數微分
函數對各個變數微分。得到各個導數。
f(x) = (2x₁² + x₁x₂ + x₃²) ∂f ∂f ∂f ——— = 4x₁ + x₂ ——— = x₁ ——— = 2x₃ ∂x₁ ∂x₂ ∂x₃
函數對向量微分。導數們從上到下依序併成向量。
⎡ x₁ ⎤ f(x) = (2x₁² + x₁x₂ + x₃²) x = ⎢ x₂ ⎥ ⎣ x₃ ⎦ ∂ ⎡ ∂f/∂x₁ ⎤ ⎡ 4x₁ + x₂ ⎤ f′(x) = —— f(x) = ⎢ ∂f/∂x₂ ⎥ = ⎢ x₁ ⎥ ∂x ⎣ ∂f/∂x₃ ⎦ ⎣ 2x₃ ⎦
多個函數,從上到下依序併成一個向量,成為多變量函數。
多變量函數對向量微分。導數們從左到右依序併成矩陣。
⎡ f₁(x) ⎤ ⎡ 2x₁² + x₁x₂ + x₃² ⎤ ⎢ f₂(x) ⎥ ⎢ x₁x₂ + x₂x₃ + x₃x₁ ⎥ F(x) = ⎢ f₃(x) ⎥ = ⎢ x₁² + x₂² + x₃² ⎥ ⎢ f₄(x) ⎥ ⎢ x₁ + x₂ + x₃ ⎥ ⎣ f₅(x) ⎦ ⎣ x₁ - x₂ ⎦ ∂ ⎡ | | | | | ⎤ F′(x) = —— F(x) = ⎢ f₁′(x) f₂′(x) f₃′(x) f₄′(x) f₅′(x) ⎥ ∂x ⎣ | | | | | ⎦ ⎡ 4x₁+x₂ x₂+x₃ 2x₁ 1 1 ⎤ = ⎢ x₁ x₁+x₃ 2x₂ 1 -1 ⎥ ⎣ 2x₃ x₁+x₂ 2x₃ 1 0 ⎦
多變量函數的長度平方
長度平方:各個函數的平方和。函數向量自身點積。
‖F(x)‖² := F(x)ᵀF(x) = f₁(x)² + f₂(x)² + ... + fₙ(x)²
微分乘法律:前微後不微,前不微後微,兩者相加。
∂ ∂ ∂ —— F(x)ᵀG(x) := [ —— F(x) ] G(x) + [ —— G(x) ] F(x) ∂x ∂x ∂x ∂ ∂ ∂ —— xᵀF(x) = [ —— x ] F(x) + [ —— F(x) ] x = F(x) + F′(x)x ∂x ∂x ∂x ∂ ∂ ∂ —— ‖F(x)‖² = —— F(x)ᵀF(x) = 2 [ —— F(x) ] F(x) = 2F′(x)F(x) ∂x ∂x ∂x
微分連鎖律:外微,內微,從右到左連乘。
∂ ∂ ∂ —— F(G(x)) := —— G(x) ————— F(G(x)) ∂x ∂x ∂G(x) ∂ ∂ ∂ —— ‖F(x)‖² = —— F(x) ————— (F(x))² = (F′(x))(2F(x)) = 2F′(x)F(x) ∂x ∂x ∂F(x)
多個函數的一次微分(transpose Jacobian matrix)
多個函數,從上到下依序併成一個向量。
多個函數對向量微分。導數們從左到右依序併成矩陣。
該矩陣是「多個函數的一階導數矩陣」。通常不是方陣。
該矩陣也是Jacobian matrix的轉置矩陣。
⎡ f₁ ⎤ F = ⎢ f₂ ⎥ ⎣ f₃ ⎦ ∂F ⎡ | | | ⎤ ⎡ ∂f₁/∂x₁ ∂f₂/∂x₁ ∂f₃/∂x₁ ⎤ F′ = —— = ⎢ ∂f₁/∂x ∂f₂/∂x ∂f₃/∂x ⎥ = ⎢ ∂f₁/∂x₂ ∂f₂/∂x₂ ∂f₃/∂x₂ ⎥ ∂x ⎣ | | | ⎦ ⎣ ∂f₁/∂x₃ ∂f₂/∂x₃ ∂f₃/∂x₃ ⎦ ⎡ —————— ∂f₁/∂x —————— ⎤ᵀ ⎡ ∂f₁/∂x₁ ∂f₁/∂x₂ ∂f₁/∂x₃ ⎤ᵀ = Jᵀ = ⎢ —————— ∂f₂/∂x —————— ⎥ = ⎢ ∂f₂/∂x₁ ∂f₂/∂x₂ ∂f₂/∂x₃ ⎥ ⎣ —————— ∂f₃/∂x —————— ⎦ ⎣ ∂f₃/∂x₁ ∂f₃/∂x₂ ∂f₃/∂x₃ ⎦
一個函數的二次微分(Hessian matrix)
一次微分(函數的梯度):函數對向量微分,得到向量。
二次微分(函數的梯度的梯度):再次對向量微分,得到矩陣。
該矩陣是「一個函數的二階導數矩陣」。一定是對稱矩陣。
該矩陣稱作Hessian matrix。
∂f ⎡ ∂f/∂x₀ ⎤ f′ = —— = ⎢ ∂f/∂x₁ ⎥ ∂x ⎣ ∂f/∂x₂ ⎦ ∂f′ ⎡ | | | ⎤ f″ = ——— = ⎢ ∂(∂f/∂x₀)/∂x ∂(∂f/∂x₁)/∂x ∂(∂f/∂x₂)/∂x ⎥ ∂x ⎣ | | | ⎦ ⎡ ∂²f/∂x₀∂x₀ ∂²f/∂x₁∂x₀ ∂²f/∂x₂∂x₀ ⎤ = H = ⎢ ∂²f/∂x₀∂x₁ ∂²f/∂x₁∂x₁ ∂²f/∂x₂∂x₁ ⎥ ⎣ ∂²f/∂x₀∂x₂ ∂²f/∂x₁∂x₂ ∂²f/∂x₂∂x₂ ⎦
二次微分=原函數的Hessian matrix=一階導數的transpose Jacobian matrix。由於是對稱矩陣,可以省略轉置。
f″ = Hf = Jf′ᵀ = Jf′
differential calculus: linear function
一次函數微分
一次函數對各個變數微分。得到各個導數。
f(x) = (x₁ + x₂ + x₃) ∂f ∂f ∂f ——— = 1 ——— = 1 ——— = 1 ∂x₁ ∂x₂ ∂x₃ f(x) = (c₁x₁ + c₂x₂ + c₃x₃) ∂f ∂f ∂f ——— = c₁ ——— = c₂ ——— = c₃ ∂x₁ ∂x₂ ∂x₃
一次函數對向量微分。導數們從上到下依序併成向量。
⎡ x₁ ⎤ f(x) = (c₁x₁ + c₂x₂ + c₃x₃) x = ⎢ x₂ ⎥ ⎣ x₃ ⎦ ∂ ⎡ ∂/∂x₁ f(x) ⎤ ⎡ c₁ ⎤ f′(x) = —— f(x) = ⎢ ∂/∂x₂ f(x) ⎥ = ⎢ c₂ ⎥ ∂x ⎣ ∂/∂x₃ f(x) ⎦ ⎣ c₃ ⎦
∂ ∂ —— yᵀx = y ---> —— xy = y ∂x ∂x ∂ ∂ —— xᵀy = y ---> —— yx = y ∂x ∂x ∂ ∂ —— xᵀx = 2x ---> —— x² = 2x ∂x ∂x when A is ∂ symmetric ∂ —— xᵀAx = (A + Aᵀ) x ========= 2Ax ---> —— ax² = 2ax ∂x ∂x
多個一次函數,依序併成一個向量。甚至視作矩陣乘法。
多個一次函數對向量微分。導數們從左到右依序併成矩陣。
⎡ f₁(x) ⎤ ⎡ a₁x₁ + a₂x₂ + a₃x₃ ⎤ ⎡ a₁ a₂ a₃ ⎤ ⎢ f₂(x) ⎥ ⎢ b₁x₁ + b₂x₂ + b₃x₃ ⎥ ⎢ b₁ b₂ b₃ ⎥ ⎡ x₁ ⎤ F(x) = ⎢ f₃(x) ⎥ = ⎢ c₁x₁ + c₂x₂ + c₃x₃ ⎥ = ⎢ c₁ c₂ c₃ ⎥ ⎢ x₂ ⎥ ⎢ f₄(x) ⎥ ⎢ d₁x₁ + d₂x₂ + d₃x₃ ⎥ ⎢ d₁ d₂ d₃ ⎥ ⎣ x₃ ⎦ ⎣ f₅(x) ⎦ ⎣ e₁x₁ + e₂x₂ + e₃x₃ ⎦ ⎣ e₁ e₂ e₃ ⎦ A x ∂ ⎡ | | | | | ⎤ F′(x) = —— F(x) = ⎢ f₁′(x) f₂′(x) f₃′(x) f₄′(x) f₅′(x) ⎥ ∂x ⎣ | | | | | ⎦ ⎡ a₁ b₁ c₁ d₁ e₁ ⎤ = ⎢ a₂ b₂ c₂ d₂ e₂ ⎥ ⎣ a₃ b₃ c₃ d₃ e₃ ⎦ Aᵀ
∂ ∂ —— A x = Aᵀ ---> —— ax = a ∂x ∂x ∂ ∂ —— Aᵀx = A ---> —— ax = a ∂x ∂x ∂ ∂ —— (Ax + b) = Aᵀ ---> —— (ax + b) = a ∂x ∂x ∂ ∂ ∂ —— yᵀAx = —— (yᵀA)x = (yᵀA)ᵀ = Aᵀy ---> —— axy = ay ∂x ∂x ∂x
一次函數的長度平方
長度平方:所有元素的平方和。向量自身點積。
‖x‖² := xᵀx = x₁² + x₂² + x₃² + ... + xₙ² ‖Ax‖² = (Ax)ᵀ(Ax) = (Ax₁)² + (Ax₂)² + (Ax₃)² + ... + (Axₙ)²
微分連鎖律:矩陣連乘是從右到左,連鎖律也是從右到左。
∂ ∂ ∂ —— F(G(x)) := —— G(x) ————— F(G(x)) ∂x ∂x ∂G(x) ∂ ∂ ∂ —— ‖x‖² = —— x —— (x)² = (1)(2x) = 2x ∂x ∂x ∂x ∂ ∂ ∂ —— ‖Ax‖² = —— Ax ——— (Ax)² = (Aᵀ)(2Ax) = 2AᵀAx ∂x ∂x ∂Ax
定義的合理性,可由嚴謹的推導過程證明:
AᵀA is always ∂ ∂ ∂ symmetric —— ‖Ax‖² = —— (Ax)ᵀ(Ax) = —— xᵀ(AᵀA)x ============= 2AᵀAx ∂x ∂x ∂x
範例
仿照(ax - b)²。用途是一次迴歸。
minimize ‖Ax - b‖² x套用函數之後,跟b的差異盡量小 ∂ —— ‖Ax - b‖² = 0 「一次微分等於零」的地方是極值、鞍點 ∂x 二次函數、開口向上,必是最小值 ∂ [ —— (Ax - b) ] [ 2(Ax - b) ] = 0 微分連鎖律 ∂x Aᵀ [ 2(Ax - b) ] = 0 微分 Aᵀ A x = Aᵀ b 同除以2、展開、移項 x = (Aᵀ A)⁻¹ Aᵀ b normal equation
仿照(ax)²。用途是直線擬合。
minimize ‖Ax‖² subject to ‖x‖² = 1 單位向量套用函數之後盡量短 minimize ‖Ax‖² - λ (‖x‖² - 1) Lagrange multiplier ∂ —— [ ‖Ax‖² - λ (‖x‖² - 1) ] = 0 「一次微分等於零」的地方是極值、鞍點 ∂x 2 AᵀA x - 2 λ x = 0 微分 AᵀA x = λ x 正解是 AᵀA 最小的特徵值的特徵向量 由於是對稱正定矩陣,也等於奇異向量。
仿照ax²且a > 0。用途是二次型最佳化。
minimize xᵀAx subject to ‖x‖² = 1 and A is symmetric positive-definite minimize xᵀAx - λ ( ‖x‖² - 1 ) Lagrange multiplier ∂ —— [ xᵀAx - λ ( ‖x‖² - 1 ) ] = 0 「一次微分等於零」的地方是極值、鞍點 ∂x 二次函數、開口向上,必是最小值 2 A x - 2 λ x = 0 微分 A x = λ x 正解是 A 最小的特徵值的特徵向量 由於是對稱正定矩陣,也等於奇異向量。
微分公式一覽表
多變量函數微分,等於Jacobian matrix的轉置矩陣。
F′(x) = J(x)ᵀ Jacobian matrix
多變量函數微分、一次函數微分,兩者公式互相對應。F(x)對應Ax,J(x)ᵀ對應Aᵀ。
multivariate function | linear function | polynomial func. ——————————————————————————|—————————————————————|————————————————— ∂ | ∂ | ∂ —— F(x) = J(x)ᵀ | —— Ax = Aᵀ | —— ax = a ∂x | ∂x | ∂x | | ∂ | ∂ | ∂ —— (F(x) + b) = J(x)ᵀ | —— (Ax + b) = Aᵀ | —— (ax + b) = a ∂x | ∂x | ∂x | | ∂ | ∂ | ∂ —— yᵀF(x) = J(x)ᵀy | —— yᵀAx = Aᵀy | —— axy = ay ∂x | ∂x | ∂x | | ∂ | ∂ | ∂ —— xᵀF(x) = F(x) + J(x)ᵀx | —— xᵀAx = (A + Aᵀ)x | —— ax² = 2ax ∂x | ∂x | ∂x | | ∂ | ∂ | ∂ —— ‖F(x)‖² = 2J(x)ᵀF(x) | —— ‖Ax‖² = 2AᵀAx | —— (ax)² = 2a²x ∂x | ∂x | ∂x
多元函數二次微分,等於Hessian matrix及其轉置矩陣。
f″(x) = J′(x) = H(x)ᵀ = H(x) Hessian matrix
differential calculus: matrix function
矩陣函數微分
矩陣函數對矩陣微分。導數們依序併成矩陣。
∂ ∂ —— xᵀAy = xyᵀ —— tr(XᵀAY) = XYᵀ ∂A ∂A ∂ ∂ —— xᵀAᵀy = (xyᵀ)ᵀ = yxᵀ —— tr(XᵀAᵀY) = YXᵀ ∂A ∂A
矩陣的長度平方
所有元素的平方和。矩陣自身內積的對角線總和。
‖X‖ꜰ² := tr(XᵀX) = x₁₁² + x₁₂² + x₁₃² + ... + xₙₙ²
∂ —— tr(AX) = Aᵀ ∂X ∂ —— tr(XᵀAX) = (A + Aᵀ)X ∂X ∂ ∂ —— ‖X‖ꜰ² = —— tr(XᵀX) = 2X ∂X ∂X AᵀA is always ∂ ∂ ∂ symmetric —— ‖AX‖ꜰ² = —— tr((AX)ᵀAX) = —— tr(XᵀAᵀAX) ============= 2AᵀAX ∂X ∂X ∂X
對角線總和trace的相關性質。
tr(A+B) = tr(A) + tr(B) additive tr(kA) = k tr(A) scalar tr(A) = tr(Aᵀ) transpose tr(AB) = tr(BA) commute tr(ABCD) = tr(DABC) = tr(CDAB) = tr(BCDA) cyclic
任意矩陣X,乘上正規正交矩陣Q,矩陣長度不變。
證明方式:X拆成向量。旋轉或鏡射,向量長度不變。
X和Q對調依然成立,由於trace的性質。
‖QX‖ꜰ = ‖XQ‖ꜰ = ‖X‖ꜰ when QᵀQ = I
正對角線矩陣D,乘上正規正交矩陣Q,trace變小。
證明方式:D拆成向量。旋轉或鏡射,座標值變小。
極值出現在Q = I,恆等矩陣。
D和Q對調依然成立,由於trace的性質。
tr(QD) = tr(DQ) ≤ tr(D) when QᵀQ = I , D is diagonal , D > 0 (equality holds when Q = I)
tr(QD) = tr(DQ) ≤ tr(D) when QᵀQ = I , D is diagonal , D ≥ 0 (equality holds when QD = D or DQ = D, e.g. Q = I)
範例
仿照(ax - b)²。
minimize ‖AX - B‖ꜰ² X套用函數之後,跟b的差異盡量小 2Aᵀ(AX - B) = 0 「一次微分等於零」的地方是極值、鞍點 二次函數、開口向上,必是最小值 AᵀAX = 2AᵀB 同除以2、展開、移項 X = (AᵀA)⁻¹AᵀB normal equation
當X是正規正交矩陣。
minimize ‖AX - B‖ꜰ² subject to XᵀX = I 正規正交矩陣X套用函數之後, 跟B的差異盡量小 ‖AX - B‖ꜰ² = ‖AX‖ꜰ² + ‖B‖ꜰ² - 2 tr((AX)ᵀB) 展開 = ‖AX‖ꜰ² + ‖B‖ꜰ² - 2 tr(XᵀAᵀB) 展開 = ‖A‖ꜰ² + ‖B‖ꜰ² - 2 tr(XᵀAᵀB) X是正規正交矩陣 = ‖A‖ꜰ² + ‖B‖ꜰ² - 2 tr(XᵀUΣVᵀ) AᵀB實施奇異值分解 = ‖A‖ꜰ² + ‖B‖ꜰ² - 2 tr(VᵀXᵀUΣ) cyclic ≥ ‖A‖ꜰ² + ‖B‖ꜰ² - 2 tr(Σ) Σ是非負對角線矩陣 VᵀXᵀU = I 極值出現在VᵀXᵀU = I Xᵀ = VUᵀ 移項,其中Vᵀ = V⁻¹且Uᵀ = U⁻¹ X = UVᵀ (AᵀB = UΣVᵀ) 轉置
當X是正規正交矩陣,對調位置。用途是旋轉對齊。
minimize ‖XA - B‖ꜰ² subject to XᵀX = I X = UVᵀ (BAᵀ = UΣVᵀ)
當X是數值。用途是縮放對齊。
minimize ‖xA - B‖ꜰ² 矩陣乘上x倍,跟B的差異盡量小 ‖xA - B‖ꜰ² = ‖xA‖ꜰ² + ‖B‖ꜰ² - 2 tr((xA)ᵀB) 展開 = ‖A‖ꜰ² x² + ‖B‖ꜰ² - 2 tr(AᵀB) x 提出 = ‖A‖ꜰ² x² - 2 tr(AᵀB) x + ‖B‖ꜰ² 整理成多項式 = (x - tr(AᵀB) / ‖A‖ꜰ²)² + ...... 配方法 x = tr(AᵀB) / ‖A‖ꜰ²
orthogonal Procrustes problem。用途是相似對齊。
s不管多少,最佳R都一樣。因此先求最佳R、再求最佳s。
minimize ‖sRA - B‖ꜰ² subject to RᵀR = I and s ≥ 0 s,R 矩陣A經過旋轉、鏡射、縮放,跟B的差異盡量小
find best R: (Kabsch–Umeyama algorithm) ‖sRA - B‖ꜰ² = ‖sRA‖ꜰ² + ‖B‖ꜰ² - 2 tr((sRA)ᵀB) 展開 = ‖sRA‖ꜰ² + ‖B‖ꜰ² - 2 tr(sAᵀRᵀB) 展開 = s² ‖RA‖ꜰ² + ‖B‖ꜰ² - 2s tr(AᵀRᵀB) 提出 = s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(AᵀRᵀB) R是正規正交矩陣 = s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(RᵀBAᵀ) cyclic = s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(RᵀUΣVᵀ) BAᵀ實施奇異值分解 = s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(VᵀRᵀUΣ) cyclic ≥ s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(Σ) Σ是非負對角線矩陣,且s ≥ 0 VᵀRᵀU = I 極值出現在VᵀRᵀU = I Rᵀ = VUᵀ 移項,其中Vᵀ = V⁻¹且Uᵀ = U⁻¹ R = UVᵀ (BAᵀ = UΣVᵀ) 轉置
find best s: ‖sRA - B‖ꜰ² ≥ s² ‖A‖ꜰ² + ‖B‖ꜰ² - 2s tr(Σ) 極值出現在R = UVᵀ = ‖A‖ꜰ² s² - 2 tr(Σ) s + ‖B‖ꜰ² 整理成多項式 = (s - tr(Σ) / ‖A‖ꜰ²)² + ...... 配方法 s = tr(Σ) / ‖A‖ꜰ²
如果想要去除鏡射,則追加限制條件det(R) = 1。證明過程當中,最小的奇異值再乘上det(R),讓誤差增加最少。
minimize ‖sRA - B‖ꜰ² subject to RᵀR = I and s ≥ 0 s,R and det(R) = 1 D = diag([1 1 ... 1 det(R)]) 去除鏡射,奇異值暨奇異向量由大到小排列 R = UDVᵀ 最小的奇異值再乘上det(R) s = tr(DΣ) 最小的奇異值再乘上det(R)
Jacobi's formula
前面提到tr(A)的微分,此處補充det(A)的微分。
when A is ∂ invertable —— det(A) = adj(A)ᵀ ========== (det(A) A⁻¹)ᵀ = det(A) A⁻ᵀ ∂A