|
Zahvaljujoč odličnim novim zmožnostim rezanja polj v NumSharpu je .NET skupnost korak bližje zmogljivi odprtokodni platformi za strojno učenje. Python je jezik strojnega učenja deloma zato, ker ima odlične knjižnice, kot sta NumPy in TensorFlow. Vendar pa razvijalci C# močno potrebujejo tudi zmogljive odprtokodne knjižnice za strojno učenje in podatkovno znanost. NumSharp, NumPy C# prenos organizacije SciSharp STACK, je pred kratkim naredil velik korak naprej z popolno implementacijo zmogljivosti rezanja, kar omogoča ustvarjanje poljubnih podmnožic N-dimenzionalnih polj kot učinkovitih pogledov surovih podatkov. To ga naredi uporabno orodje za uporabo C# za strojno učenje skupaj z TensorFlow.NET.
Kaj je tako posebnega?
Če še niste uporabljali NumPy, verjetno ne veste, kako odlično je rezanje. Python polja omogočajo vrnitev rezine polja z indeksiranjem vrste elementov, kot sledi: a[start:stop:step]. A šele z NumPyjevo kompleksno implementacijo polj postane rezanje resnično zmogljiva tehnika manipulacije podatkov, brez katere bi bilo strojno učenje ali podatkovna znanost nepredstavljiva. Na srečo, za tiste, ki ne morejo ali nočejo preiti na Python za strojno učenje (ki sem ga prav tako ustvaril), NumSharp to zmožnost prinaša v .NET svet. Kot eden od razvijalcev pri NumSharp sem vam predstavil nekaj pomembnih primerov uporabe rezanja z vzorci kode v C#. Upoštevajte, da indeksiranja v C# ni mogoče izvajati na enak način kot v Pythonu zaradi razlik v sintaksi jezika. Vendar smo se odločili ohraniti Python sintakso za definicije rezkov, zato smo v C# uporabili nize za indeksiranje rezin. Oglejte si ta primer, da vidite, kako blizu je NumSharp NumPy.
Izrežite stolpec iz matrike v Pythonu/NumPyKo je koda napisana v C# z NumSharpom, je skoraj identična. Upoštevajte, da so rezine indeksirane nekoliko drugače, če uporabimo nize kot parametre za indeksator.
Izrežite stolpce iz matrike v C#/NumSharpKot vidite, je ekipa NumSharp vložila veliko truda, da je koda čim bolj podobna Pythonu. To je zelo pomembno, saj je na ta način mogoče obstoječo Python kodo, ki temelji na NumPy, enostavno prenesti v C#.
Primer uporabe: Uporaba več pogledov istih podatkov
Možnost posredovanja le lokalnih delov osnovnih podatkov (tj. majhnih kosov velikih slik) v in iz funkcij brez kopiranja je ključna za zmogljivost v času izvajanja, še posebej pri velikih podatkovnih nizih. Rezine so indeksirane z lokalnimi koordinatami, zato vaš algoritem ne potrebuje poznavanja globalne strukture vaših podatkov, kar učinkovito poenostavi vaše življenje in zagotavlja maksimalno zmogljivost, saj se prepreči nepotrebno podvajanje.
Primeri uporabe: Redki pogledi in rekurzivno rezanje
Redek pogled na polje lahko ustvarimo z določitvijo korakov onkraj začetka in konca razpona rezine. Kolikor vem, tudi C# 8.0 z novo sintakso array slice tega ne zmore. Ta funkcija postane zelo pomembna pri delu z prepletenimi podatki. Algoritem lahko oblikujete tako, da obdeluje zvezne podatke in mu zagotovite redke rezine, ki posnemajo neprekinjene vire podatkov, s čimer zmanjšate kompleksnost algoritma.
Rezanje je mogoče še dodatno razrezati, kar je zelo pomembna lastnost, če delate z visokodimenzionalnimi podatki. To prav tako pomaga zmanjšati kompleksnost algoritma, saj lahko z rekurzivnim rezanjem zmanjšate dimenzionalnost podatkov.
Primer uporabe: Učinkovita obdelava visokodimenzionalnih podatkov
Če moraš razmišljati o polju podatkov kot o volumnu in delati z njegovimi deli brez neverjetnih izračunov transformacij koordinat, potem je .reshape() pravi prijatelj. Vsa polja, ustvarjena z operacijami rezanja ali rezanja, so .reshape(), le pogled na izvirne podatke. Ko iterjate, berete ali pišete elemente v pogled, dostopate do surovega podatkovnega polja. NumSharp transparentno izvede ustrezne indeksne transformacije namesto vas, tako da lahko indeksirate rezine z relativnimi koordinatami.
Primer uporabe: Obrniti vrstni red elementov brez dodatnih stroškov
Rezine, ki uporabljajo negativne korake, dejansko obrnejo vrstni red rezin. Prednost tega je, da za to ni treba kopirati ali enumerirati podatkov, tako kot IEnumerable.Reverse(). Razlika je v tem, da pogled (rezultat operacije a["::-1"]) prikazuje podatke v obratnem vrstnem redu, in lahko indeksirate na to inverzno zaporedje, ne da bi ga naštevali.
Primer uporabe: Zmanjšanje kompleksnosti z zmanjšanjem dimenzij
Pri delu z visokodimenzionalnimi podatki so algoritmi za te podatke lahko zelo zapleteni. V uporabi je mogoče izhoditi katerikoli visokodimenzionalni volumen. Ko je ToString() uporabil NumSharp metodo NDArray, sem opazil, kako preprost in lep je algoritem postal z sistematičnim in rekurzivnim rezanjem ND volumnov na (N-1)D volumne itd. Ta pristop deli in vladaj vrne nizkodimenzionalne podvolumne z rezanjem simbolov razpona z indeksnimi simboli NumSharpa. Simbol razpona proti indeksnemu simboluSimbol območja ["start:stop:step"] omogoča dostop do podobmočja določenega volumna z enako dimenzijo. Torej, tudi če izrežete le en stolpec 2D matrike, boste še vedno dobili 2D matriko z le enim stolpcem. Tukaj je kratek del C# kode, ki to dokazuje:
Prerežite stolpec z uporabo simbola za razpon
Indeksni simbol vam daje (N-1) dimenzionalni rez na določeni lokaciji N-dimenzionalnega starševskega volumna. Torej, izrezovanje stolpca iz 2D matrike z uporabo indeksnih simbolov dobi 1D vektor:
Rezalni stolpci z uporabo indeksnih simbolov
Če razlike še niste opazili na prvi pogled, sta tukaj dve zgornji definiciji rezin ena ob drugi, ange[":,2:3"] proti indeksu[":,2"], ki močno vplivata na rezultate. Celoten vir novega simbola rezine je na voljo na NumSharp wiki.
Opomba: <T>ArraySlice
Pri implementaciji rezanja N-dimenzionalnih pogledov sem sklenil, da bi bilo to zanimivo tudi za mnoga druga področja .NET-a, zato sem to razdelil v svojo samostojno knjižnico z imenom SliceAndDice. Omogoča lahkotno ovojnico za indeksiranje katere koli C# podatkovne strukture (kot je or) ArraySlice <T>in omogoča uporabo istih mehanizmov za preoblikovanje, rezanje in ogled brez vseh drugih zahtevnih numeričnih izračunov. Za dosego odličnih zmožnosti rezanja je potrebnih le nekaj sto vrstic kode! T[]IList<T>
Wraparound
NumSharp je nedavno dobil enak mehanizem rezanja in ogleda, kar nedvomno uvršča NumPy med najpomembnejše knjižnice v ekosistemu strojnega učenja Pythona. SciSharp STACK je odprtokodna organizacija majhnega števila usposobljenih razvijalcev, ki so zelo trdo delali, da bi enako funkcionalnost prenesli v .NET svet. Najnovejše izboljšave NumSharpa so pomemben temelj pri doseganju tega. Izvirno:Prijava do hiperpovezave je vidna.
|