Ilmu Data dalam C (atau C ++)

40

Saya seorang Rprogrammer bahasa. Saya juga berada dalam kelompok orang yang dianggap sebagai Ilmuwan Data tetapi berasal dari disiplin akademis selain CS.

Ini berfungsi dengan baik dalam peran saya sebagai Data Scientist, namun, dengan memulai karir saya Rdan hanya memiliki pengetahuan dasar tentang bahasa scripting / web lain, saya merasa agak tidak memadai dalam 2 bidang utama:

  1. Kurangnya pengetahuan yang kuat tentang teori pemrograman.
  2. Kurangnya tingkat keterampilan yang kompetitif dalam bahasa yang lebih cepat dan lebih banyak digunakan seperti C, C++dan Java, yang dapat digunakan untuk meningkatkan kecepatan pipa dan perhitungan Big Data serta untuk membuat DS / produk data yang dapat lebih mudah dikembangkan menjadi lebih cepat skrip back-end atau aplikasi mandiri.

Solusinya tentu saja sederhana - pergi belajar tentang pemrograman, yang telah saya lakukan dengan mendaftar di beberapa kelas (saat ini pemrograman C).

Namun, sekarang saya mulai mengatasi masalah # 1 dan # 2 di atas, saya bertanya pada diri sendiri " Seberapa layakkah bahasa seperti Cdan C++untuk Ilmu Data? ".

Misalnya, saya dapat memindahkan data dengan sangat cepat dan berinteraksi dengan pengguna dengan baik, tetapi bagaimana dengan regresi tingkat lanjut, Pembelajaran Mesin, penambangan teks, dan operasi statistik lainnya yang lebih canggih?

Begitu. dapat Cmelakukan pekerjaan - alat apa yang tersedia untuk statistik lanjutan, ML, AI, dan bidang Ilmu Data lainnya? Atau haruskah saya kehilangan sebagian besar efisiensi yang diperoleh dengan pemrograman Cdengan memanggil Rskrip atau bahasa lain?

Sumber daya terbaik yang saya temukan sejauh ini di C adalah perpustakaan bernama Shark , yang memberikan C/ C++kemampuan untuk menggunakan Support Vector Machines, regresi linier (bukan non-linear dan regresi lanjutan lainnya seperti multinomial probit, dll) dan daftar pendek lainnya (hebat tapi) fungsi statistik.

Hack-R
sumber
5
Pertanyaan ini tampaknya terutama didasarkan pada pendapat. Harap pertimbangkan pengubahan ulang. Mungkin bertanya apa jenis alat sains data yang tersedia untuk C / C ++, atau jenis aplikasi apa yang menggunakan bahasa ini.
sheldonkreger
1
@sheldonkreger Itulah yang saya minta, saya akan membuatnya lebih jelas, terima kasih
Hack-R
1
Saya telah menggunakan Waffles (C ++) untuk menggabungkan pembelajaran mesin ke dalam mesin C ++ yang ada.
Pete
@Pete jika Anda dapat memasukkannya ke dalam jawaban, saya akan cenderung menandainya sebagai solusi
Hack-R
1
Meta toolkit tersedia dalam C ++: meta-toolkit.github.io/meta . Ada kursus tentang Coursera yang menggunakannya, ini masih dalam minggu 1, jadi Anda mungkin ingin melihatnya. Kursus ini disebut "Pengambilan Teks dan Mesin Pencari".
LauriK

Jawaban:

35

Atau haruskah saya kehilangan sebagian besar efisiensi yang diperoleh dengan pemrograman dalam C dengan memanggil skrip R atau bahasa lain?

Lakukan sebaliknya: pelajari C / C ++ untuk menulis ekstensi R. Gunakan C / C ++ hanya untuk bagian-bagian penting kinerja dari algoritma baru Anda, gunakan R untuk membangun analisis Anda, mengimpor data, membuat plot, dll.

Jika Anda ingin melampaui R, saya akan merekomendasikan belajar python. Ada banyak perpustakaan yang tersedia seperti scikit-belajar untuk algoritma pembelajaran mesin atau PyBrain untuk membangun Neural Networks dll. (Dan gunakan pylab / matplotlib untuk merencanakan dan notebook iPython untuk mengembangkan analisis Anda). Sekali lagi, C / C ++ berguna untuk mengimplementasikan algoritma kritis waktu sebagai ekstensi python.

Andre Holzner
sumber
1
Terima kasih, Andre. Saya banyak menggunakan Pybrain; bagi saya Python adalah jalan tengah di antara R dan C, tapi saya masih ingin belajar C untuk kecepatan dan aplikasi kode yang lebih luas. Saya memilih ini sebagai solusi karena saya tidak berpikir untuk menggunakan C / C ++ untuk menulis ekstensi R, yang merupakan ide yang sangat bagus yang saya benar-benar akan lakukan. Terima kasih!!
Hack-R
1
Saya mendukung gagasan belajar Python. Saya bekerja dengan dataset besar dan ilmuwan data menggunakan R untuk menganalisis dataset tersebut. Meskipun saya belajar C pada usia yang sangat muda, Python adalah satu bahasa yang benar-benar memberi saya nilai sebagai seorang programmer dan membantu ilmuwan data ini. Karena itu, lihat untuk memuji tim, bukan diri Anda sendiri.
Glen Swan
1
juga python dipercepat dengan menulis dalam cython (lagi-lagi pada dasarnya C). Saya harus mengatakan bahwa saya belum menggunakannya sendiri. Ada sangat sedikit yang tidak dapat dilakukan dengan menggunakan perpustakaan yang ada (misalnya scikit-learn, panda dengan python [yang ditulis dengan cython sehingga Anda tidak perlu!]).
seanv507
Beberapa pustaka python berguna lainnya termasuk: panda, numpy, scipy dll. Menambahkan ini untuk mendukung pembelajaran python :)
Shagun Sodhani
Ini tepat. Saya akan mencatat bahwa jika Anda tidak memiliki latar belakang CS, kemungkinan Anda menulis kode lebih efisien daripada fungsi yang mendasari untuk python atau paket untuk R cukup jauh. Saya diprogram dalam C ++ selama 13 tahun, dan masih berpikir ada aspek manajemen memori dan optimalisasi kinerja yang tidak saya lakukan dengan baik. Selain itu, python & R memiliki ilmuwan komputer yang sangat pintar mengoptimalkan masalah distribusi, sehingga bahasa C akan benar-benar diturunkan ke sistem latensi rendah yang ekstrim.
jagartner
10

Seperti yang dikatakan Andre Holzner, memperluas R dengan ekstensi C / C ++ adalah cara yang sangat baik untuk memanfaatkan yang terbaik dari kedua belah pihak. Anda juga dapat mencoba kebalikannya, bekerja dengan C ++ dan secara fungsi memanggil fungsi R dengan paket RInside o R. Di sini Anda dapat menemukan caranya

http://cran.r-project.org/web/packages/RInside/index.html http://dirk.eddelbuettel.com/code/rinside.html

Setelah Anda bekerja di C ++ Anda memiliki banyak perpustakaan, banyak dari mereka dibangun untuk masalah khusus, lainnya lebih umum

http://www.shogun-toolbox.org/page/features/ http://image.diku.dk/shark/sphinx_pages/build/html/index.html

http://mlpack.org/

D.Castro
sumber
9

Saya setuju bahwa tren saat ini adalah menggunakan Python / R dan mengikatnya ke beberapa ekstensi C / C ++ untuk tugas-tugas yang mahal secara komputasi.

Namun, jika Anda ingin tetap berada di C / C ++, Anda mungkin ingin melihat Dlib :

Dlib adalah tujuan umum pustaka lintas-platform C ++ yang dirancang menggunakan pemrograman kontrak dan teknik C ++ modern. Ini adalah perangkat lunak sumber terbuka dan dilisensikan di bawah Lisensi Perangkat Lunak Boost.

masukkan deskripsi gambar di sini

Franck Dernoncourt
sumber
Jawaban lain yang sangat berguna. Apakah Anda tahu jika kami diizinkan untuk mereproduksi gambar itu secara bebas (kalau-kalau saya ingin meletakkannya di presentasi atau blog, dll)? Juga, ketika dikatakan hal-hal seperti "> sampel 20k" Saya ingin tahu apakah itu benar-benar berarti "sampel" atau "pengamatan dalam sampel Anda"?
Hack-R
2
Saya penulis dlib. Jangan ragu untuk memposting gambar itu di mana pun Anda mau :). Juga,> 20k sampel berarti Anda memiliki 20k vektor atau apa pun. Berapa banyak variabel dalam setiap sampel adalah masalah terpisah.
Davis King
@ Hack-R "Sampel" adalah salah satu istilah kelebihan beban dalam statistik / pembelajaran mesin di mana kadang-kadang itu berarti serangkaian contoh yang diambil dari populasi (seperti dalam "ukuran sampel", "rata-rata sampel", dll.), Dan kadang-kadang berarti instance individu (seperti dalam "melatih classifier pada sampel 10K").
Tim Goodman
6

Menurut pendapat saya, idealnya, untuk menjadi profesional yang lebih berpengetahuan luas , akan menyenangkan untuk mengetahui setidaknya satu bahasa pemrograman untuk paradigma pemrograman paling populer ( prosedural , berorientasi objek , fungsional ). Tentu saja, saya menganggap R dan Python sebagai dua bahasa dan lingkungan pemrograman paling populer untuk ilmu data dan, karenanya, alat ilmu data primer .

Julia sangat mengesankan dalam aspek-aspek tertentu, tetapi ia mencoba untuk mengejar keduanya dan memantapkan dirinya sebagai alat ilmu data utama. Namun, saya tidak melihat ini terjadi dalam waktu dekat, hanya karena R / Python 's popularitas , sangat besar masyarakat serta besar ekosistem yang ada dan baru dikembangkan paket / perpustakaan , meliputi rentang yang sangat luas domain / bidang belajar.

Karena itu, banyak paket dan pustaka, yang berfokus pada ilmu data, bidang ML dan AI, diimplementasikan dan / atau menyediakan API dalam bahasa selain R atau Python (sebagai buktinya, lihat daftar kurasi ini dan daftar kurasi ini , keduanya sangat baik dan memberikan perspektif yang kuat tentang varietas di lapangan). Ini terutama berlaku untuk perangkat lunak yang berorientasi pada kinerja atau khusus . Untuk perangkat lunak itu, saya telah melihat proyek dengan pelaksanaan dan / atau API sebagian besar di Jawa, C dan C ++ (Java sangat populer di data besar segmen ilmu Data - karena kedekatan dengan Hadoop dan ekosistemnya - dan dalam NLPsegmen), tetapi opsi lain tersedia, meskipun pada tingkat yang jauh lebih terbatas, berbasis domain. Tidak satu pun dari bahasa ini yang membuang-buang waktu, namun Anda harus memprioritaskan menguasai salah satu atau semuanya dengan situasi kerja, proyek, dan minat Anda saat ini. Jadi, untuk menjawab pertanyaan Anda tentang kelayakan C / C ++ (dan Java), saya akan mengatakan bahwa mereka semua layak , namun tidak sebagai alat ilmu data primer , tetapi sebagai yang sekunder .

Menjawab pertanyaan Anda pada 1) C sebagai alat sains data potensial dan 2) efisiensinya , saya akan mengatakan bahwa: 1) sementara dimungkinkan untuk menggunakan C untuk sains data, saya akan merekomendasikan untuk tidak melakukannya, karena Anda akan memiliki sulit menemukan perpustakaan yang sesuai atau, bahkan lebih lagi, mencoba menerapkan algoritma yang sesuai sendiri; 2) Anda tidak perlu khawatir tentang efisiensi, karena banyak segmen kode kinerja kritis diimplementasikan dalam bahasa tingkat rendah seperti C, ditambah, ada opsi untuk antarmuka bahasa ilmu data populer dengan, katakanlah, C (misalnya, Rcpppaket untuk integrasi R dengan C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Ini merupakan tambahan untuk pendekatan kinerja yang lebih sederhana, tetapi seringkali agak efektif, seperti penggunaan vektorisasi yang konsisten dalam R serta menggunakan berbagai kerangka kerja pemrograman paralel, paket dan pustaka. Untuk contoh ekosistem R, lihat Tampilan Tugas CRAN "Kinerja Tinggi dan Komputasi Paralel dengan R" .

Berbicara tentang ilmu data , saya pikir cukup masuk akal untuk menyebutkan pentingnya pendekatan penelitian yang dapat direproduksi serta ketersediaan berbagai alat , mendukung konsep ini (untuk lebih jelasnya, silakan lihat jawaban saya yang relevan ). Saya harap jawaban saya bermanfaat.

Aleksandr Blekh
sumber
5

R adalah salah satu alat utama untuk ilmuwan data, apa pun yang Anda lakukan jangan berhenti menggunakannya.

Sekarang berbicara tentang C, C ++ atau bahkan Java. Mereka adalah bahasa populer yang baik. Apakah Anda membutuhkannya atau akan tergantung pada jenis pekerjaan atau proyek yang Anda miliki. Dari pengalaman pribadi, ada begitu banyak alat di luar sana untuk ilmuwan data sehingga Anda akan selalu merasa seperti Anda terus-menerus perlu belajar.

Anda dapat menambahkan Python atau Matlab ke hal-hal untuk dipelajari jika Anda mau dan terus menambahkan. Cara terbaik untuk belajar adalah mengerjakan proyek kerja menggunakan alat lain yang tidak Anda sukai. Jika saya jadi Anda, saya akan belajar Python sebelum C. Itu lebih banyak digunakan di komunitas daripada C. Tapi belajar C tidak membuang-buang waktu Anda.

servais daligou
sumber
Saya tahu apa yang Anda maksud tentang banyaknya alat! Saya mengatakan kepada karyawan magang saya untuk tidak terganggu dan fokus hanya pada 1 atau 2 hal, tetapi sulit untuk mengambil saran saya sendiri.
Hack-R
5

Sebagai seorang ilmuwan data, bahasa lain (C ++ / Java) berguna ketika Anda perlu memasukkan pembelajaran mesin ke dalam mesin produksi yang ada.

Waffles adalah pustaka kelas C ++ yang terpelihara dengan baik dan paket analisis baris perintah. Itu mendapat pembelajaran yang diawasi dan tidak terawasi, banyak alat manipulasi data, peralatan data yang jarang, dan hal-hal lain seperti pemrosesan audio. Karena ini juga perpustakaan kelas, Anda dapat memperluasnya sesuai kebutuhan. Bahkan jika Anda bukan orang yang mengembangkan mesin C ++ (kemungkinan Anda tidak akan), ini akan memungkinkan Anda untuk membuat prototipe, menguji, dan menyerahkan sesuatu kepada pengembang.

Yang paling penting, saya percaya pengetahuan saya tentang C ++ & Java benar-benar membantu saya memahami bagaimana Python dan R bekerja. Bahasa apa pun hanya digunakan dengan benar ketika Anda mengerti sedikit tentang apa yang terjadi di bawahnya. Dengan mempelajari perbedaan antar bahasa Anda dapat belajar untuk mengeksploitasi kekuatan bahasa utama Anda.

Memperbarui

Untuk aplikasi komersial dengan kumpulan data besar, Apache Spark - MLLib adalah penting. Di sini Anda dapat menggunakan Scala, Java, atau Python.

Pete
sumber
2

Saya ingin memahami mengapa Anda memerlukan bahasa lain (selain Python) jika tujuan Anda adalah "tetapi bagaimana dengan regresi tingkat lanjut, Pembelajaran Mesin, penambangan teks, dan operasi statistik lainnya yang lebih canggih".
Untuk hal semacam itu, C adalah buang-buang waktu. Ini adalah alat yang baik untuk dimiliki tetapi dalam ~ 20 tahun sejak Java keluar, saya jarang menggunakan kode C.
Jika Anda lebih suka sisi pemrograman yang lebih fungsional dari R, pelajari Scala sebelum Anda masuk ke terlalu banyak kebiasaan buruk prosedural yang mengkode dengan C .
Terakhir belajar menggunakan perpustakaan Hadley Wickham - mereka akan menghemat banyak waktu melakukan manipulasi data.

Michael Cox
sumber
Karena bahasa seperti R dan Python sangat lambat / tidak efisien dibandingkan dengan bahasa seperti C. Jadi ketika berhadapan dengan banyak data dan perhitungan, jika Anda dapat melakukan sesuatu dalam C lebih cepat daripada jika Anda bisa melakukannya dalam R. Saya suka dan menggunakan Paket Hadley tho!
Hack-R
2

Ada beberapa alat C ++ untuk statistik dan ilmu data seperti ROOT https://root.cern.ch/drupal/ , BAT https://www.mppmu.mpg.de/bat/ , boost, atau OpenCV

tamu
sumber
Luar biasa! Terima kasih. Saya hanya berharap mereka untuk C polos juga, tetapi masih membantu.
Hack-R
1

Tidak yakin apakah ini sudah disebutkan, tetapi ada juga vowpal wabbit tetapi mungkin khusus untuk jenis masalah tertentu saja.

Felipe Almeida
sumber
1
Terlihat menarik. Saya hanya melirik ke tautan, tetapi jenis model yang disebutkan akan sangat berguna. Apakah ini perpustakaan C biasa yang dapat Anda gunakan dalam suatu program? Saya harus menyelidiki lebih lanjut.
Hack-R
0

Lihatlah Intel DAAL yang sedang berlangsung. Ini sangat dioptimalkan untuk arsitektur CPU Intel dan mendukung perhitungan terdistribusi.

0x1337
sumber
0

Solusi Pembelajaran Mesin Scalable untuk Big Data:

Saya akan menambahkan $ .02 saya karena ada area kunci yang tampaknya tidak pernah dialamatkan di semua posting sebelumnya - pembelajaran mesin pada data besar !

Untuk data besar, skalabilitas adalah kunci, dan R tidak cukup. Lebih lanjut, bahasa seperti Python dan R hanya berguna untuk berinteraksi dengan solusi skalabel yang biasanya ditulis dalam bahasa lain. Saya membuat perbedaan ini bukan karena saya ingin meremehkan mereka yang menggunakannya, tetapi hanya karena sangat penting bagi anggota komunitas ilmu data untuk memahami seperti apa solusi pembelajaran mesin yang benar-benar dapat diukur.

Saya melakukan sebagian besar pekerjaan saya dengan data besar pada cluster memori terdistribusi . Artinya, saya tidak hanya menggunakan satu mesin 16 core (prosesor 4 quad core pada satu motherboard berbagi memori dari motherboard itu), saya menggunakan sekelompok kecil 64 mesin 16 core. Persyaratannya sangat berbeda untuk cluster memori terdistribusi ini daripada untuk lingkungan memori bersama dan pembelajaran mesin data besar membutuhkan solusi yang dapat diukur dalam lingkungan memori terdistribusi dalam banyak kasus.

Kami juga menggunakan C dan C ++ di mana-mana dalam produk basis data berpemilik. Semua hal tingkat tinggi kami ditangani dalam C ++ dan MPI, tetapi hal-hal tingkat rendah yang menyentuh data semuanya panjang dan array karakter gaya C untuk menjaga produk sangat sangat cepat. Kenyamanan string std sama sekali tidak sebanding dengan biaya komputasi.

Tidak banyak perpustakaan C ++ yang tersedia yang menawarkan kemampuan pembelajaran mesin yang dapat didistribusikan dan dapat diukur - MLPACK .

Namun, ada solusi terukur lainnya dengan API:

Apache Spark memiliki pustaka pembelajaran mesin berskala yang disebut MLib yang dapat Anda gunakan untuk berinteraksi.

Tensorflow juga sekarang telah mendistribusikan tensorflow dan memiliki api C ++ .

Semoga ini membantu!

AN6U5
sumber