Python: Vektory, matice a polia s NumPy

Python Vectors Matrices



V tejto lekcii sa pozrieme na niekoľko pekných tipov a trikov na hranie s vektormi, maticami a poľami pomocou knižnice NumPy v Pythone. Táto lekcia je veľmi dobrým východiskovým bodom, ak začínate s dátovou vedou a potrebujete nejaký úvodný matematický prehľad o týchto komponentoch a o tom, ako sa s nimi môžeme hrať pomocou kódu NumPy v kóde.

Knižnica NumPy nám umožňuje vykonávať rôzne operácie, ktoré je potrebné vykonať s dátovými štruktúrami, ktoré sa často používajú v strojovom učení a dátovej vede, ako sú vektory, matice a polia. Ukážeme iba najbežnejšie operácie s NumPy, ktoré sa používajú v mnohých potrubiach strojového učenia. Nakoniec si všimnite, že NumPy je len spôsob, ako vykonávať operácie, takže matematické operácie, ktoré uvádzame, sú hlavným zameraním tejto lekcie, a nie samotným balíkom NumPy. Začnime.







Čo je to vektor?

Podľa spoločnosti Google je vektor veličinou, ktorá má smer aj veľkosť, najmä pri určovaní polohy jedného bodu v priestore voči druhému.





Vektory sú v strojovom učení veľmi dôležité, pretože nielen opisujú veľkosť, ale aj smer funkcií. Vektor môžeme vytvoriť v NumPy pomocou nasledujúceho útržku kódu:





import numpyakonapr

row_vector = np.array([1,2,3])
vytlačiť(riadkový_vektor)

Vo vyššie uvedenom úryvku kódu sme vytvorili riadkový vektor. Vektor stĺpca môžeme vytvoriť aj takto:

import numpyakonapr

col_vector = np.array([[1],[2],[3]])
vytlačiť(col_vector)

Vytvorenie matice

Maticu možno jednoducho chápať ako dvojrozmerné pole. Maticu môžeme vytvoriť pomocou NumPy vytvorením viacrozmerného poľa:



matica = np.array([[1,2,3],[4,5,6],[7,8,9]])
vytlačiť(matica)

Aj keď je matica presne podobná viacrozmernému poľu, štruktúra maticových údajov sa neodporúča z dvoch dôvodov:

  1. Pole je štandardom, pokiaľ ide o balík NumPy
  2. Väčšina operácií s NumPy vracia polia a nie maticu

Použitie riedkej matice

Na pripomenutie, riedka matica je tá, v ktorej je väčšina položiek nulová. Bežným scenárom pri spracovaní údajov a strojovom učení je teraz spracovanie matíc, v ktorých je väčšina prvkov nulová. Uvažujme napríklad o matici, ktorej riadky opisujú každé video na Youtube a stĺpce predstavujú každého registrovaného používateľa. Každá hodnota predstavuje, či si používateľ pozrel video alebo nie. Väčšina hodnôt v tejto matici bude samozrejme nulová. The výhoda s riedkou maticou spočíva v tom, že neukladá nulové hodnoty. Výsledkom je obrovská výpočtová výhoda a tiež optimalizácia úložiska.

Vytvoríme tu iskrivú maticu:

zo scipy import riedky

original_matrix = np.array([[1,0,3],[0,0,6],[7,0,0]])
sparse_matrix = sparse.csr_matrix(pôvodná_matica)
vytlačiť(riedka_matica)

Aby sme pochopili, ako kód funguje, pozrieme sa na výstup tu:

Vo vyššie uvedenom kóde sme použili funkciu NumPy na vytvorenie súboru Stlačený riedky riadok matica, kde sú nenulové prvky reprezentované pomocou indexov založených na nule. Existujú rôzne druhy riedkej matice, ako napríklad:

  • Stlačený riedky stĺp
  • Zoznam zoznamov
  • Slovník kľúčov

Nebudeme sa tu potápať do iných riedkych matríc, ale vieme, že každé z nich je špecifické a nikto nemôže byť označený ako „najlepší“.

Použitie operácií na všetky prvky Vector

Je to bežný scenár, keď potrebujeme použiť spoločnú operáciu na viacero vektorových prvkov. To sa dá dosiahnuť definovaním lambda a následnou vektorizáciou. Pozrime sa na rovnaký útržok kódu:

matica = np.array([
[1,2,3],
[4,5,6],
[7,8,9]])

mul_5 = lambda x: x* 5
vectorized_mul_5 = np.vectorize(mul_5)

vectorized_mul_5(matica)

Aby sme pochopili, ako kód funguje, pozrieme sa na výstup tu:

Vo vyššie uvedenom úryvku kódu sme použili funkciu vektorizácie, ktorá je súčasťou knižnice NumPy, na transformáciu jednoduchej definície lambda na funkciu, ktorá dokáže spracovať každý prvok vektora. Je dôležité si uvedomiť, že vektorizácia je len slučka nad živlami a nemá to žiadny vplyv na výkon programu. NumPy tiež umožňuje vysielanie , čo znamená, že namiesto vyššie uvedeného zložitého kódu sme mohli jednoducho urobiť:

matica* 5

A výsledok by bol úplne rovnaký. Chcel som najskôr ukázať komplexnú časť, inak by ste časť preskočili!

Priemer, odchýlka a štandardná odchýlka

S NumPy je jednoduché vykonávať operácie súvisiace s popisnou štatistikou vektorov. Priemer vektora možno vypočítať ako:

np. priemer(matica)

Odchýlku vektora je možné vypočítať ako:

np.var(matica)

Štandardnú odchýlku vektora je možné vypočítať ako:

napr. std(matica)

Tu sú uvedené výstupy vyššie uvedených príkazov na danej matici:

Transpozícia matice

Transpozícia je veľmi bežná operácia, o ktorej budete počuť, kedykoľvek budete obklopení maticami. Transpozícia je len spôsob, ako zameniť stĺpcové a riadkové hodnoty matice. Upozorňujeme, že a vektor nemožno transponovať ako vektor je len zbierka hodnôt bez toho, aby boli tieto hodnoty kategorizované do riadkov a stĺpcov. Upozorňujeme, že prevádzanie riadkového vektora na stĺpcový vektor nie je transpozícia (na základe definícií lineárnej algebry, ktorá je mimo rozsah tejto lekcie).

Zatiaľ nájdeme mier len transpozíciou matice. Prístup k transpozícii matice pomocou NumPy je veľmi jednoduchý:

matica.T

Tu je uvedený výstup vyššie uvedeného príkazu na danej matici:

Rovnakú operáciu je možné vykonať s riadkovým vektorom na jeho prevod na stĺpcový vektor.

Sploštenie matice

Maticu môžeme previesť na jednorozmerné pole, ak chceme spracovať jej prvky lineárne. To je možné vykonať pomocou nasledujúceho útržku kódu:

matrica.platiť()

Tu je uvedený výstup vyššie uvedeného príkazu na danej matici:

Všimnite si toho, že matica vyrovnania je jednorozmerné pole, jednoducho lineárne.

Výpočet vlastných hodnôt a vlastných vektorov

Vlastné vektory sa veľmi často používajú v balíkoch strojového učenia. Keď je teda funkcia lineárnej transformácie prezentovaná ako matica, potom X, vlastné vektory sú vektory, ktoré sa menia iba v mierke vektora, ale nie v jeho smere. Môžeme povedať, že:

Xv = γv

Tu X je štvorcová matica a γ obsahuje vlastné čísla. Tiež v obsahuje Vlastné vektory. S NumPy je ľahké vypočítať vlastné hodnoty a vlastné vektory. Tu je útržok kódu, kde to isté demonštrujeme:

hodnotí, evektory = np.linalg.eig(matica)

Tu je uvedený výstup vyššie uvedeného príkazu na danej matici:

Bodové produkty vektorov

Dot Products of Vectors je spôsob, ako vynásobiť 2 vektory. Hovorí vám to o koľko vektorov je v rovnakom smere , na rozdiel od krížového súčinu, ktorý vám hovorí opak, ako málo sú vektory v rovnakom smere (nazýva sa ortogonálne). Tu môžeme vypočítať bodový súčin dvoch vektorov, ako je uvedené v úryvku kódu, tu:

a = np.array([3,5,6])
b = pole n([2. 3,pätnásť,1])

np.dot(a, b)

Výstup vyššie uvedeného príkazu na daných poliach je uvedený tu:

Sčítanie, odčítanie a násobenie matíc

Sčítanie a odčítanie viacerých matíc je v maticiach celkom jednoduchá operácia. Existujú dva spôsoby, ktorými sa to dá dosiahnuť. Pozrime sa na útržok kódu na vykonanie týchto operácií. Aby to bolo jednoduché, použijeme rovnakú maticu dvakrát:

np.add(matica, matica)

Ďalej je možné odpočítať dve matice ako:

np.odčítať(matica, matica)

Tu je uvedený výstup vyššie uvedeného príkazu na danej matici:

Podľa očakávania sa každý z prvkov v matici sčíta/odčíta so zodpovedajúcim prvkom. Vynásobenie matice je podobné hľadaniu bodového súčinu, ako sme to urobili predtým:

np.dot(matica, matica)

Vyššie uvedený kód nájde skutočnú multiplikačnú hodnotu dvoch matíc uvedenú ako:

matica*matica

Tu je uvedený výstup vyššie uvedeného príkazu na danej matici:

Záver

V tejto lekcii sme si prešli mnohými matematickými operáciami týkajúcimi sa vektorov, matíc a polí, ktoré sa bežne používajú na spracovanie údajov, deskriptívnu štatistiku a dátovú vedu. Bola to rýchla lekcia pokrývajúca iba najbežnejšie a najdôležitejšie časti najrozmanitejších konceptov, ale tieto operácie by mali poskytnúť veľmi dobrú predstavu o tom, aké všetky operácie je možné vykonať pri práci s týmito štruktúrami údajov.

Podeľte sa, prosím, voľne o svoj názor na lekciu na Twitteri @linuxhint a @sbmaggarwal (to som ja!).