<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,這是理解數(shù)組最形象的一份教程了

          共 3639字,需瀏覽 8分鐘

           ·

          2020-08-23 08:04



          大家好,在Python數(shù)據(jù)分析領(lǐng)域,Numpy 這個(gè)庫是少不了的,可是對(duì)于一些矩陣的操作,理解起來太抽象了。最近看到一篇文章,它以可視化的形式呈現(xiàn)了 Numpy 中矩陣操作的一些原理,推薦給大家一看。


          轉(zhuǎn)載來源

          公眾號(hào):機(jī)器之心

          選自:Jay Alammar Blog

          閱讀本文大概需要 9 分鐘。


          本文用可視化的方式介紹了 NumPy 的功能和使用示例。


          NumPy 軟件包是 Python 生態(tài)系統(tǒng)中數(shù)據(jù)分析、機(jī)器學(xué)習(xí)和科學(xué)計(jì)算的主力軍。它極大地簡(jiǎn)化了向量和矩陣的操作處理。Python 的一些主要軟件包(如 scikit-learn、SciPy、pandas 和 tensorflow)都以 NumPy 作為其架構(gòu)的基礎(chǔ)部分。除了能對(duì)數(shù)值數(shù)據(jù)進(jìn)行切片(slice)和切塊(dice)之外,使用 NumPy 還能為處理和調(diào)試上述庫中的高級(jí)實(shí)例帶來極大便利。


          本文將介紹使用 NumPy 的一些主要方法,以及在將數(shù)據(jù)送入機(jī)器學(xué)習(xí)模型之前,它如何表示不同類型的數(shù)據(jù)(表格、圖像、文本等)。


          import?numpy?as?np


          創(chuàng)建數(shù)組


          我們可以通過傳遞一個(gè) python 列表并使用 np.array()來創(chuàng)建 NumPy 數(shù)組(極大可能是多維數(shù)組)。在本例中,python 創(chuàng)建的數(shù)組如下圖右所示:



          通常我們希望 NumPy 能初始化數(shù)組的值,為此 NumPy 提供了 ones()、zeros() 和 random.random() 等方法。我們只需傳遞希望 NumPy 生成的元素?cái)?shù)量即可:



          一旦創(chuàng)建了數(shù)組,我們就可以盡情對(duì)它們進(jìn)行操作。


          數(shù)組運(yùn)算


          讓我們創(chuàng)建兩個(gè) NumPy 數(shù)組來展示數(shù)組運(yùn)算功能。我們將下圖兩個(gè)數(shù)組稱為 data 和 ones:



          將它們按位置相加(即每行對(duì)應(yīng)相加),直接輸入 data + ones 即可:



          當(dāng)我開始學(xué)習(xí)這些工具時(shí),我發(fā)現(xiàn)這樣的抽象讓我不必在循環(huán)中編寫類似計(jì)算。此類抽象可以使我在更高層面上思考問題。


          除了「加」,我們還可以進(jìn)行如下操作:



          通常情況下,我們希望數(shù)組和單個(gè)數(shù)字之間也可以進(jìn)行運(yùn)算操作(即向量和標(biāo)量之間的運(yùn)算)。比如說,我們的數(shù)組表示以英里為單位的距離,我們希望將其單位轉(zhuǎn)換為千米。只需輸入 data * 1.6 即可:



          看到 NumPy 是如何理解這個(gè)運(yùn)算的了嗎?這個(gè)概念叫做廣播機(jī)制(broadcasting),它非常有用。


          索引


          我們可以我們像對(duì) python 列表進(jìn)行切片一樣,對(duì) NumPy 數(shù)組進(jìn)行任意的索引和切片:



          聚合


          NumPy 還提供聚合功能:



          除了 min、max 和 sum 之外,你還可以使用 mean 得到平均值,使用 prod 得到所有元素的乘積,使用 std 得到標(biāo)準(zhǔn)差等等。


          更多維度


          上述的例子都在一個(gè)維度上處理向量。NumPy 之美的關(guān)鍵在于,它能夠?qū)⑸鲜鏊蟹椒☉?yīng)用到任意數(shù)量的維度。


          創(chuàng)建矩陣


          我們可以傳遞下列形狀的 python 列表,使 NumPy 創(chuàng)建一個(gè)矩陣來表示它:


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


          我們也可以使用上面提到的方法(ones()、zeros() 和 random.random()),只要寫入一個(gè)描述我們創(chuàng)建的矩陣維數(shù)的元組即可:



          矩陣運(yùn)算


          如果兩個(gè)矩陣大小相同,我們可以使用算術(shù)運(yùn)算符(+-*/)對(duì)矩陣進(jìn)行加和乘。NumPy 將它們視為 position-wise 運(yùn)算:



          我們也可以對(duì)不同大小的兩個(gè)矩陣執(zhí)行此類算術(shù)運(yùn)算,但前提是某一個(gè)維度為 1(如矩陣只有一列或一行),在這種情況下,NumPy 使用廣播規(guī)則執(zhí)行算術(shù)運(yùn)算:


          點(diǎn)乘


          算術(shù)運(yùn)算和矩陣運(yùn)算的一個(gè)關(guān)鍵區(qū)別是矩陣乘法使用點(diǎn)乘。NumPy 為每個(gè)矩陣賦予 dot() 方法,我們可以用它與其他矩陣執(zhí)行點(diǎn)乘操作:



          我在上圖的右下角添加了矩陣維數(shù),來強(qiáng)調(diào)這兩個(gè)矩陣的臨近邊必須有相同的維數(shù)。你可以把上述運(yùn)算視為:



          矩陣索引


          當(dāng)我們處理矩陣時(shí),索引和切片操作變得更加有用:



          矩陣聚合


          我們可以像聚合向量一樣聚合矩陣:



          我們不僅可以聚合矩陣中的所有值,還可以使用 axis 參數(shù)執(zhí)行跨行或跨列聚合:



          轉(zhuǎn)置和重塑


          處理矩陣時(shí)的一個(gè)常見需求是旋轉(zhuǎn)矩陣。當(dāng)需要對(duì)兩個(gè)矩陣執(zhí)行點(diǎn)乘運(yùn)算并對(duì)齊它們共享的維度時(shí),通常需要進(jìn)行轉(zhuǎn)置。NumPy 數(shù)組有一個(gè)方便的方法 T 來求得矩陣轉(zhuǎn)置:



          在更高級(jí)的實(shí)例中,你可能需要變換特定矩陣的維度。在機(jī)器學(xué)習(xí)應(yīng)用中,經(jīng)常會(huì)這樣:某個(gè)模型對(duì)輸入形狀的要求與你的數(shù)據(jù)集不同。在這些情況下,NumPy 的 reshape() 方法就可以發(fā)揮作用了。只需將矩陣所需的新維度賦值給它即可。可以為維度賦值-1,NumPy 可以根據(jù)你的矩陣推斷出正確的維度:



          再多維度


          NumPy 可以在任意維度實(shí)現(xiàn)上述提到的所有內(nèi)容。其中心數(shù)據(jù)結(jié)構(gòu)被叫作 ndarray(N 維數(shù)組)不是沒道理的。



          在很多情況下,處理一個(gè)新的維度只需在 NumPy 函數(shù)的參數(shù)中添加一個(gè)逗號(hào):



          實(shí)際用法


          以下是 NumPy 可實(shí)現(xiàn)的有用功能的實(shí)例演示。


          公式


          實(shí)現(xiàn)可用于矩陣和向量的數(shù)學(xué)公式是 NumPy 的關(guān)鍵用例。這就是 NumPy 是 python 社區(qū)寵兒的原因。例如均方差公式,它是監(jiān)督機(jī)器學(xué)習(xí)模型處理回歸問題的核心:



          在 NumPy 中實(shí)現(xiàn)該公式很容易:



          這樣做的好處在于,NumPy 并不關(guān)心 predictions 和 labels 包含一個(gè)值還是一千個(gè)值(只要它們大小相同)。我們可以通過一個(gè)示例依次執(zhí)行上面代碼行中的四個(gè)操作:



          預(yù)測(cè)和標(biāo)簽向量都包含三個(gè)值,也就是說 n 的值為 3。減法后,得到的值如下:



          然后將向量平方得到:



          現(xiàn)在對(duì)這些值求和:



          得到的結(jié)果即為該預(yù)測(cè)的誤差值和模型質(zhì)量評(píng)分。


          數(shù)據(jù)表示


          考慮所有需要處理和構(gòu)建模型所需的數(shù)據(jù)類型(電子表格、圖像、音頻等),其中很多都適合在 n 維數(shù)組中表示:


          表格和電子表格


          電子表格或值表是二維矩陣。電子表格中的每個(gè)工作表都可以是它自己的變量。python 中最流行的抽象是 pandas 數(shù)據(jù)幀,它實(shí)際上使用了 NumPy 并在其之上構(gòu)建。



          音頻和時(shí)間序列


          音頻文件是樣本的一維數(shù)組。每個(gè)樣本都是一個(gè)數(shù)字,代表音頻信號(hào)的一小部分。CD 質(zhì)量的音頻每秒包含 44,100 個(gè)樣本,每個(gè)樣本是-65535 到 65536 之間的整數(shù)。這意味著如果你有一個(gè) 10 秒的 CD 質(zhì)量 WAVE 文件,你可以將它加載到長(zhǎng)度為 10 * 44,100 = 441,000 的 NumPy 數(shù)組中。如果想要提取音頻的第一秒,只需將文件加載到 audio 的 NumPy 數(shù)組中,然后獲取 audio[:44100]。


          以下是一段音頻文件:



          時(shí)間序列數(shù)據(jù)也是如此(如股票價(jià)格隨時(shí)間變化)。


          圖像


          圖像是尺寸(高度 x 寬度)的像素矩陣。


          如果圖像是黑白(即灰度)的,則每個(gè)像素都可以用單個(gè)數(shù)字表示(通常在 0(黑色)和 255(白色)之間)。想要裁剪圖像左上角 10 x 10 的像素嗎?在 NumPy 寫入

          即可。


          下圖是一個(gè)圖像文件的片段:



          如果圖像是彩色的,則每個(gè)像素由三個(gè)數(shù)字表示——紅色、綠色和藍(lán)色。在這種情況下,我們需要一個(gè)三維數(shù)組(因?yàn)槊總€(gè)單元格只能包含一個(gè)數(shù)字)。因此彩色圖像由尺寸為(高 x 寬 x3)的 ndarray 表示:



          語言


          如果我們處理文本,情況就不同了。文本的數(shù)字表示需要一個(gè)構(gòu)建詞匯表的步驟(模型知道的唯一字清單)和嵌入步驟。讓我們看看用數(shù)字表示以下文字的步驟:


          模型需要先查看大量文本,再用數(shù)字表示這位詩人的話語。我們可以讓它處理一個(gè)小數(shù)據(jù)集,并用它來構(gòu)建一個(gè)詞匯表(71,290 個(gè)單詞):



          這個(gè)句子可以被分成一個(gè) token 數(shù)組(基于通用規(guī)則的單詞或單詞的一部分):



          然后我們用詞匯表中的 ID 替換每個(gè)單詞:



          這些 ID 仍然沒有為模型提供太多信息價(jià)值。因此,在將這一組單詞輸入到模型之前,我們需要用嵌入替換 token/單詞(在本例中為 50 維 word2vec 嵌入):



          可以看到,該 NumPy 數(shù)組的維度為 [embedding_dimension x sequence_length]。出于性能原因,深度學(xué)習(xí)模型傾向于保留批大小的第一維(因?yàn)槿绻⑿杏?xùn)練多個(gè)示例,模型訓(xùn)練速度會(huì)加快)。在這種情況下,reshape() 變得非常有用。如像 BERT 這樣的模型期望的輸入形式是:[batch_size,sequence_length,embedding_size]。



          現(xiàn)在這是 numeric volume 形式,模型可以處理并執(zhí)行相應(yīng)操作。其他行雖然留空,但是它們會(huì)被填充其他示例以供模型訓(xùn)練(或預(yù)測(cè))。

          原文鏈接:https://jalammar.github.io/visual-numpy/




          瀏覽 24
          點(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>
                  国产一区在线播放 | 亚洲 欧美 乱伦 | 欧美日韩在线观看成人 | 天堂伊人 | 人人插人人摸 |