|
作者:Ian Rowan 機(jī)器之心編譯 參與:Panda W、一鳴 ∑、∏、∈……如果你學(xué)習(xí)過數(shù)學(xué),你一定知道這些符號(hào)的含義,而如果我們能用最喜歡的編程語言來理解它們,也許還能帶來更加透徹的領(lǐng)悟。近日,MindbuilderAI & nurio 創(chuàng)始人、機(jī)器學(xué)習(xí)專家 Ian Rowan 介紹了自己借助代碼來理解數(shù)學(xué)計(jì)算過程的經(jīng)驗(yàn)。 對(duì)于想要在機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)領(lǐng)域創(chuàng)出一番事業(yè)或做出一些研究成果的人來說,終有一天會(huì)在鼓搗 Python 軟件庫的基礎(chǔ)上更進(jìn)一步,跟隨自己的好奇心進(jìn)入背后的數(shù)學(xué)領(lǐng)域。這通常會(huì)將你引向那些描述了各種原理的數(shù)量龐大的公開論文集。你對(duì)核心數(shù)學(xué)機(jī)制的理解越深入,你就越可能靈光閃現(xiàn),成為一種新方法的創(chuàng)造者。在讀第一篇論文時(shí),可能一開始一切都還很容易理解,但當(dāng)你遇到下面這種公式時(shí),你可能就會(huì)開始疑惑了: 對(duì)于學(xué)習(xí)過多年的數(shù)學(xué)或研究過機(jī)器學(xué)習(xí)的數(shù)學(xué)層面的人來說,這樣的等式可以通過精心的處理而解析為語言描述和代碼。但對(duì)其他很多人來說,這看起來可能就像天書。事實(shí)上,這看起來就像是古代的數(shù)學(xué)領(lǐng)袖選擇了看起來最有意思的符號(hào)來描述相當(dāng)直觀的方法。這就導(dǎo)致了一個(gè)結(jié)果:等式和變量看起來比實(shí)際表達(dá)的含義還要復(fù)雜得多。 我發(fā)現(xiàn)代碼不僅能用來寫程序,而且還是用于解釋復(fù)雜問題的全球通用語言。當(dāng)我學(xué)習(xí)數(shù)據(jù)科學(xué)背后的數(shù)學(xué)時(shí),我總是發(fā)現(xiàn)理解數(shù)學(xué)的最佳方式是寫出描述這些等式的代碼段。最終,我理解了這些符號(hào),現(xiàn)在讀它們就像讀一篇普通論文一樣。我希望通過這篇文章分享一些示例,讓大家知道用代碼描述數(shù)學(xué)竟會(huì)如此簡(jiǎn)單! 求和與求積
如前所示,這個(gè)符號(hào)表達(dá)的其實(shí)就是一個(gè)循環(huán)。求和符號(hào)上面的數(shù)字是這個(gè)循環(huán)的范圍,下面的數(shù)字是起始位置。下面的變量集會(huì)變成索引變量,每次循環(huán)的結(jié)果都被加起來,得到一個(gè)總和值。下面的符號(hào)則更少見一些: 這個(gè)符號(hào)通常被稱為乘積算子(Product Operator)。這個(gè)符號(hào)與求和符號(hào)的工作方式相似,只不過每次循環(huán)的結(jié)果不是相加,而是相乘。
階乘 階乘的符號(hào)是 !,大多數(shù)計(jì)算器都有這個(gè)功能。對(duì)很多人來說,這個(gè)符號(hào)表達(dá)的含義可能很明顯和直白,但還是值得用代碼來理解其原理。 5! 可以表示成:
條件括號(hào) 條件括號(hào)的作用是基于一組條件來切換所要執(zhí)行的等式。對(duì)于程序員來說,這其實(shí)就是簡(jiǎn)單的 if 語句。上面的條件等式可表示為:
可以看到,等式右側(cè)括號(hào)中每一行都對(duì)應(yīng)一個(gè)條件以及該條件下所要執(zhí)行的路徑。我還在每個(gè)條件中增加了額外的「屬于」符號(hào),以便提供更多見解。如前所示,我們檢查了 i 值是否在 y 列表中。如果在,則返回?cái)?shù)組的和。如果不在,我們則根據(jù)具體的值返回 0 和 1。 逐點(diǎn)乘法和笛卡爾矩陣乘法 最后,我想快速介紹幾個(gè)任何數(shù)據(jù)科學(xué)家都可以用自己最喜歡的語言庫輕松完成的運(yùn)算——矩陣乘法。理解矩陣乘法的最簡(jiǎn)單方式是逐點(diǎn)運(yùn)算。這可以簡(jiǎn)單地寫成: 注意,首要要求是每個(gè)矩陣都必須形狀一樣(即 # rows= & #Columns=)。其代碼如下:
最后,我們來看一種典型的矩陣乘法過程,這在機(jī)器學(xué)習(xí)領(lǐng)域非常常用。用復(fù)雜的術(shù)語來說,這個(gè)運(yùn)算的目的是求取每個(gè)主要行與每個(gè)次要列的點(diǎn)積。主要來說是下面的要求:假設(shè) [#rows, #columns] → 矩陣 i x j 要求 #columns(i) == #rows(j) → 最終積的形狀為 [#rows(i), #columns(j)] 這看起來很令人困惑,我最好的建議是搜索一下這些要求的可視化圖片。 這個(gè)等式的代碼如下(使用了 numpy dot 方法):
本文僅給出了少量示例,但理解這些簡(jiǎn)單代碼能讓任何程序員都能踏足乍看之下難以深入的數(shù)學(xué)世界。當(dāng)然,這些方法都可以合并簡(jiǎn)化,實(shí)現(xiàn)更高的效率,而且通常很多軟件庫中都有現(xiàn)成的方法可用。用簡(jiǎn)單代碼寫出這些數(shù)學(xué)符號(hào)的意義在于通過寫出這些等式的真正計(jì)算過程來理解它們的含義。 原文鏈接:https:///understanding-mathematical-symbols-with-code-5aa0c542644本文為機(jī)器之心編譯,轉(zhuǎn)載請(qǐng)聯(lián)系本公眾號(hào)獲得授權(quán)。 |
|
|