<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干掉公式 —— numpy 就該這么學(xué)

          共 3790字,需瀏覽 8分鐘

           ·

          2021-05-11 19:53

          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

          請(qǐng)留盤石上,垂釣將已矣。


          文 | 太陽雪

          來源:Python 技術(shù)「ID: pythonall」

          機(jī)器學(xué)習(xí)和數(shù)據(jù)分析變得越來越重要,但在學(xué)習(xí)和實(shí)踐過程中,常常因?yàn)椴恢涝趺从贸绦驅(qū)崿F(xiàn)各種數(shù)學(xué)公式而感到苦惱,今天我們從數(shù)學(xué)公式的角度上了解下,用 python 實(shí)現(xiàn)的方式方法。

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

          關(guān)于 Numpy

          NumPy 是使用 Python 進(jìn)行科學(xué)計(jì)算的基礎(chǔ)軟件包。除其他外,它包括:

          • 功能強(qiáng)大的N維數(shù)組對(duì)象
          • 精密廣播功能函數(shù)
          • 集成 C/C+和Fortran 代碼的工具
          • 強(qiáng)大的線性代數(shù)、傅立葉變換和隨機(jī)數(shù)功能

          機(jī)器學(xué)習(xí)和數(shù)據(jù)分析,numpy 是最常用的科學(xué)計(jì)算庫,可以用極簡(jiǎn)的、符合思維習(xí)慣的方式完成代碼實(shí)現(xiàn),為學(xué)習(xí)和實(shí)踐提供了很大的便利

          環(huán)境準(zhǔn)備

          創(chuàng)建虛擬環(huán)境(可省略),安裝 numpy 包:

          pip install numpy

          測(cè)試安裝:

          >>> import numpy
          >>>

          在下面實(shí)踐中,默認(rèn)將 numpy 引用為 np:

          import numpy as np
          ...

          基礎(chǔ)運(yùn)算

          編程語言大多數(shù)運(yùn)算都是針對(duì)簡(jiǎn)單數(shù)值的,復(fù)雜運(yùn)算是通過相應(yīng)的數(shù)據(jù)結(jié)構(gòu)結(jié)合程序邏輯計(jì)算的。numpy 雖然是針對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)(例如矩陣)構(gòu)造的,但它提供了和簡(jiǎn)單數(shù)值計(jì)算一樣方便的操作。

          冪運(yùn)算

          冪運(yùn)算的運(yùn)算符為 ** ,即兩個(gè)星號(hào)(一個(gè)星號(hào)表示乘),例如計(jì)算 x 的平方:x**2,x 的立方:x**3,等等

          開方,相當(dāng)于計(jì)算 1/2 次方,即 x**(1/2) 或者 x**0.5,因?yàn)槌S?numpy 提供了便捷函數(shù),sqrt,例如對(duì)數(shù)字 x 開平方,就是 np.sqrt(x).

          實(shí)際上平方運(yùn)算也有便捷方法:np.square

          絕對(duì)值

          絕對(duì)值表示一個(gè)數(shù)軸上的值距原點(diǎn)的距離,表示為 |x|,numpy 提供便捷方法abs 來計(jì)算,例如 np.abs(x),就為 x 的絕對(duì)值

          理解向量和矩陣

          線性代數(shù)是機(jī)器學(xué)習(xí)和數(shù)據(jù)分析的基礎(chǔ)數(shù)學(xué)之一,而向量和矩陣式又是線性代數(shù)的基礎(chǔ)概念,所以理解向量和矩陣非常重要。

          向量

          一般數(shù)據(jù)被分為標(biāo)量和向量,標(biāo)量比較容易理解,即數(shù)軸上的一個(gè)數(shù)值

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

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

          因?yàn)榫€性代數(shù)研究的是向量及向量組(矩陣)的純數(shù)學(xué)計(jì)算,所以丟棄了坐標(biāo)系的概念,只保留了向量的樣子,所以造成了向量難以理解的現(xiàn)象。

          簡(jiǎn)單說,向量就是一個(gè)數(shù)值的數(shù)組。

          矩陣

          理解了向量,矩陣?yán)斫馄饋砭腿菀琢耍喈?dāng)于一組向量,即坐標(biāo)系中的多個(gè)點(diǎn)的集合,矩陣運(yùn)算,就相當(dāng)于多個(gè)向量的運(yùn)算或變換。

          可能這里比較繞或冗余,先解釋到這里,后面的文章中會(huì)進(jìn)一步解釋向量和矩陣的實(shí)際意義

          初始化

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

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

          就可以創(chuàng)建一個(gè) 向量維度為 3,個(gè)數(shù)為 3 的矩陣

          基本運(yùn)算

          numpy 特別擅長(zhǎng)處理向量和矩陣的運(yùn)算,例如乘法,即給向量中的每個(gè)數(shù)值乘以乘數(shù),之間寫代碼的話,可以遍歷向量,為每個(gè)值乘以乘數(shù)。

          用 numpy 就簡(jiǎn)單很多:x * 2,就像做標(biāo)量運(yùn)算一樣,感覺向量同一個(gè)數(shù)值一樣。

          • 加法 x+2
          • 減法 x-2
          • 處罰 x/2

          矩陣冪運(yùn)算

          向量、矩陣既然可以看成一個(gè)數(shù),冪運(yùn)算就很容易理解了,例如矩陣

          矩陣 m

          m 平方就可以寫成 m**2, 結(jié)果為:

          矩陣平方

          矩陣點(diǎn)積

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

          矩陣 m、n

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

          矩陣點(diǎn)積

          求和與連乘

          統(tǒng)計(jì)學(xué)公式中,求和運(yùn)算很常見,例如對(duì)矩陣求和:

          矩陣求和

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

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

          矩陣連乘

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

          實(shí)踐

          了解了上面的各種基礎(chǔ)運(yùn)算后,做些實(shí)踐

          計(jì)算均值

          向量均值公式為:

          向量均值公式

          分析公式,其中 n 為向量 x 的元素?cái)?shù)量,numpy 的向量,通過 size 獲取,后面是向量求和,用 sum 完成,最后代碼如下:

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

          或者

          x.sum()/x.size

          實(shí)現(xiàn) Frobenius 范數(shù)

          現(xiàn)在來個(gè)復(fù)雜點(diǎn)的,F(xiàn)robenius 范數(shù),公式如下:

          Frobenius 范數(shù)公式

          先不用糾結(jié) Frobenius 公式的意義,我們只看如何用 python 實(shí)現(xiàn),分析公式,可以看到,首先對(duì)矩陣的每個(gè)元素做平方運(yùn)算,然后求和,最后對(duì)結(jié)果進(jìn)行開方,那么就從里向外寫

          矩陣元素求和,根據(jù)前面所述,寫成 m**2,會(huì)得到新的矩陣,然后求和,直接可寫為:

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

          借助 numpy 實(shí)現(xiàn)公式,極為簡(jiǎn)潔。

          樣本方差

          我們看一個(gè)公式:

          樣本方差公式

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

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

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

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

          上面公式實(shí)際上是樣本標(biāo)準(zhǔn)差公式,對(duì)于標(biāo)準(zhǔn)差,numpy 提供了簡(jiǎn)便方法 std, 直接用 np.std(x) 就可以計(jì)算,當(dāng)然現(xiàn)在我們根據(jù)標(biāo)準(zhǔn)差公式:

          標(biāo)準(zhǔn)差

          很容易寫出來 numpy 實(shí)現(xiàn),趕緊試試吧。

          歐拉距離

          前面寫模擬疫情擴(kuò)散時(shí),用到了歐拉距離,當(dāng)時(shí)沒有理解好 numpy 公式表達(dá)能力,所以計(jì)算時(shí)分了三步,現(xiàn)在如果要計(jì)算兩個(gè)向量之間的歐拉距離,一行代碼就能搞定,先復(fù)習(xí)下歐拉距離公式,向量 a 與 向量 b 的歐拉距離為:

          歐拉距離公式

          numpy 實(shí)現(xiàn)為:

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

          由于歐拉距離應(yīng)用廣泛,所以 numpy 在線性代數(shù)模塊中實(shí)現(xiàn)了,所以了解 numpy 實(shí)現(xiàn)數(shù)學(xué)公式的方法后,可以簡(jiǎn)化為:

          np.linalg.norm(a-b)

          總結(jié)

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

          參考

          • https://blog.csdn.net/garfielder007/article/details/51386683
          • https://blog.csdn.net/robert_chen1988/article/details/102712946
          • https://mathtocode.com/

            ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 48
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产操逼视频豆花 | 逼特逼在线视频 | 国产福利视频在线播放 | 尤物视频高清无码在线观看 | 操无码视频 |