2015年8月4日 星期二

網誌的第一篇,介紹一下自己和網誌成立的目的。

Hi, 我是一個平凡的理工科學生。
很喜歡數學,如果哪天能被稱為數學家,大概是這輩子最光榮的事情吧。
雖然腦筋動得不快,記憶力也不太好,但還蠻喜歡把事情想得很透徹。
主張要對所追求的知識都要有高程度的理解,不然就沒有意義和價值。
這種學習態度對於工程(Engineering)領域來說是一個很大的挑戰。
因為工程領域(相比於理學院)比較趨於應用導向(application oriented)。
也就是1+1就是等於2,知道後拿去算更難的加法。
要證明1+1為什麼等於2而不是3,這是數學系要做的是,工學院不管。
但如果身為一個工程師或工程系的學生,要兼具理論和實務應用的話,
我想一天給48小時,一個人配四核心的大腦都不夠用吧。

不論是純理論派的或實務派的都很好。
我覺得就依個人的特質,去選擇適合自己個性方向發展。(有時候可能要向現實妥協)
選擇應用為主發展的朋友可能對於自己使用的工具或方法了也要解其原理,
實作細節可以不用太清楚,但理論方面不能放掉,也要有點感覺。
因為如果不了解就拿來用的話,很容易會用錯地方,走到不對的方向。
不過像我這種比較沒有sense的人,不實際實作的話就抓不到感覺。
優點是可以比別人了解細節,缺點是很花時間,所以能學到的東西很少。
不過自己做得爽就好了。

我大學念電機系就念得亂七八糟,研究所轉到資訊工程就念得蠻有興趣的。
與其定位自己是位電腦工程師(engineer),我更想(不要臉地)叫自己電腦科學家(scientist)。
發展的領域大概是電腦視覺(或影像處理),和機器學習在影像分類上的應用。
對於機器學習的理論非常著迷,但可惜還是處於使用者的階段。
希望能多努力多學習一點,朝向理論的部分發展。

我是個matlab的重度使用者。真的太愛matlab了。
因為真的很好開發,而且安裝一次(once and for all)就可以用得很開心。
很多時候我都會先用matlab實作自己的演算法,如果效果好的話才會用C實作出來。
因為matlab有很多很實用的內建函式可以呼叫使用,再加上對矩陣極其友善的環境。
真的對於在學習線性代數的應用或是影像處理者來說,是個不可或缺的最佳利器。
但缺點就是,太好開發的語言環境會讓人變成一個很懶惰的人。
直譯語言這種不強調宣告變數的方便性,常讓我轉回C時會忘東忘西,產生一堆errors.
不過對於我這種理論派的來說,真的重點應該是放在演算法本身的設計,
不該花太多時間在工具的使用上。所以這缺點也應該是我最喜歡的優點吧。
再來是一般人無法afford正版matlab,所以用matlab開發的程式有推廣上的困難。
畢竟它只能在有安裝matlab軟體的裝置上運行。普遍性和業界的使用率都為其最大的限制。
重點是:我學生版的matlab在畢業後可能有過期不能使用的疑慮,我必須要延續我的研究。
於是我找到了PYTHON成為我下一個學習的工具。

我對於PYTHON也是一整個初學者,但我大概研究了一下,
我把PYTHON叫做 "免費的matlab"。雖然matlab在矩陣的支援更完善,但重點在“免費”。
也正因為是免費,所以用python開發的程式能更方便被流傳使用。
再加上py2exe和py2app的支援,Win和Mac下都可以產生獨立的可執行檔。
用起來爽度更加分。

不過如果要讓python真的要跟matlab一樣強大的話,必須還是要仰賴一些函式庫。
這些函式庫在python2.7版本下聽說已經支援地蠻成熟的了。
我也安裝了canopy和anaconda(spyder)兩種python2.7大補帖IDE在我虛擬機上試用。
尤其是spyder更是號稱模擬matlab開發環境的IDE。真的還不錯用,一次安裝一勞永逸。
不用花太多時間和精力在一一下載安裝函式庫。
不過,時代的巨輪,我們是躲不過的。Python3推出後,python2.7遲早要跟他say goodbye.
對於我這種初學者反而沒有太多顧慮,直接選新版,比較麻煩的是函式庫的安裝。
如果接觸python比較早的人,可能就只好忍受一下這過渡的陣痛期。或繼續維持2.7。

我覺得開源(open source)讓人又愛又恨的地方就在這裡。
版本問題是我覺得開源最讓人困擾的地方。
不只在使用上有彼此支援的問題,有時候連安裝上的相容性都會讓人抓狂。
有時候新版本會加上很多新的或比較好的方法,想用的話又必須去更新新的版本。
但更新後卻發現以前的程式或以前的函式格式改了,變成不能用了。
又要花好大的力氣去修正,更慘的是可能要改為自己實作才行。
開源函式庫讓我們在開發上就像站在巨人的肩膀上。
雖然要從這個巨人換到下個更高的巨人也是很辛苦的,但不管啦,免費的還能要求什麼。XD

說到開源函式庫這巨人,我一開始也很不自量力地想挑戰他。
我以前在做影像處理時,就非常不喜歡用openCV或itk/vtk。
通常我都自己寫函式給自己的程式call,一個白手起家的概念。
剛好自己處理的對象是三維的voxel而不是一般的pixel。
所以也沒有太多的函式庫支援。只好乖乖自己寫。
好處是對於細節能更加掌握,以及函式可以完全符合我的需求。
缺點當然是很花時間,簡單的函式是沒什麼問題,但是計算複雜度高的函式會很慘。
說個故事,當我在學線性代數的時候,我想實作一個函式來算一個矩陣的行列式。
如果用降階法來計算行列式的話,程式用遞回寫是最直覺和方便的。
但這種寫法不切實際:非常沒有效率而且執行時間過長,
更慘的是矩陣size一大,stack一下就爆掉了。
後來想說行列式是特徵值的相乘積。但問題是要先計算出矩陣的所有特徵值就會是個問題。
我會卡在高維解方程式的地方,但我又不想用數值方法去得到逼近值。
舉個最簡單的例子,矩陣A=[1 2 3; 4 5 6; 7 8 9]:singular, s.t. det(A)=0
matlab和numpy用的是同一個演算法,求得其行列式是一個極小趨近零的值(10的負16次方)。
但我對於這種簡單的奇異矩陣居然算不出理論值感到非常不滿。
所以我比較想用比較能算出理論值的方法來實作行列式的運算。
(先暫時忽略程式中浮點數在二進位表示法中所造成的誤差)
我先實作簡化列梯矩陣的函式,並記下轉換過程中列交換的次數(會影響行列式的正負號)
最後行列式的直就是這簡化列梯矩陣的對角線值的相乘並考慮列交換次數來取正負號。
這演算法其實在線性代數中都有教,而且至少對於簡單的奇異矩陣都能得到=0的答案。
我當初覺得函式庫太廢了。但我後來測試了100x100至500x500的大矩陣來測試速度。
我的函式和資料庫的函式都算出一樣的答案(感到欣慰)
但隨著矩陣size越來越大,執行速度可以差到四倍到40倍(輸慘了,跪)。
雖然執行速度還是在一秒以內,但數據顯示差到40倍,真的輸得心服口服。

等到心情稍微平復之後(哈哈,打擊太大),好好地想想:
開源雖不能說一定是被奉為圭臬,但要打敗它可是有一定的難度的。
1.這是多人多年來的結晶,如果有更好的演算法或實作,通常就會更新在之後的版本。
   (安裝更新版本可說是必要之惡呀。不然就沒有更多更快更好用的函式可以用了。)
2.其開發者通常也是深耕該領域多年,有很深厚的理論和實作經驗。
   (像我這種初出茅廬的爛咖,想得美。)
3.開源函式庫通常有做最佳化,有時會用GPU加速,或multithreading和設計平行運算節省運行時間。像影像處理中常有用多層次金字塔結構加速(pyramid structure),速度上會差到蠻多的。

不過自我安慰一下,像python或matlab都會去call c/c++ 或是 fortran的程式庫。
如果用matlab和python直譯式的程式和編譯式程式比執行速度的話,也是不太公平的。

不管如何,要打敗他是不容易的,所以我們選擇加入他吧。
再加上Python在函式庫上的使用雖不及matlab那麼easy,但也算方便的了。
所以身為一個記憶力不好的人,我想把我在學習python的開發過程記錄下來。
一來是我自己忘了的話要回來看,二來我發現類似的正體中文的網站資源不是很多。
所以如果能順便能把遇到的問題及如何解決的方法記錄下來,也許能幫別人解省一點時間。

我主要是以PYTHON為工具,來對於機器學習,線性代數和影像處理做學習。
開發的環境主要是python3.4.3配合opencv3.0.0在mac OSX 10.9.5下運行
不過因為實習公司用的是win7,所以也會稍微照顧一下。
偶爾可能會用虛擬機winXP測試一下python2.7和opencv2.4.11
希望我能好好加油,好好學習。







沒有留言:

張貼留言