如果你喜歡機器學習和數據科學方面的研究,或者做著相關的工作,總有一天,你一定會想看看你平時經常使用的數學的世界,而不是止步於只會調用Python庫。
然後你就會去看很多很多文獻,看看那些功能到底是如何運作的。你看的越多、學得越多,你就越有可能想到新的點子,然後成為行業大佬,迎娶白富美、走上人生巔峰!想想都很激動。但是當你打開你的第一份文獻,納尼???這是神馬?!
如果你在大學學過數學,或者研究過機器學習,你還是能夠隱隱約約馬馬虎虎辨認出來這都是啥,慢慢看還能寫成代碼。但是對於很多人來說,這是WHAT???話說古時候象形文字都還挺形象挺直觀的,這這這也太複雜了吧!
事實上,你想檢驗你是否真的看懂了這些方程,你可以試試用代碼把這方程寫出來。最最最厲害的,你還可以用通俗不晦澀的語言把這些玩意兒表達出來。在這篇文章中,分享了一些代碼來描述數學符號的例子!往下看吧!
求和、求積符號
求和符號是數學中最有用、最常用的符號之一。它是迭代的符號,儘管它被涉及得複雜,實現卻相當簡單,而且非常有用。
# Python代碼
x = [1, 2, 3, 4, 5, 6]
result = 0
for i in range(6):
result += x[i]
print(result)
# 輸出為21
像看到的代碼那樣,求和符號用for循環表示,頂部的數字的範圍是for循環的次數,下面的數字是循環變量。每次循環都把數加到result中,最後再輸出結果。
與求和符號類似的,還有求積符號。
都用了同樣的for循環,只是求和符號是把數加到結果中,而求積符號是把數乘到結果中。看看代碼:
# Python代碼
x = [1, 2, 3, 4, 5, 1]
result = 1
for i in range(6):
result *= x[i]
print(result)
# 輸出為120
階乘
階乘的符號是!,它的運用同樣十分廣泛。那麼更應該看看它的實現代碼是怎樣的。
例如5!的值是通過1×2×3×4×5求得,它的代碼這樣寫:
# Python代碼
result = 1
for i in range(1,6):
result *= i
print(result)
# 輸出為120
分段函數
分段函數可以根據後面的條件,知道哪個變量該使用哪個表達式。對於程序員來說,if條件分支語句,可以很方便的實現這個功能:
# Python代碼
i = 3
y = [-2, 3, 4, 1]
result = 0
if i in y:
result = sum(y)
elif i > 0:
result = 1
else:
result = 0
print(result)
# 輸出為6
如上所示,括號中每一行的正確表示法指示了每條路徑應該執行的內容。我將額外的“包含”符號添加到每個條件中,以增加更多的洞察力。如前所述,我們檢查了i值是否在y列表中。認識到這一點後,我們返回了數組的和。如果i值不在數組中,我們將根據該值返回0或1。
每一行的表達式,都有唯一的條件來約束,符合條件才能執行對應的表達式。看看第三條語句,條件是y包含i,所以在用代碼實現時,我們用in來檢查i是否在y數組中。如果i不在y數組中,則i in y這條語句的值是false,否則是true。
看到這裡,哦?簡單?繼續看下面!
矩陣的點乘和叉乘
最後介紹一下數據科學家最常用最喜歡——矩陣的乘法。最容易理解的形式是點乘運算。每行每列對應的元素相乘:
注意兩個矩陣的行數相同、列數相同。
代碼這樣寫:
# Python代碼
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]]
最後看看典型的矩陣乘法過程----叉乘,在機器學習中最常用。第一個矩陣的每行的各元素,乘上第二個矩陣的每列的各元素,再把各個積相加,作為結果矩陣相應位置的元素。說起來很難懂,建議去看看動圖,就一目瞭然了。
代碼如下,使用numpy點方法:
# Python代碼
y = [[1, 2], [3, 4]]
z = [[2], [1]]
x = [[0], [0]]
for i in range(len(y[0])):sum = 0for j in range(len(z)):
x[i][0] += y[i][j] * z[j][0]
print(x)
# 輸出為[[4], [10]]
這只是幾個例子。當然,為了提高效率,可以組合使用這些方法,並且通常有一個現成的庫。但是對這些代碼的理解可以讓程序員更深刻得了解數學公式。