Python: Vektory, matice a pole s NumPy

Python Vectors Matrices



V této lekci se podíváme na několik úhledných tipů a triků, jak si hrát s vektory, maticemi a poli pomocí knihovny NumPy v Pythonu. Tato lekce je velmi dobrým výchozím bodem, pokud začínáte s Data Science a potřebujete nějaký úvodní matematický přehled těchto komponent a toho, jak si s nimi můžeme hrát pomocí NumPy v kódu.

Knihovna NumPy nám umožňuje provádět různé operace, které je třeba provádět na datových strukturách často používaných ve strojovém učení a datové vědě, jako jsou vektory, matice a pole. Ukážeme pouze nejběžnější operace s NumPy, které se používají v mnoha potrubích strojového učení. Nakonec si všimněte, že NumPy je jen způsob, jak provádět operace, takže hlavní pozornost této lekce jsou ukázané matematické operace a ne samotný balíček NumPy. Začněme.







Co je to vektor?

Podle Googlu je vektor veličina, která má směr i velikost, zejména pro určování polohy jednoho bodu v prostoru vůči druhému.





Vektory jsou ve strojovém učení velmi důležité, protože nepopisují pouze velikost, ale také směr funkcí. Vektor můžeme vytvořit v NumPy pomocí následujícího fragmentu kódu:





import numpytak jakonapř

row_vector = np.array([1,2,3])
tisk(řádkový_vektor)

Ve výše uvedeném fragmentu kódu jsme vytvořili řádkový vektor. Můžeme také vytvořit sloupcový vektor jako:

import numpytak jakonapř

col_vector = np.array([[1],[2],[3]])
tisk(col_vector)

Vytvoření matice

Matici lze jednoduše chápat jako dvourozměrné pole. Můžeme vytvořit matici s NumPy vytvořením vícerozměrného pole:



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

Přestože je matice přesně podobná vícerozměrnému poli, struktura dat matice se nedoporučuje ze dvou důvodů:

  1. Pole je standardem, pokud jde o balíček NumPy
  2. Většina operací s NumPy vrací pole a ne matici

Pomocí řídké matice

Připomínáme, že řídká matice je ta, ve které je většina položek nulová. Nyní je běžným scénářem zpracování dat a strojového učení zpracování matic, ve kterých je většina prvků nulová. Zvažte například matici, jejíž řádky popisují každé video na Youtube a sloupce představují každého registrovaného uživatele. Každá hodnota představuje, zda uživatel sledoval video nebo ne. Většina hodnot v této matici bude samozřejmě nulová. The výhoda s řídkou matricí je, že neukládá hodnoty, které jsou nulové. To má za následek obrovskou výpočetní výhodu a také optimalizaci úložiště.

Pojďme vytvořit jiskrovou matici zde:

ze scipy import řídký

original_matrix = np.array([[1,0,3],[0,0,6],[7,0,0]])
sparse_matrix = sparse.csr_matrix(původní_matice)
tisk(řídká_matice)

Abychom pochopili, jak kód funguje, podíváme se na výstup zde:

Ve výše uvedeném kódu jsme použili funkci NumPy k vytvoření Stlačená řídká řada matice, kde jsou nenulové prvky reprezentovány pomocí indexů založených na nule. Existují různé druhy řídké matice, například:

  • Stlačený řídký sloupec
  • Seznam seznamů
  • Slovník klíčů

Nebudeme se potápět do jiných řídkých matic, ale vězte, že každé z nich je specifické a nikdo nemůže být označen jako „nejlepší“.

Použití operací na všechny prvky Vector

Je to běžný scénář, když potřebujeme použít společnou operaci na více vektorových prvků. To lze provést definováním lambda a následným vektorováním. Podívejme se na stejný fragment kódu:

matice = 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(matice)

Abychom pochopili, jak kód funguje, podíváme se na výstup zde:

Ve výše uvedeném fragmentu kódu jsme použili funkci vectorize, která je součástí knihovny NumPy, k transformaci jednoduché definice lambda na funkci, která dokáže zpracovat každý prvek vektoru. Je důležité si uvědomit, že vektorizace je jen smyčka nad živly a nemá to žádný vliv na výkon programu. NumPy také umožňuje vysílání , což znamená, že místo výše uvedeného složitého kódu jsme mohli jednoduše udělat:

matice* 5

A výsledek by byl úplně stejný. Chtěl jsem nejprve ukázat složitou část, jinak byste sekci přeskočili!

Průměr, rozptyl a standardní odchylka

S NumPy je snadné provádět operace související s popisnou statistikou vektorů. Průměr vektoru lze vypočítat jako:

np. průměr(matice)

Rozptyl vektoru lze vypočítat jako:

np.var(matice)

Standardní odchylku vektoru lze vypočítat jako:

např. std(matice)

Zde je uveden výstup výše uvedených příkazů na dané matici:

Transpozice matice

Transpozice je velmi běžná operace, o které uslyšíte, kdykoli jste obklopeni maticemi. Transpozice je jen způsob, jak zaměnit sloupcové a řádkové hodnoty matice. Vezměte prosím na vědomí, že a vektor nelze transponovat jako vektor je jen sbírka hodnot, aniž by tyto hodnoty byly kategorizovány do řádků a sloupců. Mějte na paměti, že převádění řádkového vektoru na sloupcový není transponováno (na základě definic lineární algebry, která je mimo rozsah této lekce).

Prozatím nalezneme mír pouhou transpozicí matice. Přístup k transpozici matice pomocí NumPy je velmi jednoduchý:

matice.T

Zde je uveden výstup výše uvedeného příkazu na dané matici:

Stejnou operaci lze provést na řádkovém vektoru a převést jej na sloupcový vektor.

Sloučení matice

Matici můžeme převést na jednorozměrné pole, pokud chceme její prvky zpracovat lineárně. To lze provést pomocí následujícího fragmentu kódu:

matice.plot()

Zde je uveden výstup výše uvedeného příkazu na dané matici:

Všimněte si, že matice sloučení je jednorozměrné pole, jednoduše lineární.

Výpočet vlastních hodnot a vlastních vektorů

Vlastní obvody se velmi často používají v balíčcích strojového učení. Když je tedy funkce lineární transformace prezentována jako matice, pak X, vlastní vektory jsou vektory, které se mění pouze v měřítku vektoru, ale ne ve směru. Můžeme říci, že:

Xv = γv

Zde X je čtvercová matice a γ obsahuje vlastní čísla. Také v obsahuje vlastní vektory. S NumPy je snadné vypočítat vlastní hodnoty a vlastní vektory. Zde je fragment kódu, kde předvádíme totéž:

vyhodnocuje, evektory = np.linalg.eig(matice)

Zde je uveden výstup výše uvedeného příkazu na dané matici:

Tečkované produkty vektorů

Dot Products of Vectors je způsob, jak znásobit 2 vektory. Vypovídá to o kolik vektorů je ve stejném směru , na rozdíl od křížového součinu, který vám říká opak, jak málo jsou vektory ve stejném směru (nazývané ortogonální). Můžeme vypočítat součin bodů dvou vektorů, jak je uvedeno ve fragmentu kódu zde:

a = np.array([3,5,6])
b = np.array([2. 3,patnáct,1])

np.dot(a, b)

Zde je uveden výstup výše uvedeného příkazu na daná pole:

Sčítání, odčítání a násobení matic

Sčítání a odčítání více matic je poměrně jednoduchá operace v maticích. To lze provést dvěma způsoby. Podívejme se na fragment kódu k provedení těchto operací. Aby to bylo jednoduché, použijeme stejnou matici dvakrát:

np.add(matice, matice)

Dále lze odečíst dvě matice jako:

np.odečíst(matice, matice)

Zde je uveden výstup výše uvedeného příkazu na dané matici:

Jak se dalo očekávat, každý z prvků v matici se přičte/odečte s odpovídajícím prvkem. Násobení matice je podobné hledání tečkového součinu jako dříve:

np.dot(matice, matice)

Výše uvedený kód najde skutečnou hodnotu násobení dvou matic, která je uvedena jako:

matice*matice

Zde je uveden výstup výše uvedeného příkazu na dané matici:

Závěr

V této lekci jsme prošli spoustou matematických operací souvisejících s vektory, maticemi a poli, které se běžně používají pro zpracování dat, popisnou statistiku a datovou vědu. Byla to rychlá lekce pokrývající pouze nejběžnější a nejdůležitější části široké škály konceptů, ale tyto operace by měly poskytnout velmi dobrou představu o tom, jaké všechny operace lze provést při práci s těmito datovými strukturami.

Sdílejte prosím svobodně svůj názor na lekci na Twitteru @linuxhint a @sbmaggarwal (to jsem já!).