tft每日頭條

 > 生活

 > numpy 計算的函數

numpy 計算的函數

生活 更新时间:2025-01-24 09:31:05

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

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

關于 Numpy

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

  • 功能強大的N維數組對象
  • 精密廣播功能函數
  • 集成 C/C 和Fortran 代碼的工具
  • 強大的線性代數、傅立葉變換和随機數功能

機器學習和數據分析,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 ,就像做标量運算一樣,感覺向量同一個數值一樣。

x 2 x-2 x/2

矩陣幂運算

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

numpy 計算的函數(幹掉公式numpy)1

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

numpy 計算的函數(幹掉公式numpy)2

矩陣點積

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

numpy 計算的函數(幹掉公式numpy)3

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

numpy 計算的函數(幹掉公式numpy)4

求和與連乘

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

numpy 計算的函數(幹掉公式numpy)5

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

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

numpy 計算的函數(幹掉公式numpy)6

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

實踐

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

計算均值

向量均值公式為:

numpy 計算的函數(幹掉公式numpy)7

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

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

或者

x.sum()/x.size

實現 Frobenius 範數

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

numpy 計算的函數(幹掉公式numpy)8

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

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

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

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

樣本方差

我們在看一個公式:

numpy 計算的函數(幹掉公式numpy)9

其中

numpy 計算的函數(幹掉公式numpy)10

表示向量 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)11

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

歐拉距離

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

numpy 計算的函數(幹掉公式numpy)12

numpy 實現為:

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

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

np.linalg.norm(a-b)

總結

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

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved