|
NumSharpin loistavien uusien taulukoiden viipalointiominaisuuksien ansiosta .NET-yhteisö on askeleen lähempänä tehokasta avoimen lähdekoodin koneoppimisalustaa. Python on koneoppimiskieli osittain siksi, että sillä on erinomaiset kirjastot kuten NumPy ja TensorFlow. C#-kehittäjillä on kuitenkin suuri tarve tehokkaille avoimen lähdekoodin kirjastoille koneoppimista ja data-analytiikkaa varten. NumSharp, SciSharp STACK -organisaation NumPy C# -porttaus, on äskettäin ottanut suuren askeleen eteenpäin ottamalla täysin käyttöön viipalointiominaisuudet, mikä mahdollistaa mielivaltaisten N-ulotteiden osajoukkojen luomisen tehokkaina raakadatan näkyminä. Tämä tekee siitä hyödyllisen työkalun C#:n käyttämiseen koneoppimiseen yhdessä TensorFlow.NET:n kanssa.
Mikä siinä on niin iso juttu?
Jos et ole käyttänyt NumPyä, et todennäköisesti tiedä, kuinka hyvä viipalointi on. Python-taulukot mahdollistavat taulukon viipaleen palauttamisen indeksoimalla sarjan elementtejä seuraavasti: a[start:stop:step]. Mutta vasta NumPy:n monimutkaisen taulukon toteutuksen myötä viipalointi muuttuu todella tehokkaaksi datan käsittelytekniikaksi, ilman jota koneoppiminen tai datatiede olisivat käsittämättömiä. Onneksi niille, jotka eivät voi tai halua siirtyä Pythoniin koneoppimista varten (jonka minäkin tein), NumSharp tuo tämän ominaisuuden .NET-maailmaan. Yhtenä NumSharpin kehittäjistä olen esitellyt sinulle tärkeitä leikkauskäyttötapauksia, joissa on esimerkkikoodipätkiä C#:ssa. Huomaa, että indeksointia ei voi tehdä C#:lla samalla tavalla kuin Pythonissa kielisyntaksin erojen vuoksi. Päätimme kuitenkin säilyttää Python-syntaksin viipaleiden määrittelyissä, joten käytimme merkkijonoja viipaleiden indeksointiin C#:ssa. Katso tämä esimerkki nähdäksesi, kuinka lähellä NumSharp on NumPyä.
Leikkaa sarake pois matriisista Python/NumPy:ssäKun koodi kirjoitetaan C#:lla NumSharpilla, koodi on lähes identtinen. Huomaa, että viipaleet indeksoidaan hieman eri tavalla käyttämällä merkkijonoja indeksaattorin parametreina.
Leikkaa sarakkeet pois matriisista C#/NumSharpissaKuten näet, NumSharpin tiimi on panostanut paljon siihen, että koodi olisi mahdollisimman samankaltainen kuin Python. Tämä on erittäin tärkeää, koska näin olemassa oleva Python-koodi, joka perustuu NumPyyn, voidaan nyt helposti siirtää C#:lle.
Käyttötapaus: Käytä useita näkymiä samasta datasta
Kyky välittää vain paikallisia osia taustalla olevasta datasta (eli pienet suuret kuvalohkot) funktioihin ilman kopiointia on ratkaisevan tärkeää suorituskyvyn kannalta, erityisesti suurissa tietoaineistoissa. Viipaleet indeksoidaan paikallisten koordinaattien avulla, joten algoritmisi ei tarvitse tietää datan globaalia rakennetta, mikä yksinkertaistaa elämääsi ja varmistaa maksimaalisen suorituskyvyn, koska tarpeeton päällekkäisyys vältetään.
Käyttötapaukset: Harvat näkymät ja rekursiivinen viipalointi
Niukan näkymän taulukosta voidaan luoda määrittämällä askelia leikkausalueen alun ja lopun ulkopuolelle. Käsittääkseni edes C# 8.0 uudella taulukon viipalesyntaksilla ei pysty tähän. Tämä ominaisuus on erittäin tärkeä interleaved-datan käsittelyssä. Voit suunnitella algoritmisi käsittelemään jatkuvaa dataa ja tarjota sille harvoja viipaleita, jotka jäljittelevät jatkuvia tietolähteitä, mikä minimoi algoritmisi monimutkaisuuden.
Viipalointia voi viipaloida pidemmälle, mikä on erittäin tärkeä ominaisuus, jos käsittelet korkean ulottuvuuden dataa. Tämä auttaa myös vähentämään algoritmin monimutkaisuutta, sillä datan ulottuvuutta voi pienentää rekursiivisella viipalointilla.
Käyttötapaus: Prosessoida tehokkaasti korkean ulottuvuuden dataa
Jos sinun täytyy ajatella datataulukkoa tilavuutena ja työskennellä sen osien kanssa ilman, että sinun tarvitsee tehdä uskomattomia koordinaattimuunnoslaskelmia, niin .reshape() on ystäväsi. Kaikki taulukot, jotka on luotu tai jotka on luotu leikkausoperaatioilla, ovat .reshape() vain alkuperäisen datan näkymä. Kun iteroidaan, luet tai kirjoitat elementtejä näkymään, pääset käsiksi raakadatataulukkoon. NumSharp suorittaa läpinäkyvästi sopivat indeksimuunnokset, jotta voit indeksoida viipaleita suhteellisilla koordinaateilla.
Käyttötapaus: Kääntää elementtien järjestys ilman lisäkustannuksia
Viipaleet, joissa käytetään negatiivisia askelia, kääntävät viipaleiden järjestyksen itse asiassa päinvastaiseksi. Sen etuna on, ettei dataa tarvitse kopioida tai luetella tähän, aivan kuten IEnumerable.Reverse(). Ero on siinä, että näkymä (operaation a["::-1"]) näyttää datan käänteisessä järjestyksessä, ja voit indeksoida kyseisen käänteisen sekvenssin ilman sen luettelemista.
Käyttötapaus: Vähennä monimutkaisuutta pienentämällä ulottuvuuksia
Kun työskennellään korkean ulottuvuuden datan kanssa, algoritmit voivat myös muuttua hyvin monimutkaisiksi. Käytössä voidaan tuottaa mikä tahansa korkean ulottuvuuden tilavuus. Kun ToString():n NumSharp-menetelmä NDArray, huomasin, kuinka yksinkertainen ja kaunis algoritmi on muuttunut järjestelmällisesti ja rekursiivisesti leikkaamalla ND-tilavuuksia (N-1)D-tilavuuksiksi jne. Tämä jaka ja hallitse -menetelmä palauttaa matalan ulottuvuuden osatilavuuksia leikkaamalla etäisyyssymbolit NumSharpin indeksisymboleilla. Etäisyyssymboli vs. indeksisymboliEtäisyyssymboli ["start:stop:step"] antaa sinun käyttää tietyn tilavuuden alialuetta, jolla on sama ulottuvuus. Joten vaikka poistaisit vain yhden sarakkeen 2D-matriisista, saat silti 2D-matriisin, jossa on vain yksi sarakke. Tässä lyhyt pätkä C#-koodia, joka havainnollistaa tätä:
Leikkaa sarake etäisyyssymbolilla
Indeksisymboli antaa sinulle (N-1)-ulotteisen viipaleen N-ulotteisen vanhemman tilavuuden määritetyssä kohdassa. Joten kun leikkaat sarakkeen 2D-matriisista indeksisymboleilla, saat 1D-vektorin:
Viipalosarakkeet indeksisymboleilla
Jos et ole nähnyt eroa ensisilmäyksellä, tässä ovat kaksi yllä olevaa viipalemääritelmää rinnakkain, ange[":,2:3"] vs indeksi[":,2"], joilla on suuri vaikutus tuloksiin. Täydellinen viittaus uuteen viipalesymboliin löytyy NumSharp-wikistä.
Huomautus: <T>ArraySlice
Toteuttaessani N-ulottuvuuden näkymien viipalointia päädyin siihen, että se voisi olla kiinnostava monille muille .NET-alueille, joten jaoin sen omaan itsenäiseen kirjastooni nimeltä SliceAndDice. Siinä on kevyt kääre minkä tahansa C#-tietorakenteen (kuten ArraySlicen) <T>indeksointiin, ja se mahdollistaa samojen muokkaus-, viipalointi- ja katselumekanismien käytön ilman muita raskaita numeerisia laskelmia. Tarvitaan vain muutama sata koodiriviä saavuttaaksesi erinomaiset leikkausominaisuudet! T[]IList<T>
Wraparound
NumSharpille on äskettäin annettu sama viipalointi- ja katselumekanismi, mikä tekee NumPystä kiistatta yhden tärkeimmistä kirjastoista Pythonin koneoppimisen ekosysteemissä. SciSharp STACK on avoimen lähdekoodin organisaatio, johon kuuluu pieni joukko taitavia kehittäjiä, jotka ovat tehneet kovasti töitä tuodakseen saman toiminnallisuuden .NET-maailmaan. NumSharpin viimeisimmät parannukset ovat tärkeä kulmakivi tämän saavuttamisessa. Alkuperäinen:Hyperlinkin kirjautuminen on näkyvissä.
|