2019年1月24日 星期四

[線性代數]以SVD處理已知兩點求直線系數


學完線性代數的這幾年間,漸漸褪去國中數學的直覺式幾何思考,的確,在處理幾何問題上,相較歐氏幾何的邏輯,線性代數的公理化思考很抽象,很不好傳達給其他人理解,也要三不五時複習一下,咬文嚼字規格間的邏輯關係與意義,不過倒是越嚼越有味(齁假

但也正是如此,線性代數作為以公理出發推演而生的一套思考系統,在運用時可以避免處理問題時陷入案例列舉,這個的思維性質,尤其在軟體系統裡要追求一致性高的實作時,乃至撰寫測試案例,採用線性代數的處理手法相較於直覺式幾何思考,目前我仍認為是比較強健的方法,可以避開許多誤區,不用透過案例窮舉來檢視演算法的可靠度,因為先賢先烈們已經用許許多多的數學證明完善了邏輯上的縝密性


----------------------------------------戰鬥開始





要求解的直線方程式形式如下,我們都知道兩點可以決定一直線,在已知兩點$(x_{1},y_{1})  (x_{2},y_{2}) $ 的前提下,如何求解係數$(a,b,c)$?

首先來列出方程式來觀察,由於我們要解出的直線方程式必定包含已知的兩點,所以會有這樣的關係:

$$ ax_{1}+by_{1}+c=0$$
$$ ax_{2}+by_{2}+c=0$$

把上式整理成矩陣形式來觀察一下:

$$\begin{bmatrix} 0\\0\end{bmatrix}=\begin{bmatrix} x_{1} & y_{1} & 1 \\ x_{2} & y_{2} & 1\end{bmatrix} \begin{bmatrix} a \\b \\c \end{bmatrix} = Ax$$

揉一下眼睛,盯著A矩陣,把他想成他是一個將$R^{3}$(三維空間)投射到$R^{2}$(二維空間)的變換,很明顯的A矩陣不是方陣,不是方陣必定不會是全秩(full rank),也就是說必定會有某些$R^{3}$向量經過A矩陣轉換後,對應至$R^{2}$的零向量,這些$R^{3}$向量構成的空間,在線代裡稱為零空間(Kernal space)

所以求解係數$x=(a,b,c)$這件事,可以進一步轉譯成:找出A矩陣的零空間;其中要表達一個空間的方式之一是,以列舉該空間的一組基底向量(basis)做為表示,若此組基底向量彼此正交,我們又說此組基底向量是該空間的正交基(orthogonal basis

而SVD這把瑞士刀,就是拿來剖開A矩陣,把它大卸八塊,取出它最深層的核心,裡面含有我們想知道的正交基構成(我此時在想像初號機痛揍完使徒準備捏爛核心的畫面;所以下一步就是把A矩陣拿來SVD分解

$$A=UDV^{T}$$

這樣看待分解結果:$V^{T}$的三個列向量是$R^{3}$的一組正交基,所以任一組$R^{3}$向量必定可以化成以$V^{T}$的三個列向量表達的形式;中間的D是對角矩陣,對角線上的數值就是$V^{T}$的三個列向量轉到$R^{2}$的放大倍率,A矩陣最多會有3個放大倍率(全秩情況),如果放大倍率有缺,表示某幾支正交向量投射到$R^{2}$為0,後面就會運用到這個概念。

最左邊的U的行向量就是$R^{2}$的一組正交基,透過A矩陣轉換後的$R^{2}$向量都可以用U表達形式

所以我們再轉譯一次求解目標,以下三句話是等價的:
  • 求解係數$(a,b,c)$
  • 找出A矩陣的零空間
  • 將A矩陣SVD分解後,找出$V^{T}$裡面對應D放大率為0的該組列向量
所以再重整一下上述問題,處理流程就清晰的出現:
  1. 將已知兩點座標整理成A矩陣的形式
  2. 將A矩陣SVD分解
  3. 搜尋D矩陣的對角線,找出放大率為0的元素對應的行列i,
  4. 行列i對應的$V^{T}$就是解向量
---------------------------------心法盡於此,用OpenCVSharp來實作一下(分篇)


使用矩陣運算函式庫+線代觀念只需要幾行解的輕鬆愉快,4不4~~~幾何(斜率/截距)~~~掰掰

後記:把$(a,b,c)$當成一個向量來看待,這問題其實又提示了一件事:$(a,b,c)$與$ (x,y,1)$正交,因為內積為0,所以求解係數$(a,b,c)$這件事,我們可以轉譯成,求解一向量,必須與$(x_{1},y_{1},1) (x_{2},y_{2},1)$正交,從幾何角度來看,不就是$(x_{1},y_{1},1) (x_{2},y_{2},1)$構成的平面的法向量!?這觀點引出了超平面(Hyperplane)的概念,將N維問題帶到了N+1維表述,彷彿偷偷窺探到了更大的宇宙?三言兩語說不清,還得再多讀點書

沒有留言:

張貼留言