豆瓣9.2,能把數學和python完美結合的,只服這本書!讀者感歎“癱瘓式手把手教程”!
更新于:2025-03-26 06:26:33

數學擁有無窮的力量。它既幫助遊戲開發工程師建模物理世界,也説明量化金融分析師賺取利潤,還説明音訊處理工程師製作音樂。在數據科學和機器學習領域,數學知識更是不可或缺的。

有人熱愛數學,將它比作詩歌,為之著迷一生;有人很難領會數學的妙處,受困於“數學焦慮症”。本書正是為了説明程式師消除這種焦慮,用自己熟悉的工具,即代碼,重新發現數學之美。

本書以圖文結合的方式説明你用Python代碼解決程序設計中的數學問題。通過邊學邊練,你會發現線性代數和微積分的重要概念躍然紙上、印在腦中。

來源 | 《程式師數學:用Python學透線性代數和微積分》

作者 | 保羅·奧蘭德(Paul Orland)

譯者 | 百度KFive

數學就像棒球、詩歌或者美酒。一些人為之著迷,以至於為它奉獻終生;另一些人卻難以領會其妙處。接受過十餘年的數學教育,你應該已經屬於這兩個陣營之一了。

如果我們在學校里像學習數學一樣學習關於美酒的知識呢?要是一週五天、每天聽一小時的葡萄品類和發酵技術課程,我想我絕不會喜歡葡萄酒。也許在這樣的世界里,我需要按照老師佈置的作業每天喝上三四杯。這種體驗聽起來很美妙,但有時我可能並不願意在放學後喝得醉醺醺的。我在數學課上的經歷就是這樣,這讓我一度對這門學科望而卻步。學習數學就像品葡萄酒一樣,是後天才能培養的愛好,但是天天聽課和寫作業沒辦法讓你長出一根善於品嘗美酒的舌頭。

判斷自己是否具有學習數學的天賦似乎很容易。如果你相信自己,並且對開始學習數學感到興奮,那就太好了!如果你不那麼樂觀,那麼本章就是為你設計的。被數學嚇退的現象很普遍,它有一個名字:數學焦慮症。我希望能消除你可能有的任何焦慮,並告訴你學習數學可以是一場激動人心的經歷,並不可怕。你需要的只是合適的工具和端正的態度。

本書的主要學習工具是Python程式設計語言。我猜你在高中學習時,數學知識是寫在黑板上而不是計算機代碼里的。這真是太可惜了,因為高級程式設計語言遠比黑板或任何昂貴的計算機更強大、用途更多。用代碼學習數學的一個好處是,設計必須精確,以便計算機理解,而且永遠不會讓新符號產生歧義。

就像學習其他東西一樣,成功的關鍵是你有學習的動機。動機多種多樣:你可能被數學概念的美感所吸引,或者喜歡數學問題那種像“腦筋急轉彎”一樣的感覺,抑或有一個夢寐以求的應用程式或遊戲,需要寫一些數學相關的代碼來使它工作。現在,我將專注於一種更實際的動機——用軟體解決數學問題可以賺很多錢。

1

使用數學和軟體解決商業問題

經常有人詬病高中數學課:“我什麼時候才能在現實生活中用到這些知識?”老師告訴我們,數學會幫助我們在事業上取得成功並賺錢。我覺得他們說得沒錯,儘管舉的例子並不準確。例如,我不會手動計算銀行複利(銀行也不會)。也許,如果我像三角學老師建議的那樣成為建築工地的測量員,就會每天用正弦公式和餘弦公式來賺取工資。

看起來高中課本里所謂的“實際”應用並沒那麼有用,但是對數學的真實應用還是有的,而且有些應用帶來的商業利潤令人瞠目結舌。許多問題是通過將正確的數學思想轉化為可用的軟體來解決的。這裡將分享一些我最喜歡的例子。

(1) 預測金融市場走勢

我們都聽說過股票交易員通過在正確的時間買入和賣出正確的股票而賺取數百萬美元的傳奇故事。受所看電影的影響,我總是把他們想像成穿著西裝的中年男子,一邊開著跑車,一邊用手機對著經紀人大喊大叫。也許這種刻板印象在某一時期是正確的,但今天的情況已經不同了。

在曼哈頓的摩天大樓里,隱藏著成千上萬被稱為量化金融分析師(quant)的人。量化金融分析師又稱定量分析師,負責設計數學演算法來自動交易股票並賺取利潤。他們不穿西裝,也不花時間對著手機大喊大叫,但我相信他們中的很多人擁有非常漂亮的跑車。

那麼,量化金融分析師是如何寫出自動賺錢的程式的呢?這個問題的最佳答案是被嚴密保護的商業秘密,但肯定涉及大量數學知識。我們可以看一個簡單的例子來了解自動交易策略的工作原理。

股票是代表公司擁有權的金融資產類型。當市場認為一家公司經營良好時,其股票價格就會上漲:買入股票的成本增加,賣出股票的回報也會增加。股票價格的變化是不穩定的、即時的。圖1-1顯示了在一天交易中的股票價格圖。

圖1-1 股價隨時間變化的典型圖形

對於這隻股票,如果你在第100分鐘左右以24美元買入1000股,並在第430分鐘左右以38美元全部賣出,當天就可以賺14 000美元。這很棒!挑戰在於,你必須提前知道這隻股票會上漲,而且清楚第100分鐘和第430分鐘分別是買入和賣出的最佳時機。雖然你可能無法準確預測最低或最高價格,但也許能找到一天中相對較好的買賣時機。讓我們來看看如何用數學方法來實現這個目標。

我們可以通過找到一條“最佳擬合”線來衡量股票價格會漲還是會跌,這條線大致遵循價格的變動方向。這個過程稱為線性回歸,本書的第三部分會介紹。因為數據是不斷變化的,所以可以在“最佳擬合”線上下再計算出兩條線,以顯示價格上下浮動的區域。把它們疊加在價格圖表上,可以看出這些線和趨勢相符,如圖1-2所示。

圖1-2 利用線性回歸確定股票價格的變化趨勢

有了對股票價格走勢的數學理解,我們就可以編寫代碼,在股票價格相對於其趨勢開始低位波動時自動買入,並在價格回升時自動賣出。具體來說,我們的程式可以通過網路連接到證券交易所,在價格低於底線時買入100股,並在價格越過頂線時賣出100股。圖1-3展示了一次這樣的盈利交易:以27.80美元左右的價格買入,以32.60美元左右的價格賣出,在一小時內可以賺到約480美元。

圖1-3 使用我們基於規則的交易軟體進行買賣,賺取利潤

我不敢說這是一個完備的可執行策略,但重點是,只要有正確的數學模型,你就可以自動獲利。此刻,不知有多少程式正在構建和更新對股票等金融工具進行趨勢預測的模型。如果你編寫出這樣的程式,就能在享受閒暇時光的同時賺錢了!

(2) 尋找優質交易

或許你的本錢不夠多,無法參與高風險的股票交易。儘管如此,數學仍然可以説明你在其他交易中賺錢和省錢,比如在買二手車時。新車交易比較簡單透明:如果兩個轉銷商在賣同一款車,你顯然想從成本最低的經銷商那裡買。但二手車有更多需要考慮的參數:除了價格,還有里程數和出廠日期。你甚至可以利用某輛二手車在市場上的停留時間來評估它的品質:停留時間越長,其品質可能就越值得懷疑。

在數學裡,用有序的數位清單來描述的物件被稱為向量(vector),有一個領域專門研究它,稱為線性代數。例如,一輛二手車可能對應的是一個四維向量,也就是一個包含四個數的元組。例如:

這些數分別代表出廠日期、里程數、停留天數和價格。我的一個朋友經營著一個叫作CarGraph的網站,上面匯總了二手車銷售的數據。在寫作本書時,這個網站提供了101輛豐田普銳斯的銷售數據,包含每輛車的這四項數據(部分或全部)。該網站名副其實,將數據以圖表的形式直觀地呈現出來(見圖1-4)。四維物件很難可視化,但如果選擇其中的兩個維度,比如價格和里程數,就可以把描述它們關係的散點圖繪製出來。

圖1-4 來自CarGraph的二手普銳斯價格與里程數關係圖1

11英里 ≈ 1.6千米。——編者注

我們也想在這裡畫一條趨勢線。圖中的每個點都代表了某個人心中的合理價格,趨勢線會把這些心理預期價格匯總到一起,形成在任何里程數下都比較可靠的價格。在圖1-5中,我決定擬合一條指數下降曲線,而不是一條直線,並且忽略了一些以低於零售價銷售的次新車。

圖1-5 根據二手普銳斯的價格與里程數擬合出的指數下降曲線

圖1-6 以10 000美元的預算為例,找出一輛二手普銳斯的預期里程數

除了可以尋找性價比最高的交易,我們還能從式(1.1)中學到更多東西。它講述了一個關於汽車如何貶值的故事。式中的第一個數是$26 500,是指數函數對里程為零時價格的理解。這與一輛新普銳斯的零售價非常接近。如果我們使用最佳擬合線,它意味著普銳斯每行駛一英里就會損失固定的價值。這個指數函數則表示,每行駛一英里,普銳斯的價值就會損失一個固定的百分比。在行駛10 000英里後,根據這個公式,一輛普銳斯的價格會跌到原價的0.905(90.5%)。在行駛50 000英里後,我們將其價格乘以係數(0.905)5 ≈ 0.607。這告訴我們,它的價格約為新車的61%。

我用Python實現了一個price(mileage)函數,用來製作像圖1-6那樣的圖。它將里程數作為輸入(單位為萬英里),並輸出最適合的價格。通過計算price(0) - price(5)和price(5) - price(10),我知道了第一個和第二個50 000英里的行駛成本分別為10 000美元和6300美元。

如果使用最佳擬合直線而不是指數曲線,這意味著汽車的固定折舊率為每英里0.10美元。換言之,每行駛50 000英里,就一定會損失5000美元。傳統觀念認為,新車行駛的頭幾英里掉價最快,因此指數函數(式(1.1))與此相符,而線性模型則不夠準確。

請記住,這隻是一個二維分析。我們只建立了一個數學模型,將描述每輛車的四個數值維度中的兩個維度聯繫起來。在本書第一部分中,你將詳細學習各種維度的向量以及如何使用高維數據。第二部分將介紹不同類型的函數,如線性函數和指數函數,並通過分析其變化率來進行比較。最後,第三部分將探討如何建立數學模型,將數據集的所有維度納入其中,從而獲得更準確的圖形。

(3) 構建三維圖形和動畫

許多在商業上大獲成功的著名軟體專案與多維數據打交道,特別是三維數據。這裡我想到的是三維動畫電影和三維視頻遊戲,它們的總收入高達數十億美元。例如,皮克斯的三維動畫軟體幫助其獲得了超過130億美元的票房收入,Activision的《使命召喚》系列三維動作遊戲賺了160多億美元,而Rockstar僅憑《俠盜獵車手5》就賺了60多億美元。

從《海底總動員》中的小醜魚到《使命召喚》中的航空母艦,任何三維物件都可以在計算機中用三維向量的集合來定義。在代碼中,每個物件看起來都像由float值組成的三元數對(triple)清單。有三個三元浮點數對,我們就有了空間中的三個點,這樣就可以定義一個三角形(見圖1-8)。例如:

triangle = [(2.3,1.1,0.9), (4.5,3.3,2.0), (1.0,3.5,3.9)]

圖1-8 使用由三元數對定義的三個頂點構建一個三維三角形

組合多個三角形,就可以生成一個三維物件的表面。使用更多、更小的三角形,還可以讓結果看起來很平滑。圖1-9顯示了使用越來越多的更小三角形對一個三維球體進行的六次渲染。

圖1-9 由指定數量的三角形構建的三維球體

你將學習使用三維向量數學將三維模型轉換成類似於圖1-9中的帶陰影的二維圖像。你還需要使三維模型更為平滑,讓它們在遊戲或電影中顯得更加逼真,並且讓它們逼真地移動和變化。這意味著你設計的對象應該遵守物理定律,而這些定律也可以用三維向量來表示。

圖1-10 炮彈的位置向量因其初始速度和重力的影響而隨時間變化

有經驗的動作遊戲玩家都知道,想擊中直升機,需要瞄準稍微高於直升機的位置!要類比物理學,必須知道力是如何影響物體並隨著時間的推移引起物體連續變化的。研究連續變化的數學被稱為微積分,物理定律通常用微積分中的微分方程來表示。在第4章和第5章中,你會學到如何製作三維物體的動畫,然後在第二部分中學習如何利用微積分的思想類比物理世界。

(4) 對物理世界建模

之前“數學軟體能產生真正的商業價值”的說法並非虛言,我在自己的職業生涯中已經看到了這種價值。2013年,我成立了一家名為Tachyus的公司,編寫軟體以優化石油和天然氣的生產。我們的軟體利用數學模型來瞭解地下油氣的流動情況,幫助生產商更高效地開採同時獲利更多。在軟體的説明下,我們的客戶每年節約了數百萬美元的成本並提高了產量。

為了解釋軟體的工作原理,這裏介紹一些石油術語。將稱為井的鑽孔鑽到地下,直到到達含有石油的多孔(海綿狀)岩石。這層富含石油的岩石稱為儲油層。石油被抽到地面並賣給煉油廠,然後煉油廠將石油轉化為我們日常使用的產品。圖1-11為油田示意圖(未按比例顯示)。

圖1-11 油田示意圖

過去幾年中,石油價格變化很大,但我們假設它的價值是每桶50美元,其中桶是一個容積單位,相當於42加侖或約159升。如果通過鑽井和有效地抽油,一家公司每天能夠開採1000桶石油(相當於幾個後院游泳池的容積),那麼它的年收入將達到數千萬美元。即使效率只提高幾個百分點,也是一筆可觀的收入。

根本的問題是地下的情況:石油現在在哪裡,如何流動?這是一個複雜的問題,但是可以通過解微分方程來回答。這裡的變數不是炮彈的位置,而是地下流體的位置、壓力和流速。流體流速用一種特殊的函數來表示,這種函數返回一個向量,稱為向量場。這意味著流體可以在任意三維方向上以任意速度流動,而且這個方向和速度在儲油層內的不同位置各不相同。

圖1-12 達西定律對應的物理方程,決定流體在多孔岩石中的流動方式

圖1-13 正梯度指向上坡,而負梯度指向下坡

我會介紹如何應用梯度來類比物理世界,以及解決其他數學問題。梯度恰好也是機器學習中最重要的數學概念之一。

希望這些例子比你在高中數學課上聽到的實際應用更有說服力和現實意義。也許此刻你已經願意去學習這些數學概念了,但是又擔心太難。學習數學的確很難,尤其是自學。為了讓你盡可能順利地學習,我們來談談作為數學學生可能面臨的一些陷阱,以及本書如何説明你避免踏入這些陷阱。

2

用上你訓練有素的左腦

本書是為有經驗的程式師或在工作中熱衷於學習程式設計的。為程式師讀者寫關於數學的內容是極好的,因為如果你會寫代碼,就已經訓練了你的分析性左腦。我認為學習數學的最好方法是藉助高級程式設計語言,並且預測在不遠的將來,這將是數學課堂的常態。

對於像你這樣的程式師,可以用幾種具體的方法來很好地學習數學。我在這裡將其列舉出來不僅是為了奉承你,也是為了提醒你已經具備了哪些技能,可以在數學學習中利用起來。

(1) 使用正式的語言

當學習程式設計時,第一個痛苦的教訓就是,不能像寫簡單的英文一樣編寫代碼。如果你給朋友寫的紙條有少許拼寫或語法錯誤,他們可能還能理解你想說的內容,但代碼中的任何語法錯誤或拼寫錯誤都會導致程式運行失敗。在某些語言中,即使在原本正確的語句末尾漏掉一個分號,也會導致程式無法運行。作為另一個例子,看一下下面這兩個語句。

另一個困擾新手程式師(有經驗的程式師也一樣)的問題是引用相等。如果定義了一個新的Python類,並創建了它的兩個相同的實例,那麼它們是不相等的。

你可能希望兩個相同的表達式是相等的,但這顯然不符合Python的規則。因為這兩個表達式是A類的不同實例,所以它們是不相等的。

寫代碼的時候,僅僅寫出語法正確的語句是不夠的。語句所代表的思想需要是有意義的、合法的。如果寫數學語句時也同樣謹慎,你會更快發現錯誤。更棒的是,如果用代碼寫數學語句,計算機會幫你做輔助檢查。

當你厭倦了重複計數時,就可以創建針對加法的抽象;當你厭倦了做重複的加法時,就可以創建針對乘法的抽象;以此類推。

數學的抽象性會讓人望而生畏。但是,就像在任何優秀軟體中一樣,引入抽象是有原因的:它可以説明你組織和交流更巨集大、更強有力的思想。當你掌握了這些思想並將其轉化為代碼時,就會開啟更多令人興奮的可能性。

如果你還沒有做到這一點,我希望你已經相信,軟體開發中有許多令人興奮的數學應用。

推薦閱讀

《程式師數學 用Python學透線性代數和微積分》

作者:保羅·奧蘭德(Paul Orland)

譯者:百度KFive

代碼和數學是相知相惜的好夥伴,它們基於共同的理性思維,數學公式的推導可以自然地在編寫代碼的過程中展開。

500余幅圖片,本書以圖文結合的方式説明你用Python代碼解決程序設計中的數學問題。

300余個練習,通過邊學邊練,你會發現線性代數和微積分的重要概念躍然紙上、印在腦中。

《普林斯頓微積分讀本(修訂版)》

《普林斯頓數學分析讀本》

《普林斯頓概率論讀本》

作者:[美] 史蒂文·J. 米勒、拉菲·格林貝格、史蒂文·J. 米勒

譯者:李馨

風靡美國普林斯頓大學的數學課程讀本,教你怎樣在數學考試中獲得高分,用大量例子和代碼全面探討數學問題提供課程視頻和講義。被譽為“普林斯頓讀本”三劍客。

分享

在看

寫留言