熟悉數(shù)據(jù)科學(xué)的人都很喜歡NumPy庫,它是時(shí)下最流行的Python系數(shù)據(jù)科學(xué)的中流砥柱,是Python科學(xué)計(jì)算、數(shù)據(jù)分析以及AI 機(jī)器學(xué)習(xí)的基礎(chǔ)組件。在最流行的三大數(shù)據(jù)處理?xiàng)、Matlab和Python中,NumPy是最重要的組件之一,有很多Python系的數(shù)據(jù)處理系統(tǒng)都依賴NumPy作為其基礎(chǔ)架構(gòu)的基礎(chǔ)部分,比如tensorflow、pandas、SciPy和scikit-learn等。
NumPy極大地簡化了向量和矩陣的操作和處理。本文中蟲蟲將一圖像可視化方式介紹NumPy的主要方法,以及在ML數(shù)據(jù)模型中的數(shù)據(jù)表示,圖文并茂的方式系統(tǒng)對大家的學(xué)習(xí)有所幫助。
數(shù)組
創(chuàng)建數(shù)組
數(shù)組的創(chuàng)建通常是通過使用np.array(),并將列表傳遞給它。如下圖:
在創(chuàng)建時(shí)候NumPy也提供了很多方法幫我們初始化數(shù)組,這些方法包括:ones(),zeros()和random.random()。其參數(shù)為要生成的元素個(gè)數(shù):
數(shù)組計(jì)算
做為例子我們首先創(chuàng)建兩個(gè)數(shù)組data和one:
最其做加法運(yùn)算,其實(shí)很簡單就是對應(yīng)位置元素互相想加。
NumPy在處理這些計(jì)算時(shí)候,簡單就想正常數(shù)學(xué)計(jì)算一樣,不像其他語言中那樣復(fù)雜的處理方式(比如做計(jì)算符號重載)。從而可以讓我們專注于數(shù)學(xué)計(jì)算而不是怎么用循環(huán)表示。更多計(jì)算:
實(shí)際中,也有數(shù)組和單個(gè)數(shù)字之間執(zhí)行計(jì)算(也稱為向量和標(biāo)量之間的計(jì)算)。比如,我們的數(shù)組表示以英里為單位的距離,我們希望將其轉(zhuǎn)換為公里數(shù)。我們可以簡單使用data *1.6:
NumPy對每個(gè)元素都會(huì)做了乘法計(jì)算。這個(gè)又叫做廣播,一個(gè)非常有用的概念。
索引
我們可以通過各種方式列表切片方式來表示NumPy數(shù)組部分和對其索引:
聚合計(jì)算
NumPy也支持各種聚合函數(shù):
除了最小值,最大值和總和之外,還支持很多其他統(tǒng)計(jì)函數(shù)你,比如平均值mean,所有元素相乘的累乘prod,標(biāo)準(zhǔn)差std,及其他。
多維度
截止當(dāng)前,我們所有例子都是在一個(gè)維度上處理向量。 NumPy強(qiáng)大之處的關(guān)鍵是它能夠?qū)⑺蟹椒ǘ紤?yīng)用到任意數(shù)量的維度。
創(chuàng)建矩陣
我們可以給array函數(shù)傳遞如下python列表參數(shù),NumPy就會(huì)創(chuàng)建一個(gè)矩陣:
np.array([[1,2],[3,4]])
也可以使用上面提到的相同方法(ones(),zeros()和random.random()),只要我們給它們一個(gè)元組來表示正在創(chuàng)建的矩陣的維度:
矩陣計(jì)算
如果兩個(gè)矩陣的大小相同,我們可以使用算術(shù)運(yùn)算符(+ - * /)來對矩陣計(jì)算。 NumPy將這些作為位置操作處理:
只有當(dāng)不同維度為1時(shí)(例如矩陣只有一列或一行),我們才能在不同大小的矩陣上進(jìn)行這些算術(shù)運(yùn)算,在這種情況下,NumPy將其廣播規(guī)則用于該操作:
點(diǎn)計(jì)算
與算術(shù)相關(guān)的一個(gè)關(guān)鍵區(qū)別是使用點(diǎn)積的矩陣乘法。 NumPy為每個(gè)矩陣提供了一個(gè)dot()方法,我們可以用它來執(zhí)行與其他矩陣的點(diǎn)積運(yùn)算:
這個(gè)圖的底部添加了矩陣尺寸,以強(qiáng)調(diào)兩個(gè)矩陣在它們彼此面對的一側(cè)必須具有相同的尺寸。可以將此操作可視化為如下所示:
矩陣索引
當(dāng)我們操作矩陣時(shí),索引和切片操作會(huì)變得更加有用:
矩陣聚合
我們可以像聚合數(shù)組一樣聚合矩陣:
我們不僅可以聚合矩陣中的所有值,還可以使用axis參數(shù)對行或列進(jìn)行聚合:
轉(zhuǎn)置和重塑
處理矩陣時(shí)的一個(gè)共同需求是需要旋轉(zhuǎn)矩陣。當(dāng)我們需要采用兩個(gè)矩陣的點(diǎn)積并??需要對齊它們共享的維度時(shí),通常就是這種情況。 NumPy數(shù)組有一個(gè)方便的屬性叫做T來獲得矩陣的轉(zhuǎn)置:
在更高級的用例中,可能需要切換某個(gè)矩陣的維度。在機(jī)器學(xué)習(xí)應(yīng)用程序中通常會(huì)有這種情況,其中某個(gè)模型期望輸入的某個(gè)維度與數(shù)據(jù)集不同。在這些情況下,NumPy的reshape()方法很有用。只需將矩陣所需的新尺寸傳遞給它即可,可以為維度傳遞-1,NumPy可以根據(jù)已有矩陣推斷出正確的維度:
更多維度
NumPy可以完成我們在任何維度上提到的所有內(nèi)容。其中心數(shù)據(jù)結(jié)構(gòu)稱為ndarray(N維數(shù)組)。
在很多時(shí)候,處理新維度只是在NumPy函數(shù)的參數(shù)中添加逗號:
實(shí)際用法——數(shù)據(jù)表示方法
最后來干貨,我們來舉一些NumPy能幫助你完成的有用示例包括公式和數(shù)據(jù)表示:
公式
實(shí)現(xiàn)適用于矩陣和向量的數(shù)學(xué)公式是考慮NumPy的關(guān)鍵用例。這就是NumPy是科學(xué)Python社區(qū)的寵兒主要原因。例如,考慮平均誤差公式,它是監(jiān)督機(jī)器學(xué)習(xí)模型處理回歸問題的核心:
在NumPy中實(shí)現(xiàn)它是輕而易舉的:
這樣做的好處是,numpy并不會(huì)關(guān)心預(yù)測和標(biāo)簽是否包含一個(gè)或一千個(gè)值(只要它們的大小相同)??梢酝ㄟ^一個(gè)示例逐步執(zhí)行該代碼行中的四個(gè)操作:
預(yù)測和標(biāo)簽向量都包含三個(gè)值。這意味著n的值為3。執(zhí)行減法后,最終得到如下值:
然后就可以對矢量中的值進(jìn)行平方
最后:
數(shù)據(jù)表示
試想我們需要緊縮和構(gòu)建模型所需的所有數(shù)據(jù)類型(電子表格,圖像,音頻......等)。其中很多都非常適合在n維數(shù)組中表示:
表格和電子表格
電子表格或值表是二維矩陣。電子表格中的每個(gè)工作表都可以是自己的變量。 Python中最受歡迎的抽象是pandas數(shù)據(jù)幀,它實(shí)際上使用NumPy并在其上構(gòu)建。
音頻和時(shí)間序列
音頻文件是一維樣本數(shù)組。每個(gè)樣本都是一個(gè)代表音頻信號的一小部分的數(shù)字。 CD質(zhì)量的音頻每秒可能有44,100個(gè)樣本,每個(gè)樣本是-65535到65536之間的整數(shù)。這意味著如果你有一個(gè)10秒的CD質(zhì)量的WAVE文件,你可以將它加載到長度為10 * 44,100的NumPy數(shù)組中= 441,000個(gè)樣本。想要提取音頻的第一秒?只需將文件加載到音頻的NumPy數(shù)組中,然后獲取音頻[:44100]。
以下是一段音頻文件:
時(shí)間序列數(shù)據(jù)也是如此(例如,股票價(jià)格隨時(shí)間變化)。
圖片
圖像是大?。ǜ選寬)像素的矩陣。
如果圖像是黑白的(a.k.a.灰度),則每個(gè)像素可以用單個(gè)數(shù)字表示(通常在0(黑色)和255(白色)之間)。想要裁剪圖像的左上角10 x 10像素部分?告訴NumPy通過image[:10,:10]。
下面一個(gè)圖像文件的片段:
如果圖像是彩色的,則每個(gè)像素由三個(gè)數(shù)字表示:紅色,綠色和藍(lán)色各自的值。在這種情況下,我們需要第三維(因?yàn)槊總€(gè)單元格只能包含一個(gè)數(shù)字)。因此彩色圖像由尺寸的ndarray表示:(高x寬x 3)。
自然語言
如果我們處理文本,數(shù)據(jù)就會(huì)有所不同。文本的數(shù)字表示需要一個(gè)構(gòu)建詞匯表的步驟(模型知道的所有唯一單詞的清單)和嵌入步驟。讓我們看看用古代用數(shù)字表示這個(gè)引用的步驟:
我們可以繼續(xù)處理一個(gè)小數(shù)據(jù)集并使用它來構(gòu)建一個(gè)詞匯表(71,290個(gè)單詞):
然后可以將句子分成一系列標(biāo)記(基于通用規(guī)則的單詞或單詞部分):
然后我們用詞匯表中的id替換每個(gè)單詞:
這些ID仍然不能為模型提供太多信息價(jià)值。因此,在將一系列單詞提供給模型之前,需要使用嵌入來替換標(biāo)記/單詞(比如:50維word2vec嵌入):
以看到此NumPy數(shù)組的維度為[embedding_dimension x sequence_length]。在實(shí)踐中,這些將是另一種方式,但我以這種方式呈現(xiàn)它的視覺一致性。出于性能原因,深度學(xué)習(xí)模型傾向于保留批量大小的第一維(因?yàn)槿绻⑿杏?xùn)練多個(gè)示例,則可以更快地訓(xùn)練模型)。這是一個(gè)明顯的情況,reshape()變得非常有用。例如,像BERT這樣的模型會(huì)期望其輸入形狀為:[batch_size,sequence_length,embedding_size]。
現(xiàn)在這是一個(gè)數(shù)字卷,模型可以處理并執(zhí)行有用的操作。其他行被留空了,但是他們會(huì)填充其他示例以供模型訓(xùn)練(或預(yù)測)。
轉(zhuǎn)載
https://www.toutiao.com/a6707983457248608771/
感謝原創(chuàng) 蟲蟲安全 2019-06-30 00:01:46