|
NumSharp'ın harika yeni dizi dilimleme yetenekleri sayesinde, .NET topluluğu güçlü bir açık kaynak makine öğrenimi platformuna bir adım daha yaklaştı. Python, NumPy ve TensorFlow gibi harika kütüphanelere sahip olduğu için bir makine öğrenimi dili. Ancak, C# geliştiricilerinin makine öğrenimi ve veri bilimi için güçlü açık kaynak kütüphanelerine de büyük ihtiyacı vardır. NumSharp, SciSharp STACK organizasyonunun NumPy C# portu, son zamanlarda dilimleme yeteneklerini tam olarak uygulayarak büyük bir adım attı; böylece N-boyutlu dizilerin rastgele alt kümelerinin ham verinin verimli görünümleri olarak oluşturulmasına olanak tanıdı. Bu da onu TensorFlow.NET ile birlikte makine öğrenimi için C# kullanmak için faydalı bir araç haline getirir.
Ne büyük mesele var ki?
NumPy kullanmadıysanız, dilimlemenin ne kadar harika olduğunu muhtemelen bilmiyorsunuzdur. Python dizileri, bir dizi öğeyi indeksleyerek dizinin bir dilimini döndürmeye olanak tanır: a[start:stop:step]. Ancak ancak NumPy'nin karmaşık dizi uygulamasıyla dilimleme gerçekten güçlü bir veri işleme tekniği haline geliyor; onsuz makine öğrenimi veya veri bilimi hayal edilemez olurdu. Neyse ki, makine öğrenimi için Python'a geçemeyenler veya istemeyenler için (ki ben de yaptım), NumSharp bu özelliği .NET dünyasına getiriyor. NumSharp'taki geliştiricilerden biri olarak, C# dilinde örnekler kod parçaları ile önemli dilimleme kullanım durumlarıyla sizi tanıttım. Dil sözdizimi farklılıkları nedeniyle indeksleme, Python'daki gibi C# dilinde yapılamaz. Ancak, dilim tanımları için Python sözdizimini korumaya karar verdik, bu yüzden dilimleri C#'da indekslemek için dizeler kullandık. NumSharp'ın NumPy'ye ne kadar yakın olduğunu görmek için bu örneğe göz atın.
Python/NumPy'deki matrisin sütununu çıkarınC# ile NumSharp ile yazıldığında kod neredeyse aynıdır. Dilimler, dizileri indeksleyici için parametreler olarak kullanarak biraz farklı şekilde indeksleniyor.
C#/NumSharp ile bir matristen sütunları kesinGördüğünüz gibi, NumSharp ekibi kodu mümkün olduğunca Python'a benzetmek için çok çaba harcadı. Bu çok önemlidir çünkü bu şekilde, NumPy'ye dayanan mevcut Python kodu artık kolayca C#'a taşınabilir.
Kullanım durumu: Aynı verinin birden fazla görünümünü kullanmak
Kopyalamadan fonksiyonlara girip çıkabilmek, özellikle büyük veri setleri için çalışma zamanı performansı için kritik öneme sahiptir. Dilimler yerel koordinatlarla indekslenir, bu yüzden algoritmanız verilerinizin küresel yapısını bilmesine gerek kalmaz, böylece hayatınızı kolaylaştırır ve gereksiz tekrarlamadan kaçınarak maksimum performansı sağlar.
Kullanım durumları: Seyrek görünümler ve özyinelemeli dilimleme
Bir dizinin seyrek görünümü, dilim aralığının başlangıcı ve sonunun ötesinde adımlar belirtilerek oluşturulabilir. Bildiğim kadarıyla, yeni dizi dilim söz dizimi ile C# 8.0 bile bunu yapamıyor. Bu özellik, aralı verilerle ilgilenirken çok önemli hale gelir. Algoritmanızı sürekli veriyi işleyecek şekilde tasarlayabilir ve sürekli veri kaynaklarını taklit eden seyrek dilimler sağlayarak algoritmanızın karmaşıklığını en aza indirebilirsiniz.
Dilimleme daha da dilimlenebilir, bu yüksek boyutlu verilerle ilgileniyorsanız çok önemli bir özelliktir. Bu aynı zamanda algoritmanın karmaşıklığını azaltmaya yardımcı olur; çünkü verinin boyutluluğunu özyinelemeli dilimleme yoluyla azaltabilirsiniz.
Kullanım durumu: Yüksek boyutlu verileri verimli şekilde işlemek
Bir veri dizisini bir hacim olarak düşünmeniz ve parçaları ile inanılmaz koordinat dönüşümü hesaplamaları yapmadan çalışmanız gerekiyorsa, .reshape() sizin dostunuzdur. Dilimleme işlemleriyle oluşturulan veya dilimleme işlemleriyle oluşturulan tüm diziler .reshape() olarak sadece orijinal verinin bir görünümüdür. Bir görünüme öğeler yineleştirdiğinizde, okuduğunuzda veya yazdığınızda, ham veri dizisine erişirsiniz. NumSharp, sizin için uygun indeks dönüşümlerini şeffaf bir şekilde yapar, böylece göreceli koordinatlarla dilim indeksleyebilirsin.
Kullanım durumu: Elemanların sırasını ek maliyet olmadan tersine çevirmek
Negatif adımlarla dilimler aslında dilimlerin sırasını tersine çeviriyor. Bunun avantajı, IEnumerable.Reverse() gibi veri kopyalaması veya sayması gerekmemesidir. Fark şu ki, görünüm (a["::-1"] işleminin sonucu) veriyi ters sırayla gösterir ve bu ters diziyi saymadan indeksleyebilirsiniz.
Kullanım durumu: Boyutları küçülterek karmaşıklığı azaltmak
Yüksek boyutlu verilerle çalışırken, o verilerin algoritmaları da çok karmaşık hale gelebilir. Kullanımda, herhangi bir yüksek boyutlu hacim çıkış yapılabilir. ToString()'nin NumSharp yöntemi NDArray'de, algoritmanın ND hacimlerini sistematik ve özyinelemeli olarak (N-1)D hacimlere vb. kesinleyerek ne kadar basit ve güzel hale geldiğini fark ettim. Bu böl ve fethet yaklaşımı, NumSharp'ın indeks sembolleri kullanılarak aralık sembollerini dilimleyerek düşük boyutlu alt hacimler döndürür. Aralık sembolü ile indeks sembolüAralık sembolü ["start:stop:step"] aynı boyutta belirli bir hacmin alt aralığına erişmenizi sağlar. Yani 2D matrisin sadece bir sütununu kesseniz bile, yine de sadece bir sütunlu 2D matris elde edeceksiniz. İşte bunu gösteren kısa bir C# kodu parçası:
Aralık sembolünü kullanarak sütunu dilimleyin
İndeks sembolü, N boyutlu ebeveyn hacminin belirtilen konumunda (N-1) boyutlu bir dilim verir. Yani indeks sembolleriyle 2B matristen bir sütun kestiğinizde 1B bir vektör elde edersiniz:
Sütunları indeks sembolleriyle dilimle
Farkı bir bakışta görmediyseniz, işte yukarıdaki iki dilim tanımı yan yana geliyor: ange[":,2:3"] vs index[":,2"], ve bunlar sonuçlar üzerinde büyük etkiye sahip. Yeni dilim sembolüne tam bir referans NumSharp wiki'de bulunabilir.
Not: <T>ArraySlice
N-boyutlu görünümlerin dilimlenmesini uygularken, .NET'in birçok diğer alanı için ilginç olabileceği sonucuna vardım ve bunu kendi bağımsız kütüphanem olan SliceAndDice'a ayırdım. Herhangi bir C# veri yapısını (örneğin ArraySlice) indekslemek için hafif bir wrapper <T>özelliğine sahiptir ve diğer ağır sayısal hesaplamalar olmadan aynı yeniden modelleme, dilimleme ve görüntüleme mekanizmalarını kullanmanıza olanak tanır. Mükemmel dilimleme yetenekleri elde etmek için sadece birkaç yüz satır kod yeterlidir! T[]IList<T>
Wraparound
NumSharp yakın zamanda aynı dilimleme ve görüntüleme mekanizmasını aldı ve bu da şüphesiz NumPy'yi Python makine öğrenme ekosistemindeki en önemli kütüphanelerden biri yapıyor. SciSharp STACK, aynı işlevselliği .NET dünyasına getirmek için çok çalışan az sayıda yetenekli geliştiricinin açık kaynak organizasyonudur. NumSharp'ın son iyileştirmeleri, bunu başarmakta önemli bir temel taştır. Özgün:Bağlantı girişi görünür.
|