學(xué)校中所學(xué)的很多數(shù)學(xué)知識,在編程中用不到。 這兒是我能記得的在學(xué)校學(xué)到的數(shù)學(xué): 初中:數(shù),數(shù)數(shù),算術(shù)知識,初級代數(shù)(“帶問題的小故事”) 高中:代數(shù),幾何,高等代數(shù),三角學(xué),微積分先修課 (二次曲線論和極限) 大學(xué):微積分,微分公式,線性代數(shù),概率和統(tǒng)計,離散數(shù)學(xué) 上面那個關(guān)于高中數(shù)學(xué)課程單子上所列的,怎么來著? 代數(shù)?是的。沒問題。你需要代數(shù),和一些理解解析幾何的知識。那些很有用,并且在以后幾個月里,你能學(xué)到一切你想要的,十拿九穩(wěn)的。剩下的呢?我認(rèn)為一個基本的介紹可能會有用,但是在這上面花整個學(xué)期或一年就顯得很荒謬了。 我現(xiàn)在意識到那個書單列表原是設(shè)計來準(zhǔn)備給那些以后要當(dāng)科學(xué)家和工程師的學(xué)生的。他們在高中里所教的數(shù)學(xué)課程并不是為你的編程生涯做準(zhǔn)備的,簡單的事實是,多數(shù)的編程工作所需要的數(shù)學(xué)知識相比其他作為工程師角色的人所需要的數(shù)學(xué)增長的更快。 即使你打算當(dāng)一名科學(xué)家或者一名工程師,在你理解了什么是數(shù)學(xué)之后-- 數(shù)學(xué)它如何而來,如何而去,為何而生,我發(fā)現(xiàn)這更加容易去學(xué)習(xí)和欣賞幾何學(xué)和三角學(xué)。不必去專研記住幾何上的證明和三角恒等式,雖然那確實是高中學(xué)校要求你必須去做的。 所以這樣的書單列表不再有什么用了。學(xué)校教給我們的不是最合適的數(shù)學(xué),并且方式也不對。 不奇怪程序員認(rèn)為他們不再需要數(shù)學(xué):我們學(xué)的大部分?jǐn)?shù)學(xué)知識對我們的工作沒什么大的幫助。 學(xué)校沒有教你的數(shù)學(xué) 程序員們最需要的是離散數(shù)學(xué)、概率論和線性代數(shù),而不是微積分。 在現(xiàn)實中,計算機科學(xué)家經(jīng)常使用的數(shù)學(xué),跟上面所列的數(shù)學(xué)僅有很小的重疊。舉個例子,你在中學(xué)里學(xué)的大部分?jǐn)?shù)學(xué)是連續(xù)性的:也就是說,那是作為實數(shù)的數(shù)學(xué)。而對于計算機科學(xué)家來說,他們所感興趣的95%也許更多的是離散性的:比如,關(guān)于整數(shù)的數(shù)學(xué)。 我打算在以后的博客中再談一些有關(guān)計算機科學(xué),軟件工程,編程,搞些有趣的東東,和其他常常令人犯暈的訓(xùn)練。我已經(jīng)從Richard Gabriel的《軟件的模式》這本書中洞察到一個無關(guān)巨細(xì)的基本框架。如果你明顯的等不下去的話,去讀吧。是本不錯的書。 到現(xiàn)在為止,不要讓“計算機科學(xué)家”這個詞困擾到你。它聽上去很可怕,其實數(shù)學(xué)不是計算機科學(xué)家所獨有的領(lǐng)域,你也能作為一個黑客自學(xué)它,并且能做的和他們一樣棒。你作為一個程序員的背景將會幫助你保持只關(guān)注那些有實踐性的部分。 我們用來建立計算模型的,大體上是離散數(shù)學(xué)。這是普遍的做法。如果正好今天你在看這篇博客,從現(xiàn)在起你正了解到更多的數(shù)學(xué),并且你會認(rèn)識到那樣的普遍做法是不對的。從現(xiàn)在開始,你將有信心認(rèn)為可以忽略這些,并以你想要的方式自學(xué)。 對程序員來說,最有效的離散數(shù)學(xué)的分支是概率理論。這是你在學(xué)校學(xué)完基本算術(shù)后的緊接著的課。你會問,什么是概率理論呢?你就數(shù)啊,看有多少次出現(xiàn)滿堂彩?或者有多次是同花順。不管你思考什么問題如果是以“多少種途徑...”或“有多大幾率的...”,那就是離散問題。當(dāng)他發(fā)生時,都轉(zhuǎn)化成“簡單”的計數(shù)。拋個硬幣看看...?毫無疑問在他們教你基本的計算用法后他們會教你概率理論。 我還保存著大學(xué)里的離散數(shù)學(xué)課本。可能他只占了三分之一的課程,但是它卻涵蓋了我們幾乎每天計算機編程工作大部分所用到的數(shù)學(xué)。 也真是夠奇怪的,我的教授從沒告訴我數(shù)學(xué)是用來干嗎的,或者我也從來沒有聽說過。種種原因吧。所以我也從沒有給以足夠的注意:只是考試及格然后把他們都忘光,因為我不認(rèn)為她還和編程有啥關(guān)系,事情變化是我在大學(xué)學(xué)完一些計算機科學(xué)的課程之后,也許是25%的課程,可憐??!我必須弄明白什么對于自己來說是最重要的,然后再是向深度發(fā)展。 我想,如果每門數(shù)學(xué)課都花上整整一周的時間,而只是介紹讓你如何入門的話,那將非常不錯,這是最有意思的一種假設(shè),那么你知道了你正學(xué)習(xí)的對象是哪種怪物了。怪物,大概對每一門課都合適。 除了概率和離散數(shù)學(xué)外,還有不少其他的數(shù)學(xué)分支,可能對程序員相當(dāng)?shù)挠杏?,學(xué)校通常不會教你的,除非你的輔修科目是數(shù)學(xué),這些數(shù)目列表包括: 統(tǒng)計學(xué),其中一些包括在我的離散數(shù)學(xué)課里,她的某些訓(xùn)練只限于她自身。自然也是相當(dāng)重要的,但想學(xué)的話不需要什么特別的入門。 代數(shù)和線性代數(shù)(比如:矩陣)。他們會在教完代數(shù)后立即教線性代數(shù)。這也簡單,這但相當(dāng)多的領(lǐng)域非常有用,包括機器學(xué)習(xí)。 數(shù)理邏輯。我有相當(dāng)完整的關(guān)于這門學(xué)科的書沒有讀,是 Stephen Kleene寫的,克林閉包的發(fā)明者,我所知道的還有就是Kleenex。這個就不要讀了。我發(fā)誓我已經(jīng)嘗試了不下20次,卻從沒有讀完第二章。如果哪位牛掰有什么更好的入門建議的話可以給我推薦。雖然,這明顯是非常重要的一部分。 信息理論和柯爾莫戈洛夫復(fù)雜性理論。真不可思議,不是么?我敢打賭沒哪個高中會教你其中任何一門課程。她們都是新興的學(xué)科。信息理論是(相當(dāng)相當(dāng)相當(dāng)相當(dāng)難懂)關(guān)于數(shù)據(jù)壓縮,柯爾莫戈洛夫復(fù)雜性理論是(同樣非常難懂)關(guān)于算法復(fù)雜度的。也就是說,你要把它壓縮的盡量小,你所要花費的時間也就變的越長,同樣的,程序或數(shù)據(jù)結(jié)構(gòu)要變得多優(yōu)雅也有同樣的代價。 他們都很有趣,也很有用。 當(dāng)然,也有其他的一些因素,某些領(lǐng)域是重復(fù)的。也拿來說說吧:你所發(fā)現(xiàn)有用的那部分?jǐn)?shù)學(xué),不同于那些你在學(xué)校里認(rèn)為有用的數(shù)學(xué)。 那微積分呢?每個人都學(xué)它,所以它也一定是重要的,不對嗎? 好吧,微積分實際上是相當(dāng)容易的。在我學(xué)習(xí)它之前,它聽上去好像是世界上最難的一件事,好像和量子力學(xué)差不多。量子力學(xué)對我來說真的不是那么容易理解,但是微積分卻不是。在我意識到程序員能夠快速的學(xué)習(xí)數(shù)學(xué)時,我拿起一些微積分課本用一個月通讀了整本書,一個晚上讀一小時。 微積分都是關(guān)于連續(xù)統(tǒng)的 -- 變化的比率,曲線的面積,立體的體積。是些有用的東西,但是實際細(xì)節(jié)卻包含大量的記憶量并且枯燥,作為一個程序員來說根本不需要這些。更好的方法是從整體上了解那些概念和技術(shù),在必要的時候再去查詢那些細(xì)節(jié)。 幾何,三角,微分,積分,圓錐曲線,微分方程,和他們的多維和多元 -- 這些都有重要的應(yīng)用。不過這時候不需要你去了解它們。這大概不是個好注意讓你年復(fù)一年的去做證明和它們的練習(xí)題,不是嗎?如果你打算花大量的時間去學(xué)習(xí)數(shù)學(xué),那也是和你生活相關(guān)的部分。 學(xué)習(xí)數(shù)學(xué)的正確方法 正確學(xué)習(xí)數(shù)學(xué)的方法是廣度優(yōu)先,而非深度優(yōu)先。你要考察的是整個數(shù)學(xué)世界,學(xué)習(xí)每個概念的名字,區(qū)分出什么是什么。 具體的來看,考慮用長除法?如果你能在紙上做長整除,現(xiàn)在就舉起你的手,會有人舉手嗎?至少我不這么認(rèn)為。 回頭看看在學(xué)校里學(xué)過的長除法,要是不讓你覺得煩惱和憤怒才怪。當(dāng)然,這是顯然的,但你不一定要自己親自去做,因為很容易用計算器來做,即使你不幸在一座沒有電力的荒無人煙的小島上。你起碼還有個計算器,在的手表上,補牙的什么東東,或其他什么上面。 為什么他們還教你這些呢?為什么我們感到含混心虛訥,如果我們不能記住怎樣去做?這不是好像我們需要再次知道她。除此以外,如果你命懸一線,你可以運用任意大的數(shù)來做長除法。相象你被囚禁在第三世界的地牢里,那兒的獨裁者是不會放你出來的,除非你計算出 219308862/103503391。你會怎么做呢?好吧,很容易。你開始從分子減去分母,直到不能再減只剩余數(shù)為止。若實在有壓力,你可以想個辦法,繼續(xù)使用反復(fù)減,估算作為十進制的余數(shù)(這種情況下,0.1185678219,Emacs M-x calc 告訴我的。夠精確了!) 你或許明白,除法就是反復(fù)的減。這樣從直覺上對除法概念的理解就根深蒂固啦! 學(xué)習(xí)數(shù)學(xué)的正確方法是忽略實際的算法和證明,對于大部分情況來說,他們的名字,他們的作用,他們計算的大致步驟, (有時是)誰發(fā)明了他們,發(fā)明了多久了,他們的缺陷是什么,和他們相關(guān)的有什么。把數(shù)學(xué)當(dāng)文科來學(xué)。 為什么呢?因為第一步反應(yīng)在數(shù)學(xué)上的是問題的確定。如果你有一個問題去解決,并且假設(shè)你沒有頭緒如何開始,這將花費你很長的時間來弄明白。但如果你知道這是個變異的問題,或者是一個凸優(yōu)化問題,或者一個布爾的邏輯問題,然后你起碼能知道從哪著手開始尋找解決方案。 現(xiàn)在有許許多多的數(shù)學(xué)技術(shù)和整個的學(xué)科分支。如果你不知道組合邏輯是什么,甚至連聽都沒聽說過,那么你是不可能意識到在組合邏輯中可以找到的解決答案的問題的,難道不是么? 但那實在是個大新聞,因為閱讀這些領(lǐng)域,學(xué)習(xí)實際算法,建模和計算結(jié)果的方法,記住這些名字都是容易的。在學(xué)校里他們教你鏈?zhǔn)椒▌t,你也能回憶起他們并能運用在考試題上,但有多少學(xué)生能真正的了解他們到底意味著什么呢?所以當(dāng)他們遇到變種的鏈?zhǔn)絾栴}時,他們就不懂得如何運用公式了。讓人感到諷刺的是,了解這是什么比記住如何運用公式更為容易,鏈?zhǔn)椒▌t僅僅是如何對鏈?zhǔn)胶瘮?shù)求導(dǎo)的意思,函數(shù) f() 引用函數(shù) g() ,你要求導(dǎo) f(g()),好了,程序員知道所有這些函數(shù)相關(guān)的;我們每天都使用他們,所以現(xiàn)在比過去在學(xué)校更加容易能夠想象到問題所在。 這就是為什么我認(rèn)為他們以錯誤的方式在教數(shù)學(xué)。對大多數(shù)高中畢業(yè)生來說,他們專門教授的內(nèi)容,不是可以靠經(jīng)驗來證明數(shù)學(xué)是如何如何有用的,他們教的那些恰恰是非經(jīng)驗式的內(nèi)容。在你學(xué)習(xí)如何求導(dǎo)和做積分之前,你將要學(xué)習(xí)如何計數(shù),怎樣編程。 我認(rèn)為學(xué)習(xí)數(shù)學(xué)最好的方法是每天花15到30分鐘逛維基百科。那上面有數(shù)千數(shù)學(xué)分支的相關(guān)文章??梢詮囊恍┠愀信d趣的文章著手(比如,弦理論,或者,傅立葉變換,或者張量理論,就是能沖擊你相象力的東西) 閱讀。如果有什么你不理解的,就去了解那些鏈接。如此這般直到你累到不行為止。 幾個月后,這么做會縱向擴展你的數(shù)學(xué)知識面,你會發(fā)現(xiàn)一些模式,好比,數(shù)學(xué)的每個分支看上去都包括了一個有著復(fù)雜的多元的變量,然后線性代數(shù)將會慢慢爬滿你的書單列表,直到你強迫自己學(xué)會他實際上是怎樣工作的,你要下載個電子書或買本書,直到你能從中找到樂趣。 憑借著維基百科,你也能快速的找到一條了解數(shù)學(xué)基本原理的途徑,條條大道通羅馬。在某些領(lǐng)域,數(shù)學(xué)幾乎總是形式化我們的“常識”,所以我們能減少或證明那些領(lǐng)域里的新事物。對數(shù)學(xué)本身的研究就是無止境而且令人著迷的:構(gòu)造形式模型本質(zhì)的能力,證明,自明的系統(tǒng),規(guī)則表示,信息,和計算。 符號是個很重大的但很快會令人放棄的東西。數(shù)學(xué)符號是關(guān)閉你通往另一個世界的符咒。即使你熟悉累加,積分,多項式,指數(shù),等等,如果你看到一堆符號堆徹的異常復(fù)雜時,你就把他實現(xiàn)的功能簡單的當(dāng)成一個原子操作好了,不要深究太多。 然而,從觀察數(shù)學(xué)來說,嘗試著明白人們正在試圖解決的問題(那些已被證明了的問題某天也許會對你有實際用途),你會開始在符號中看到相同的類型,你也不再排斥他們。比如,累加符號(大寫符號-西格馬)或者π(大寫符號-pi,連乘符號)起初看上去讓人心里沒底,即時你了解了他們的基本原理。但如果你是個程序員,你會認(rèn)識到他僅僅是個循環(huán):一個累加值,一個累乘。積分是一段連續(xù)曲線的相加,所以那不會讓你郁悶太久。 一旦你習(xí)慣了數(shù)學(xué)的許多分支,和許多不同的符號的格式,你就走在了解許多數(shù)學(xué)知識的路上了。因為你不再害怕,你將會發(fā)現(xiàn)問題,其實他們會自動跳到你面前?!班?,”你會思索,“我了解這個。這是乘法符號!” 這樣你就能扔掉計算器了。有一個充滿相象的計算器比如 R,Matlab,Mathematica,甚或是支持向量機的C語言庫。但幾乎所有有用的數(shù)學(xué)都是重型自動機,所以你能夠讓一切都變的自動化。 數(shù)學(xué)如何幫助我們 也許不是--不能立刻奏效。但確實能幫助提升你的邏輯推理能力:好比是在體育館做練習(xí),如果你每天都做一點的話,你整體的能力會得到提升。 對我來說,我已經(jīng)注意到一些我已經(jīng)感興趣的領(lǐng)域(包括人工智能,機器學(xué)習(xí),自然語言處理,和模式識別)大量的使用到數(shù)學(xué)。如我已經(jīng)挖的有點深度的領(lǐng)域,我已經(jīng)發(fā)現(xiàn)他們使用的數(shù)學(xué)不再比我在中學(xué)的學(xué)到的數(shù)學(xué)還要更難;大部分來說僅僅是不同領(lǐng)域。而不是更難了,并且學(xué)習(xí)使我能寫(或者是在我自己的代碼里使用)神經(jīng)網(wǎng)絡(luò),基因算法,貝頁斯分類器,集群算法,圖像識別,和其他時髦的東西,能產(chǎn)生很酷的應(yīng)用。我常向我的朋友顯寶。 我已經(jīng)漸漸意識到這點,當(dāng)別人給我看一篇包含了數(shù)學(xué)符號的文章我不再像突然冒了一身冷汗:組合,微分,真值表,定列式,無限系列,等等;那些數(shù)學(xué)符號現(xiàn)在變得容易相處了,但(像編程語言的語法)一開始的話多少還是有點讓人感到有些怪異?,F(xiàn)在我能更好的理解了,當(dāng)我一點不知道正在說什么時,也不再感到自己是個不懂?dāng)?shù)學(xué)的人了。因為我知道自己是能夠弄明白的。那很好。 我會繼續(xù)加油做的更好滴。我還有不少活頭,有好多書和文章要讀。有時我會花整個周末來讀數(shù)學(xué)書,有時會數(shù)周都不再思索她。也和其他興趣一樣,如果你單純的信任她你就會有興趣,也能更容易的消磨時光,你可以經(jīng)常一點點的嘗試應(yīng)用你覺得有趣的,并從中獲益。 |
|