1. 程式人生 > >站在數學之巔沐浴計算機的陽光

站在數學之巔沐浴計算機的陽光

       在2016年的第一個月裡我看了一些專業書和雜書、學習了一套MIT關於線性代數的教學視訊,閒暇之餘還看了一些節目,萌發了些許感受,特在此記錄一下。其實還有一些其他原因,見此文最後的備註部分。首先解釋下這個標題,這個標題的靈感源自一本講述C++11新特性的書,作者提到了一句“站在C98的峰頂沐浴C++11的陽光”。寫書的作者當然已經站在C98之巔了,而我取此標題不免有“標題黨”之嫌,但這只是我自己對我未來的一個期許,真的希望自己可以站在我所從事的相關領域涉及到了數學知識之巔,進而能以一種享受的心態沐浴計算機的陽光,如果有人覺得被這個標題忽悠了,在此道個歉哈。
       在大二上,我有幸聆聽了一個帶著新思想,即數學是文科的老師的課(老師是誰就不說了,該懂的應該都知道是誰了)。他的目標是讓我們更好地去應付考試,我覺得完全達到了他為我們設定的目標,從這個層面上來說他是個標準的好老師。可是考完試之後呢?基本上應該全還給老師了。然後在看影象處理、計算機視覺方面相關的書籍或者文獻時,根本就無法理解作者的思想和方法,即和自己預先設定的期待落差比較大,往往都是卡在一些看似和數學無關,其實和數學緊密關聯的問題上,這些問題大多數都是和現代工程兩大數學支柱之一的線性代數有著莫大的聯絡。
       線性代數中涉及到各種不同的矩陣,如正交矩陣、對稱矩陣、反對稱矩陣、正定矩陣、半正定矩陣、可逆矩陣、不可逆矩陣、奇異矩陣、非奇異矩陣、上三角矩陣、下三角矩陣等等;基於不同特性的矩陣、不同量級的矩陣又衍生出眾多相關的演算法;與其他學科相聯絡,又產生眾多的問題。
       線性代數裡面的主角是矩陣和向量,然後研究由他們自身和他們之間產生的各種特性以及與其相關聯的實際問題(個人的片面看法,標準解釋請參照維基百科)。以前的只顧著想矩陣的點乘、叉乘等等運算什麼的,然後列一個式子,剩下的工作就交給MATLAB(用的盜版軟體,深感歉意)處理了。根本就沒有想過什麼是“線性”?在《計算機視覺與多檢視幾何》中的預備知識部分,提到在相似變換中角度、長度等幾何性質可以保持不變;仿射變換中平行線的平行關係會保持不變;而在射影變換中,角度、長度、平行關係等幾何性質都會發生變化,舉個簡單的例子:原來平行的直線,現在會相交於一點(ideal point,即理想點、無窮遠點)。那麼什麼性質在射影變換中會保持不變呢?答案就是直線在變換之後還是直線,對,這就是我一直思考的問題的答案。理所當然的答案,以前卻一直沒有想明白,當然了這只是個人的拙見,認識可能還會不斷的昇華。
       死摳linear的含義被沒有什麼意義,我們應該從線性代數裡面學到什麼核心思想呢?個人覺得最重要的思想就是——基的思想!在一個二維的笛卡爾座標系中,我們隨便選其中一個點,都會有相應的橫、縱座標,怎麼得出來的呢?是因為我們預設選擇了一組標準正交基作為參考,以至於我們都沒有意識到這組基向量的存在,這是“標準”的好處,但是這樣的思維的省略,往往造成意識的缺失和對基本問題的理解不當。再來看微積分中神乎其神的泰勒公式,如果我們將其看作基為冪函式,係數作為一個向量,是不是會很奇妙(哈哈,不知道有木有人這樣想過)。這種基的思想其實在生活中無處不在,比如去電影院看電影,找位置的時候你會怎麼找?人民幣設定1角、五角、1元、五元、10元、20元、50元、100元其實都在一個一維座標上,從線性代數角度考慮,取其中一種幣值就可以表示所有的錢數了,但是這樣就不方便現階段日常的生活了,這也是一個老生常談的問題,我們要多角度考慮問題。但是可以想象啊,在一個銀行系統(電腦上執行的)中會區分各種幣值嗎?如果讓我來做這個系統,我肯定不會設定這麼多幣值,完全可以選擇一個幣值作為基就歐克了,至於選擇什麼基最合理,就得根據實際情況進行考慮了。
       任何一本講述影象處理基本知識的書籍,我想應該多會或多或少的提及傅立葉變換——一個我從看第一本影象處理書籍都沒有完全理解的問題。傅立葉變換的偉大就不多說了,下面只想說說我現在是如何理解傅立葉變換的。在影象處理中以前都是將影象資料當做一個矩陣來看待,但是計算機裡面儲存的時候都是按照一行接一行或者一列接一列的方式儲存的,我們何不直接用一個向量來表示影象資料呢,我想這樣應該處理速度應該會更快吧,還能省去不少計算資料地址的時間,當然了這是個人的猜測,情況到底怎麼樣,還是應該做做實驗再來發表意見。
       書上講傅立葉變換都是首先列出幾個公式,告訴你這叫傅立葉變換、那叫傅立葉逆變換,變換中這個符號代表什麼含義,如何對應相關的影象資料,然後你只能裝作已經看懂了繼續往下看,希望後面有個什麼生動的故事來解答我們心頭的疑問,但是往往我們只能很遺憾合上書本,期待下次的好運和突然的靈感。何苦這樣為難我們呢?不就是將原影象資料向量通過一個特定的矩陣(真名叫做傅立葉基)變換到頻域空間,再通過傅立葉基的逆變換將處理過的資料向量變換回時域空間,得到最後的結果,說白了,這就是數值計算(這也是MATLAB的處理方式)的過程,當然了可以用快速傅立葉變換來優化演算法。如果想了解計算過程中的具體細節,自己舉個8X8的矩陣試試,就明白你的計算機是如何完成這個過程的了。
       有了這個傅立葉變換的基礎,就可以按圖索驥解開傅立葉變換的競爭對手——小波(wavelets)變換的神祕面紗了。在中國快速發展的這幾十年中,也是小波飛速發展的黃金時間,大有取代傅立葉變換之勢。在影象處理的書籍中,這一部分公式可能更不利於我們的理解,但其實啊,本質上就是尋找一個更好的線性變換矩陣代替傅立葉基,那個矩陣怎麼來呢,就是從書上哪些神一般的公式裡來的。這樣來理解,就可以利用基變換的思想將傅立葉矩陣和小波矩陣合二為一,轉換為一個數學上的最優解問題——找到最合理的線性變換矩陣,實現相應的變換;條件是演算法的時間要可以接受且滿足足夠少的引數能表示盡保留儘可能多的資料,不然演算法再漂亮,沒有實用價值,只能充當數學家喜愛的花瓶和象牙。
       最小二乘法曾經被我深深的鄙視,只是因為它太難算了(都怪可恨的考試),但是現在卻有了不同的看法。最小二乘法本質上是一個最優解的問題,它的涉及面橫跨微積分、線性代數、統計學以及相關的實際問題,特別是涉及超定方程組時,它簡直就是神一般的存在。但是如何在幾何上理解這個神演算法呢?還是得感謝線性代數為我們提供了最為完美的解釋:讓樣本向量最大化的投影到該方程組形成的列空間中。這裡最好從二維空間或者三維空間去作圖理解,4維及以上會涉及超平面問題,從二、三維直接過渡應該是最完美的方案了。
       牛頓迭代法,曾經天真地以為它只能算算方程組的根,但在它寬廣的應用面前只能凸顯自己的無知與輕狂。再一次,線性代數讓它煥發生機,成為處理高維空間最優解問題的利器,當然,在其之上,衍生出了更加優秀的演算法(LM迭代)。
       無論是最小二乘法還是牛頓迭代法,對人類來說絕對是噩夢,但是對計算機來說就到了顯示它們能力的時候,通過合理的演算法和程式設計,這些理論上的演算法切實地服務於大家的日常生活之中。曾經的高斯、若爾當、雅克比、施密特等都為線性代數的建立和發展做出來極大的貢獻。俱往矣,但他們不止活在課本中,也真切地活在我們的電腦、手機等各種智慧裝置中;還活在電流中、天氣裡,於我們共同見證人類的發展,見證我們探索的足跡。
       有用的矩陣是被約束的矩陣,和人一樣,有用的人是被約束著的。其實推廣一下,各種矩陣可以對應著現實世界中形形色色的人,大家各有特點、各有用途、各有各的世界,大家是我中有你,你中有我,彼此獨立,卻又相互聯絡、相互合作,共同形成了色彩繽紛的世界,這也從側面證明了世界是聯絡的,印證了馬克思主義哲學的正確性(哈哈)。
       哲學中有否定之否定理論,即人的認知過程不是直線形的,而是螺旋上升,也意味著對相關知識的理解不斷地加深。這個過程也是一個實踐與理論的問題,在工程相關的應用學習中,發現自己原來對相關知識的理解不夠,知識面也不夠,這個時候就該是從實踐回到理論,深化理論學習的時候了,在這個過程中,應該由易而難,由淺及深,量化細分任務與目標。理論學習完畢之後,則可以更好去幫助我們去完善實踐,取得更好的成果。