幹掉公式 —— numpy 就該這麼學

2021-02-13 Python技術

文 | 太陽雪

來源:Python 技術「ID: pythonall」

機器學習和數據分析變得越來越重要,但在學習和實踐過程中,常常因為不知道怎麼用程序實現各種數學公式而感到苦惱,今天我們從數學公式的角度上了解下,用 python 實現的方式方法。

友情提示:不要被公式嚇到,它們都是紙老虎

關於 Numpy

NumPy 是使用 Python 進行科學計算的基礎軟體包。除其他外,它包括:

機器學習和數據分析,numpy 是最常用的科學計算庫,可以用極簡的、符合思維習慣的方式完成代碼實現,為學習和實踐提供了很大的便利

環境準備

創建虛擬環境(可省略),安裝 numpy 包:

pip install numpy

測試安裝:

>>> import numpy
>>>

在下面實踐中,默認將 numpy 引用為 np:

import numpy as np
...

基礎運算

程式語言大多數運算都是針對簡單數值的,複雜運算是通過相應的數據結構結合程序邏輯計算的。numpy 雖然是針對複雜數據結構(例如矩陣)構造的,但它提供了和簡單數值計算一樣方便的操作。

冪運算

冪運算的運算符為 ** ,即兩個星號(一個星號表示乘),例如計算 x 的平方:x**2,x 的立方:x**3,等等

開方,相當於計算 1/2 次方,即 x**(1/2) 或者 x**0.5,因為常用 numpy 提供了便捷函數,sqrt,例如對數字 x 開平方,就是 np.sqrt(x).

實際上平方運算也有便捷方法:np.square

絕對值

絕對值表示一個數軸上的值距原點的距離,表示為 |x|,numpy 提供便捷方法abs 來計算,例如 np.abs(x),就為 x 的絕對值

理解向量和矩陣

線性代數是機器學習和數據分析的基礎數學之一,而向量和矩陣式又是線性代數的基礎概念,所以理解向量和矩陣非常重要。

向量

一般數據被分為標量和向量,標量比較容易理解,即數軸上的一個數值

向量直觀的認識是一組數值,可以理解為一維數組,但是為啥常見定義表示:具有方向的數值,方向指的是啥?這個問題困擾了我很多年(苦笑)。實際是因為在開始學習線性代數時,直接從公式定理開始,而沒有了解它的原理和來源。

向量的方向指的是,向量所在坐標系的原點指向該向量在坐標系中表示的點的方向,例如在平面直角坐標系中,向量 [1,2] 表示 x 軸為 1,y 軸為 2 的一個點,從原點,即 [0,0] 點指向這個點的方向,就是這個向量的方向,擴展的三維坐標系,再到 n 為坐標系(當然超過三位人類就比較難以理解了),向量元素的個數表示向量屬於幾維坐標系,但無論多少維,都可以畫出原點指向向量點的方向。

因為線性代數研究的是向量及向量組(矩陣)的純數學計算,所以丟棄了坐標系的概念,只保留了向量的樣子,所以造成了向量難以理解的現象。

簡單說,向量就是一個數值的數組。

矩陣

理解了向量,矩陣理解起來就容易了,相當於一組向量,即坐標系中的多個點的集合,矩陣運算,就相當於多個向量的運算或變換。

可能這裡比較繞或冗餘,先解釋到這裡,後面的文章中會進一步解釋向量和矩陣的實際意義

初始化

numpy 中,提供了多種產生向量和矩陣的方法,例如用 array 可以將 python 數組初始化為 numpy 矩陣:

m = np.array([(1,2,3),(2,3,4),(3,4,5)])

就可以創建一個 向量維度為 3,個數為 3 的矩陣

基本運算

numpy 特別擅長處理向量和矩陣的運算,例如乘法,即給向量中的每個數值乘以乘數,之間寫代碼的話,可以遍歷向量,為每個值乘以乘數。

用 numpy 就簡單很多:x * 2,就像做標量運算一樣,感覺向量同一個數值一樣。

矩陣冪運算

向量、矩陣既然可以看成一個數,冪運算就很容易理解了,例如矩陣

矩陣 m

m 平方就可以寫成 m**2, 結果為:

矩陣平方矩陣點積

不同維度的矩陣可以做乘法操作,但不是一般的乘法操作,操作被稱為點積,為了用 numpy 表示,需要用 dot 函數,例如矩陣 m 和 n

矩陣 m、n

代碼為 m.dot(n),就會得到如下結果:

矩陣點積
求和與連乘

統計學公式中,求和運算很常見,例如對矩陣求和:

矩陣求和

表示對矩陣 m 中所有元素進行求和,nunpy 通過 sum 完成計算: m.sum()

連乘和求和類似,將矩陣中所有元素做乘積運算:

矩陣連乘

numpy 通過 prod 完成計算,如矩陣 m 的連乘為 m.prod()

實踐

了解了上面的各種基礎運算後,做些實踐

計算均值

向量均值公式為:

向量均值公式

分析公式,其中 n 為向量 x 的元素數量,numpy 的向量,通過 size 獲取,後面是向量求和,用 sum 完成,最後代碼如下:

(1/x.size)*x.sum()

或者

x.sum()/x.size

實現 Frobenius 範數

現在來個複雜點的,Frobenius 範數,公式如下:

Frobenius 範數公式

先不用糾結 Frobenius 公式的意義,我們只看如何用 python 實現,分析公式,可以看到,首先對矩陣的每個元素做平方運算,然後求和,最後對結果進行開方,那麼就從裡向外寫

矩陣元素求和,根據前面所述,寫成 m**2,會得到新的矩陣,然後求和,直接可寫為:

np.sqrt((m**2).sum())

藉助 numpy 實現公式,極為簡潔。

樣本方差

我們再看一個公式:

樣本方差公式

其中表示向量 x 的均值,上面計算過,那麼套用起來就是:

np.sqrt(((x-(x.sum()/x.size))**2).sum()/(x.size-1))

基本依據上面了解的寫法可以理解和寫出,不過括號有點多,如果不參考公式,估計看不清實現的啥,好在 numpy 將均值運算通過 mean 方法簡化了,例如向量 x 的均值,可以寫為:np.mean(x),所以上面的代碼可以簡化為:

np.sqrt(((x-np.mean(x))**2).sum()/(x.size-1))

上面公式實際上是樣本標準差公式,對於標準差,numpy 提供了簡便方法 std, 直接用 np.std(x) 就可以計算,當然現在我們根據標準差公式:

標準差

很容易寫出來 numpy 實現,趕緊試試吧。

歐拉距離

前面寫模擬疫情擴散時,用到了歐拉距離,當時沒有理解好 numpy 公式表達能力,所以計算時分了三步,現在如果要計算兩個向量之間的歐拉距離,一行代碼就能搞定,先複習下歐拉距離公式,向量 a 與 向量 b 的歐拉距離為:

歐拉距離公式

numpy 實現為:

np.sqrt(((a-b)**2).sum())

由於歐拉距離應用廣泛,所以 numpy 在線性代數模塊中實現了,所以了解 numpy 實現數學公式的方法後,可以簡化為:

np.linalg.norm(a-b)

總結

numpy 是個博大精深的數學計算庫,是 python 實現科學計算的基礎,今天我們從數學公式的角度,了解了如何轉換為 numpy 的代碼實現,限於篇幅,雖然僅是 numpy 的冰山一角,但卻可以成為理解 numpy 運算原理的思路,在數據分析或者機器學習,或者論文寫作過程中,即使不了解 numpy 中簡潔的運算,也可以根據數學公式寫出代碼實現,進而通過實踐學習和了解 numpy 就更容易了

參考https://blog.csdn.net/garfielder007/article/details/51386683https://blog.csdn.net/robert_chen1988/article/details/102712946

PS:公號內回復「Python」即可進入Python 新手學習交流群,一起100天計劃!

老規矩,兄弟們還記得麼,右下角的 「在看」 點一下,如果感覺文章內容不錯的話,記得分享朋友圈讓更多的人知道!

代碼獲取方式

相關焦點

  • 從零開始學Python【4】--numpy
    該模塊主要有這幾個功能:數學領域的線性代數、傅立葉變換;統計學領域的統計計算、隨機數生成等。這裡我們就針對統計裡面的計算和隨機數生成作講解。使用numpy構建矩陣數組的創建可以使用numpy模塊中的array函數實現,一維數組只需要給array函數傳入一個列表或元組,二維數組則是傳入嵌套的列表或元組。具體舉例可知:arr1和arr2為一維數組,arr3為二維數組,返回一個數組的行數和列數可使用shape方法,即
  • 代碼詳解:Numpy——通往人工智慧的大門
    請看下面的示例,首先創建一個數組,然後使用append方法向該數組添加更多值:a = numpy.array([1, 2, 3])newArray = numpy.append (a, [10, 11, 12])添加列
  • 從零開始學Python數據分析【4】-- numpy
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • 手把手教你學numpy——轉置、reshape與where
    我們都知道,如果我們把一個矩陣各個維度的大小寫在一起,會得到一個元組(tuple),這個元組稱為矩陣的shape,我實在是不知道該怎麼翻譯這個單詞,但是我覺得叫做形狀不太妥當,所以就保留了英文原文。轉置之後,矩陣的shape會整個翻轉。比如(3, 2, 4)會變成(4, 2, 3)。
  • 圖解 Numpy,原來數據操作這麼簡單!
    import numpy as np創建數組我們可以通過傳遞一個 python 列表並使用 np.array()來創建 NumPy 數組(極大可能是多維數組)。在本例中,python 創建的數組如下圖右所示:
  • numpy產生隨機數匯總
    numpy.random.random_sample、numpy.random.ranf、numpy.random.sample用法與該函數類似。注意:該函數和rand()的區別:random()參數只有一個參數「size」,有三種取值,None,int型整數,或者int型元組。
  • 數據分析之Numpy入門
    對0、1、2軸進行索引,如果取o軸第2個元素、1軸第0個元素、2軸第3個元素,那麼索引形式就為[2,0,3]import numpy as np# 創建三維數組x3 = np.arange(24).reshape(3,2,4)# 對該三維數組進行索引x3[2,0,3]'''輸出:19
  • Python+numpy實現矩陣QR分解
    Python擴展庫numpy實現了矩陣QR分解的函數qr(),除本文演示的用法之外,該函數的mode參數還支持另外幾個值,可以通過help(numpy.linalg.qr)查看詳細信息並結合矩陣分析的有關知識進行理解。
  • Numpy 使用簡介
    source: https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial聲明:本篇推送的主要內容翻譯自:https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
  • Python的武器庫05:numpy模塊(下)
    如果要分析為什麼會存在這麼一句格言?python的語法並不簡單,有複雜難懂的部分,之所以有這樣一句格言,是因為python中有很多強大的模塊,就像一個武器庫。Python正式由於這些模塊的出現,只要引入這個模塊,調用這個模塊的集成函數,問題迎刃而解;不需要從頭開始,節省了大量的時間。
  • 數據系列教程之numpy( 三)
    數據分析系列教程之numpy( 一)數據分析系列教程之numpy(二)上周講了數據分析入門的前兩節,numpy
  • 最全的NumPy教程
    輸出數組的每個維度的大小是輸入數組該維度大小的最大值。如果輸入在每個維度中的大小與輸出大小匹配,或其值正好為 1,則在計算中可它。如果輸入的某個維度大小為 1,則該維度中的第一個數據元素將用於該維度的所有計算。如果上述規則產生有效結果,並且滿足以下條件之一,那麼數組被稱為可廣播的。
  • numpy學得還不錯?來試試這20題(下)
    作者:劉早起來源:早起Python大家好,這篇是接上篇《numpy學得還不錯?來試試這20題(上)》,又到了numpy進階修煉專題。numpy大家應該不陌生了,看了太多的原理講解之後,用刷題來學習是最有效的方法,本文將將接下來的10個NumPy經典問題和實用代碼附上,建議打開Jupyter Notebook邊敲邊看!
  • Numpy學習打卡task03
    拒絕或反駁零假設是使用統計測試完成的,該測試量化了在給定測試中使用的數據的情況下可以證明零假設為假的意義。從零假設出發,可以識別兩種基本形式的錯誤:類型I錯誤(錯誤假設否定了零假設,給出了「假陽性」)和類型II錯誤(錯誤假設未被拒絕且未考慮總體之間的實際關係)一個「假陰性」)。與該框架相關的問題很多:從獲得足夠的樣本量到指定充分的零假設。生成統計數據的測量過程也會出錯。
  • Numpy高級操作大全!!!
    該函數屬於ndarray類,行為類似於numpy.transpose.如果新形狀不符合 NumPy 的廣播規則,該函數可能會拋出ValueError。該函數接受以下參數。– numpy.concatenate((a1, a2, …), axis)– 其中:• a1, a2, ...
  • NumPy 1.20.0 版本發布,支持Python 3.7+
    例如,現在可以對一個二維數組的行或列進行換算;(2)sliding_window_view 為 numpy 數組提供了一個滑動窗口視圖。numpy.lib.stride_tricks.sliding_window_view 在 numpy 數組上構造視圖,提供對數組的滑動或移動窗口訪問。這使得 running means 等某些算法可以簡單實現。
  • Python冬令營-Numpy 使用簡介
    source: https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial聲明:本篇推送的主要內容翻譯自:https://realpython.com/numpy-tutorial/#hello-numpy-curving-test-grades-tutorial
  • 為什麼要學Numpy,一文總結知識點
    :返回排序後數組的拷貝array.sort:原地排序數組而不是返回拷貝numpy.argsort:間接排序,返回的是排序後的數字索引數據統計np.sum:所有元素的和np.prod:所有元素的乘積np.cumsum:元素的累積加和np.cumprod:元素的累積乘積np.min:最小值np.max:最大值np.percentile:0-100百分位數np.quantile:0-1分位數np.median
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    作者按照這本書的第二章的線性代數內容來逐一介紹機器學習中的線性代數基礎,讀者可以在原書、中譯版或中文筆記中查看每個小節的基礎介紹,或直接參考該博客的推導部分。作者除了對部分概念進行詳細推導之外,還添加了多個示例,並給出了 python/numpy 的實現代碼。
  • Python擴展庫numpy中where()函數的三種用法
    第二種用法:給where()函數傳遞一個包含True/False值的數組,返回該數組中True值的下標,結合numpy數組的關係運算,可以返回數組中符合特定條件的元素的下標。spm=a1z10.3-b-s.w4011-16232114860.18.24a52226hIi8Bj&id=534581929248&rn=9311dcbc68fffcf57b7ae352800e485d&abbucket=62)《Python可以這樣學》(2018年2月第5次印刷)(本書已發行繁體版)