數學公式太晦澀,不如用代碼寫出來:這是程式設計師學數學的獨特方式

2021-01-08 騰訊網

選自TowardDataScience

作者:Ian Rowan

機器之心編譯

參與:Panda W、一鳴

簡潔的代碼不僅能運行程序,還能用來學數學。

∑、∏、∈……如果你學習過數學,你一定知道這些符號的含義,而如果我們能用最喜歡的程式語言來理解它們,也許還能帶來更加透徹的領悟。近日,MindbuilderAI & nurio 創始人、機器學習專家 Ian Rowan 介紹了自己藉助代碼來理解數學計算過程的經驗。

對於想要在機器學習和數據科學領域創出一番事業或做出一些研究成果的人來說,終有一天會在鼓搗 Python 軟體庫的基礎上更進一步,跟隨自己的好奇心進入背後的數學領域。這通常會將你引向那些描述了各種原理的數量龐大的公開論文集。你對核心數學機制的理解越深入,你就越可能靈光閃現,成為一種新方法的創造者。在讀第一篇論文時,可能一開始一切都還很容易理解,但當你遇到下面這種公式時,你可能就會開始疑惑了:

對於學習過多年的數學或研究過機器學習的數學層面的人來說,這樣的等式可以通過精心的處理而解析為語言描述和代碼。但對其他很多人來說,這看起來可能就像天書。事實上,這看起來就像是古代的數學領袖選擇了看起來最有意思的符號來描述相當直觀的方法。這就導致了一個結果:等式和變量看起來比實際表達的含義還要複雜得多。

我發現代碼不僅能用來寫程序,而且還是用於解釋複雜問題的全球通用語言。當我學習數據科學背後的數學時,我總是發現理解數學的最佳方式是寫出描述這些等式的代碼段。最終,我理解了這些符號,現在讀它們就像讀一篇普通論文一樣。我希望通過這篇文章分享一些示例,讓大家知道用代碼描述數學竟會如此簡單!

求和與求積

在迭代數學方法中,求和符號是最有用且最常用的符號。儘管求和符號設計複雜,但實現方法卻非常簡單,而且也極其有用。

x = [1, 2, 3, 4, 5, 6]result = 0for i in range(6):

result += x[i]Output of print(result) -> 21

如前所示,這個符號表達的其實就是一個循環。求和符號上面的數字是這個循環的範圍,下面的數字是起始位置。下面的變量集會變成索引變量,每次循環的結果都被加起來,得到一個總和值。下面的符號則更少見一些:

這個符號通常被稱為乘積算子(Product Operator)。這個符號與求和符號的工作方式相似,只不過每次循環的結果不是相加,而是相乘。

x = [1, 2, 3, 4, 5, 1]

result = 1

for i in range(6): result *= x[i]Output of print(result) -> 120

階乘

階乘的符號是 !,大多數計算器都有這個功能。對很多人來說,這個符號表達的含義可能很明顯和直白,但還是值得用代碼來理解其原理。

5! 可以表示成:

result = 1for i in range(1,6):

result *= iOutput of print(result) -> 120

條件括號

條件括號的作用是基於一組條件來切換所要執行的等式。對於程式設計師來說,這其實就是簡單的 if 語句。上面的條件等式可表示為:

i = 3y = [-2, 3, 4, 1]result = 0if i in y:

result = sum(y)elif i > 0: result = 1else:

result = 0print(result) -> 6

可以看到,等式右側括號中每一行都對應一個條件以及該條件下所要執行的路徑。我還在每個條件中增加了額外的「屬於」符號,以便提供更多見解。如前所示,我們檢查了 i 值是否在 y 列表中。如果在,則返回數組的和。如果不在,我們則根據具體的值返回 0 和 1。

逐點乘法和笛卡爾矩陣乘法

最後,我想快速介紹幾個任何數據科學家都可以用自己最喜歡的語言庫輕鬆完成的運算——矩陣乘法。理解矩陣乘法的最簡單方式是逐點運算。這可以簡單地寫成:

注意,首要要求是每個矩陣都必須形狀一樣(即 # rows= & #Columns=)。其代碼如下:

y = [[2,1],[4,3]]z = [[1,2],[3,4]]x = [[0,0],[0,0]]

for i in range(len(y)): for j in range(len(y[0])): x[i][j] = y[i][j] * z[i][j]print(x) -> [[2, 2], [12, 12]]

最後,我們來看一種典型的矩陣乘法過程,這在機器學習領域非常常用。用複雜的術語來說,這個運算的目的是求取每個主要行與每個次要列的點積。主要來說是下面的要求:假設 [#rows, #columns] 矩陣 i x j 要求 #columns(i) == #rows(j) 最終積的形狀為 [#rows(i), #columns(j)]

這看起來很令人困惑,我最好的建議是搜索一下這些要求的可視化圖片。

這個等式的代碼如下(使用了 numpy dot 方法):

y = [[1,2],[3,4]]z = [[2], [1]]# x has shape [2, 1]x = [[0], [0]]for i in range(len(y)) for j in range(len(z): x[i][j] = np.dot(y[i], z[:, j])print(x) -> [[4],[10]]

本文僅給出了少量示例,但理解這些簡單代碼能讓任何程式設計師都能踏足乍看之下難以深入的數學世界。當然,這些方法都可以合併簡化,實現更高的效率,而且通常很多軟體庫中都有現成的方法可用。用簡單代碼寫出這些數學符號的意義在於通過寫出這些等式的真正計算過程來理解它們的含義。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

---

相關焦點

  • 程式設計師的數學修煉手冊
    有人說:「2020 年是程式設計師本命年。」「哦?怎講?」「因為 2020=404+404+404+404+404」這誰說的?你出來,咋就顯擺你數學好呢!這還不是最可怕的 ,有人甚至還算出,2020-1024=996。憂桑,難道我這個社畜不配擁有休息日?好吧,既然我擋不住它來,只能勵志做一個不禿頭的好程式設計師了。
  • 為何敲代碼,學好數學很重要?
    這並不能阻止程式設計師嘗試在他們的編輯器中解決它們,但他們最終會得到一些混亂,緩慢或解決了錯的問題的代碼。並不是程式語言還不夠好。沒有哪一種正式語言在這方面擅長。我們的大腦就不是那麼思考問題的。當問題變得困難時,我們繪製圖表並與同事們討論。理想情況下,首先解決步驟1和2,然後才使用程式語言來解決步驟3。這在轉換實現過程中有額外的好處。
  • 高考數學124分,微積分公式寫在牆上天天看,這是在檢討OR秀優越
    吉林大學交通學院的某位大一學生,因為高考數學考了124,擔心自己大學高等數學會掛科,於是把微積分公式寫在牆上天天看,他覺得這樣有助於學習。客觀而言,高考數學124分並不算低,但對於吉林大學這種985大學來說,確實稍稍低了點,但這不是重點,重點是這位同學把公式寫在牆上真的有助於學習嗎?
  • 寫滿了數學公式的蛋糕:除了學霸無人敢訂?
    只見蛋糕黑白分明,白色仍舊是我們喜歡的奶油,但是黑色卻密密麻麻的寫滿了數學公式。這仿佛讓人身臨其境地陷入到解數學題時的「窘迫」當中,網友們也紛紛調侃,並留言表示,「看著頭大!意思我現在過個生日也不配了嗎?」「這款蛋糕除了學霸無人敢訂!」看到這款蛋糕你是否也再一次感受到了被數學支配的恐懼?
  • 數學老師:學數學你要背公式,送你一個成語
    學好數學肯定是不能夠通過「背公式」的,這點按說應該沒有人會質疑才是。可是不語竟然真的接到這個問題的諮詢了——一位同學非常苦難數學成績,但是他問我的問題竟然是「我實在是背不過那些公式,總是背了之後很快就忘了……」說真的,如果不是他態度誠懇,不語真的以為這是在逗我呢……為何要背數學公式呢?
  • 程式設計師編程入門必知!程式設計師需要學什麼
    學習語言的過程中還要有機會進行檢驗,不能只編寫代碼,還要檢驗代碼的結果運行是否正確,也就是某些可以運行結果的軟體我們要有,不過許多的程式語言都要求有被程式設計師設計來講代碼轉換成機器能理解的語言的編譯器。其他一些語言,比如Python,使用可以立即轉換成程序而不需要編譯。一些語言有自己的往往包含著代碼編輯器、調試器和/或者翻譯以及調試的IDEs(集成開發環境)。
  • 「數學之王」歐拉有多神,一度被懷疑是穿越者,創造出「上帝公式」
    數學,研究數量及其結構,同時涵蓋變化、空間和信息等概念,是一門觸類旁通、包容廣大的學術。它的歷史悠久,自初始概念誕生以來便橫貫著人類歷史盛衰。數學晦澀難懂,卻又能被世界上的每個人利用;簡易單一,科技民生卻又離不開它。不過本文要說的卻不是數學發展史的興替演變,而是一位數學史上的璀璨星辰。
  • 用數學公式也能畫漂亮小姐姐!?還可做動畫和音樂!到底是哪位大佬啊?
    最近因為偶然地看到了大神inigo quilez,一臉崇拜,用數學公式畫畫未免也太科技範兒了吧!於是去米國社交平臺搜了搜inigo quilez帳號,就看到了11月最新視頻動態底下「Painting a Selfie Girl,with Maths」熱火朝天的留言,連各家爸比們都帶著自家娃兒一起入了大神的數學繪圖課!
  • 把微積分公式寫牆上 用數理化公式來表白 學生時代最憷哪門課
    來源:放牛班吉林大學交通學院大一學生李昊覺得大學的高數很難,於是將微積分公式寫在牆上天天看,也得到了寢室的其他幾位同學的贊同。李昊說:「我高中數學不好,高考只考了124,到大學,發現大學高數更難……希望這樣期末能不掛科。」
  • LaTeX|數學公式排版
    這其實是一個行間公式環境,會生成一個不編號的公式。在數學模式下,空格都是不起實際作用的,但它可以讓公式代碼更好看一些。下面我們介紹一些基本的數學結構。上標與下標。這是數學模式中最常見的結構。在數學模式下,用「_」表示下標,用「^」表示上標。如果上標或下標的內容多於一個字符,需要用大括號括起來,否則上下標效果將只對第一個字符起作用。例子如下:
  • 高中三角函數萬能公式 高中數學特殊公式
    高中三角函數萬能公式 高中數學特殊公式三角及其御用函數無疑是高中數學舉足輕重的戲份之一,對於一個至少盤踞著兩本必修而且還攜帶著為數眾多公式招搖過市的傢伙,這難道不足以引起重視嗎?下文有途網小編給大家整理了《高中三角函數萬能公式 高中數學特殊公式》,僅供參考!
  • 耗時5年 美國搖滾巨星自學成為程式設計師
    最近,他在 Github 上還利用自己所學售賣自己的歌曲的小樣。作為一名合格的搖滾歌手,利用電子表格來記錄所有歌曲、想法等,但是後來他慢慢發現 Excel 變得越來越複雜,代入公式去記錄自己的歌曲方式讓他覺得自己好像在寫代碼,這實在太複雜了。「我幾乎是在用這些公式來寫代碼,只是它超級難用。因此,或許我真的應該用編程的方式來代替。」
  • Python代碼轉Latex公式,這個開源庫用一行代碼幫你搞定
    機器之心報導編輯:小舟你的代碼中有數學公式嗎?數學是數據科學和機器學習的重要基礎,數學運算的結果對於機器學習項目而言是至關重要的。在編寫代碼時,我們常常需要定義數學公式的計算形式。像 S=r^2 這樣簡單的數學公式,大概不會出現拼寫錯誤。但如果是下面這樣的公式呢?
  • 教孩子寫遊戲:3D遊戲編程的必備數學知識,理解三維空間向量
    因為我們要寫的是3D遊戲程序,所以,我們必須要接觸兩個數學方面的難點知識——向量和矩陣。有的人問:這個這麼難,我們可不可以不學?我的答案是這樣的:如果你是有心要學習本課程,那麼這個是必須要學習的,是沒有道理可講的,是想破了腦袋也要學明白的。
  • 超過三十歲就不適合寫代碼了?看看國外程式設計師怎麼說
    這方面的一個大問題是,我沒有這些職位所需的社交能力,也就是說無法處理廣泛的社交活動。即使我具備這樣的能力,我還是會覺得管理非常無聊,更糟糕的是,政治。事實上,我的內向性格是我開始寫代碼的主要原因,對技術的熱愛,解決問題和面對挑戰也是重要的,但只排第二。
  • 教孩子寫遊戲:快速入門C++語言,理解這12個概念,1天時間夠了
    「學」的部分:一個沒有基礎的人,要完整地學會C++語言,可能需要一年往上的時間,而且還不一定能學明白。我以為,這個問題出在教材上,寫得太過於晦澀難懂了,而且把很多特別不常用的內容添加了進去,這會導致很多想學的人越看越迷糊。在我看來,C++語言的基礎內容不是很多,我們只抓重點,用一整天的時間絕對可以學會。
  • 拉馬努金:傳奇數學天才,僅憑「直覺」發現了世上最美的數學公式
    他沒上過學,沒受過高等教育,卻創造了數學屆的神跡;他用直覺導出公式,不喜歡一步步去證明,但結果卻往往是對的;他發現的數學公式宛如藝術品,簡單又美麗,70年後仍被後輩們研究;拉馬努金解釋,他是因為日夜在石板上計算,因為想快點完成研究,覺得用破布來擦掉石板上的字,實在會太花時間了,所以他每隔幾分鐘就用臂肘直接擦石板的字。久而久之就磨出了厚厚的老繭。
  • 學Python編程為什麼會對學好數學有幫助呢?
    下面的Python代碼用於求階乘運算,factorial(n)是求階乘運算的函數,n是要求階乘的自然數, n是指自然數1、2、3、4、5、6、……。同學們可以先不用理解這段代碼及factorial(n)函數,在後面的課程我們會詳細講述,在這裡主要是理解用編程來實現數值計算的意義。
  • 小學數學公式大全,家長來看看!
    在學數學的過程中,基本數學公式是非常重要的,這種重要性不但體現在平時的解題過程中,也體現在學生對知識的靈活運用中。有的人會說,就算背了公式也不一定會用,也不懂得舉一反三,不一定保證數學成績能提高啊!但是如果學生在小學階段對基本公式真的一竅不通,那麼到了初中,高中就肯定學不懂數學。
  • 祝各位考生金榜題名,高考數學能不能用高數公式來解題?
    因為太好用,參變分離,求導討論往往非常複雜,甚至都算不出來,邊界最值很多同學又不懂,這時候洛必達往往分分鐘出答案。高手怎麼用呢,算出答案後。討論下必要性充分性。試卷上不出現洛必達,但是邏輯上沒有任何扣分理由。改卷老師懂,你也懂就夠了。所以說基礎好的高等數學當然可以用。但是要會不露痕跡的用。02與高中數學聯繫相對緊密的也就是高等數學和概率論了。