|
Berkat kemampuan pemotongan array baru NumSharp yang hebat, komunitas .NET selangkah lebih dekat untuk memiliki platform pembelajaran mesin sumber terbuka yang kuat. Python adalah bahasa pembelajaran mesin sebagian karena memiliki perpustakaan hebat seperti NumPy dan TensorFlow. Namun, pengembang C# juga sangat membutuhkan perpustakaan sumber terbuka yang kuat untuk pembelajaran mesin dan ilmu data. NumSharp, port NumPy C# dari organisasi SciSharp STACK, baru-baru ini mengambil langkah maju yang besar dengan sepenuhnya menerapkan kemampuan pengiriman, memungkinkan pembuatan subset array N-dimensi sewenang-wenang sebagai tampilan data mentah yang efisien. Ini menjadikannya alat yang berguna untuk menggunakan C# untuk pembelajaran mesin bersama dengan TensorFlow.NET.
Apa masalahnya?
Jika Anda belum menggunakan NumPy, Anda mungkin tidak tahu seberapa hebat pemotongan itu. Array Python memungkinkan pengembalian sepotong array dengan mengindeks serangkaian elemen, sebagai berikut: a[start:stop:step]. Tetapi hanya dengan implementasi array kompleks NumPy, pemotongan menjadi teknik manipulasi data yang benar-benar kuat yang tanpanya pembelajaran mesin atau ilmu data tidak akan terbayangkan. Untungnya, bagi mereka yang tidak bisa atau tidak ingin beralih ke Python untuk pembelajaran mesin (yang juga saya buat), NumSharp membawa kemampuan ini ke dunia .NET. Sebagai salah satu pengembang di NumSharp, saya telah memperkenalkan Anda pada beberapa kasus penggunaan pemotongan penting dengan contoh cuplikan kode di C#. Perhatikan bahwa pengindeksan tidak dapat dilakukan di C# dengan cara yang sama seperti di Python karena perbedaan sintaks bahasa. Namun, kami memutuskan untuk mempertahankan sintaks Python untuk definisi irisan, jadi kami menggunakan string untuk mengindeks irisan di C#. Lihat contoh ini untuk melihat seberapa dekat NumSharp dengan NumPy.
Potong kolom dari matriks di Python/NumPySaat ditulis dalam C# dengan NumSharp, kodenya hampir identik. Perhatikan bahwa irisan diindeks sedikit berbeda menggunakan string sebagai parameter untuk pengindeks.
Memotong kolom dari matriks di C#/NumSharpSeperti yang Anda lihat, tim NumSharp telah berusaha keras untuk membuat kode semirip mungkin dengan Python. Ini sangat penting karena dengan cara ini, kode Python yang ada yang mengandalkan NumPy sekarang dapat dengan mudah di-porting ke C#.
Kasus penggunaan: Menggunakan beberapa tampilan data yang sama
Mampu meneruskan hanya bagian lokal dari data yang mendasarinya (yaitu, potongan kecil gambar besar) masuk dan keluar dari fungsi tanpa menyalin sangat penting untuk performa runtime, terutama untuk kumpulan data besar. Irisan diindeks menggunakan koordinat lokal, sehingga algoritme Anda tidak perlu mengetahui struktur global data Anda, secara efektif menyederhanakan hidup Anda dan memastikan performa maksimum karena duplikasi yang tidak perlu dihindari.
Kasus penggunaan: Tampilan jarang dan pemotongan rekursif
Tampilan array yang jarang dapat dibuat dengan menentukan langkah-langkah di luar awal dan akhir rentang irisan. Sejauh yang saya tahu, bahkan C# 8.0 dengan sintaks irisan array baru tidak dapat melakukan ini. Fitur ini menjadi sangat penting saat berhadapan dengan data yang diselingi. Anda dapat merancang algoritme untuk menangani data berkelanjutan dan memberikannya irisan jarang yang meniru sumber data berkelanjutan, meminimalkan kompleksitas algoritme Anda.
Pengirisan dapat diiris lebih lanjut, yang merupakan fitur yang sangat penting jika Anda berhadapan dengan data dimensi tinggi. Ini juga membantu mengurangi kompleksitas algoritme, karena Anda dapat mengurangi dimensi data dengan mengiris secara rekursif.
Kasus penggunaan: Memproses data dimensi tinggi secara efisien
Jika Anda perlu menganggap array data sebagai volume dan bekerja dengan bagian-bagiannya tanpa harus melakukan perhitungan transformasi koordinat yang luar biasa, maka .reshape() adalah teman Anda. Semua array yang dibuat oleh atau operasi pemotongan adalah .reshape() hanya tampilan data asli. Saat Anda meniterasi, membaca, atau menulis elemen ke tampilan, Anda mengakses array data mentah. NumSharp secara transparan melakukan transformasi indeks yang sesuai untuk Anda, sehingga Anda dapat mengindeks irisan dengan koordinat relatif.
Kasus penggunaan: Membalikkan urutan elemen tanpa biaya tambahan
Irisan menggunakan langkah negatif sebenarnya membalikkan urutan irisan. Keuntungannya adalah tidak perlu menyalin atau menghitung data untuk melakukan ini, seperti IEnumerable.Reverse(). Perbedaannya adalah bahwa tampilan (hasil operasi a["::-1"]) menampilkan data dalam urutan terbalik, dan Anda dapat mengindeks ke urutan terbalik tanpa menghitungnya.
Kasus penggunaan: Kurangi kompleksitas dengan mengurangi dimensi
Saat bekerja dengan data dimensi tinggi, algoritme untuk data tersebut juga bisa menjadi sangat kompleks. Saat digunakan, volume dimensi tinggi apa pun dapat dikeluarkan. Ketika metode NumSharp NDArray ToString(), saya memperhatikan betapa sederhana dan indahnya algoritma dengan memotong volume ND secara sistematis dan rekursif menjadi volume (N-1)D, dll. Pendekatan bagi-dan-taklukkan ini mengembalikan subvolume dimensi rendah dengan mengiris simbol rentang menggunakan simbol indeks NumSharp. Simbol rentang vs. simbol indeksSimbol rentang ["start:stop:step"] memungkinkan Anda mengakses subrentang volume tertentu dengan dimensi yang sama. Jadi meskipun Anda hanya memotong satu kolom dari matriks 2D, Anda masih akan mendapatkan matriks 2D dengan hanya satu kolom. Berikut adalah bagian singkat dari kode C# yang menunjukkan ini:
Potong kolom menggunakan simbol rentang
Simbol indeks memberi Anda irisan dimensi (N-1) di lokasi volume induk N-dimensi yang ditentukan. Jadi memotong kolom dari matriks 2D menggunakan simbol indeks memberi Anda vektor 1D:
Potong kolom menggunakan simbol indeks
Jika Anda belum melihat perbedaannya secara sekilas, berikut adalah dua definisi irisan di atas secara berdampingan, ange[":,2:3"] vs index[":,2"], yang berdampak besar pada hasilnya. Referensi lengkap untuk simbol irisan baru dapat ditemukan di wiki NumSharp.
Catatan: <T>ArraySlice
Dalam menerapkan pemotongan tampilan N-dimensi, saya menyimpulkan bahwa itu mungkin menarik untuk banyak area lain di .NET, jadi saya memecahnya menjadi pustaka mandiri saya sendiri yang disebut SliceAndDice. Ini fitur menjadi pembungkus ringan untuk mengindeks struktur data C# apa pun (seperti atau) ArraySlice<T>, dan memungkinkan Anda menggunakan mekanisme remodeling, pengirisan, dan tampilan yang sama tanpa semua perhitungan numerik berat lainnya. Hanya perlu beberapa ratus baris kode untuk mencapai kemampuan pemotongan yang sangat baik! T[]IList<T>
Bungkus
NumSharp baru-baru ini diberi mekanisme pemotongan dan tampilan yang sama, yang tidak diragukan lagi menjadikan NumPy salah satu perpustakaan terpenting dalam ekosistem pembelajaran mesin Python. SciSharp STACK adalah organisasi open source dari sejumlah kecil pengembang terampil yang telah bekerja sangat keras untuk menghadirkan fungsionalitas yang sama ke dunia .NET. Peningkatan terbaru NumSharp merupakan landasan penting dalam mencapai hal ini. Asli:Login hyperlink terlihat.
|