Processing math: 100%

2019年1月24日 星期四

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


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

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


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





要求解的直線方程式形式如下,我們都知道兩點可以決定一直線,在已知兩點(x1,y1)(x2,y2) 的前提下,如何求解係數(a,b,c)?

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

ax1+by1+c=0
ax2+by2+c=0

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

[00]=[x1y11x2y21][abc]=Ax

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

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

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

A=UDVT

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

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

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


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

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

沒有留言:

張貼留言