Data Science w C (lub C ++)

40

Jestem R programistą języka. Należę również do grupy osób, które są uważane za naukowców danych, ale wywodzą się z dyscyplin naukowych innych niż CS.

Działa to dobrze w mojej roli naukowca danych, jednak rozpoczynając karierę Ri mając podstawową znajomość innych języków skryptowych / internetowych, czułem się nieco nieodpowiedni w dwóch kluczowych obszarach:

  1. Brak solidnej znajomości teorii programowania.
  2. Brak konkurencyjnego poziomu umiejętności w szybszych i szerzej używanych językach, takich jak C, C++i Javaktóre mogłyby zostać wykorzystane do zwiększenia prędkości potoku i obliczeń Big Data, a także do tworzenia produktów DS / danych, które można łatwiej przekształcić w szybkie skrypty zaplecza lub samodzielne aplikacje.

Rozwiązanie jest oczywiście proste - dowiedz się więcej o programowaniu, co właśnie robiłem, zapisując się na niektóre zajęcia (obecnie programowanie w języku C).

Jednak teraz, że zaczynam problemów adresowych # 1 i # 2 powyżej, pozostaje mi sobie pytanie „ Jak bardzo opłacalne są językami, jak Ci C++dla danych Science? ”.

Na przykład mogę bardzo szybko przenosić dane i dobrze komunikować się z użytkownikami, ale co z zaawansowaną regresją, uczeniem maszynowym, eksploracją tekstu i innymi bardziej zaawansowanymi operacjami statystycznymi?

Więc. może Cwykonać zadanie - jakie narzędzia są dostępne dla zaawansowanych statystyk, ML, AI i innych dziedzin Data Science? Czy też muszę stracić większość wydajności uzyskanej dzięki programowaniu Cpoprzez wywoływanie Rskryptów lub innych języków?

Najlepszym zasobem, jaki do tej pory znalazłem w C, jest biblioteka o nazwie Shark , która daje C/ C++możliwość korzystania z maszyn wektorów wsparcia, regresji liniowej (nieliniowej i innych zaawansowanych regresji, takich jak probin wielomianowy itp.) Oraz krótkiej listy innych (świetne, ale) funkcje statystyczne.

Hack-R
źródło
5
To pytanie wydaje się opierać głównie na opiniach. Proszę rozważyć ponowne sformułowanie. Może zapytaj, jakie rodzaje narzędzi do analizy danych są dostępne dla C / C ++ lub jakie aplikacje używają tych języków.
sheldonkreger
1
@sheldonkreger O to pytam, wyjaśnię to bardziej, dziękuję
Hack-R
1
Użyłem Waffles (C ++) do włączenia uczenia maszynowego w istniejących silnikach C ++.
Pete
@Pete, jeśli potrafisz włączyć to do odpowiedzi, prawdopodobnie oznaczę to jako rozwiązanie
Hack-R
1
Meta Toolkit jest dostępny w C ++: meta-toolkit.github.io/meta . Jest kurs na Coursera, który go używa, jest jeszcze w pierwszym tygodniu, więc możesz rzucić okiem. Kurs nazywa się „Wyszukiwanie tekstu i wyszukiwarki”.
LauriK,

Odpowiedzi:

35

Czy też muszę stracić większość wydajności uzyskanej dzięki programowaniu w C przez wywołanie skryptów R lub innych języków?

Odwrotnie: naucz się C / C ++, aby pisać rozszerzenia R. Używaj C / C ++ tylko do krytycznych pod względem wydajności sekcji nowych algorytmów, użyj R do budowania analizy, importowania danych, tworzenia wykresów itp.

Jeśli chcesz wyjść poza R, poleciłbym naukę Pythona. Dostępnych jest wiele bibliotek, takich jak scikit-learn dla algorytmów uczenia maszynowego lub PyBrain do budowania sieci neuronowych itp. (I używaj pylab / matplotlib do drukowania i notatników iPython do opracowywania swoich analiz). Ponownie, C / C ++ jest użyteczny do implementacji algorytmów krytycznych czasowo jako rozszerzeń Pythona.

Andre Holzner
źródło
1
Dzięki, Andre. Często używam Pybrain; dla mnie Python jest polem pośrednim między R i C, ale nadal chciałem nauczyć się C zarówno pod względem szybkości, jak i szerszego zastosowania kodu. Wybrałem to jako rozwiązanie, ponieważ nie myślałem o użyciu C / C ++ do pisania rozszerzeń R, co jest naprawdę wspaniałym pomysłem, który absolutnie zamierzam zrobić. Dzięki!!
Hack-R
1
Popieram pojęcie uczenia się języka Python. Pracuję z dużymi zestawami danych i naukowcami danych wykorzystującymi R do analizy tych zestawów danych. Chociaż nauczyłem się C w bardzo młodym wieku, Python jest jedynym językiem, który naprawdę daje mi wartość jako programista i pomaga tym naukowcom danych. Dlatego staraj się komplementować zespół, a nie siebie.
Glen Swan
1
podobnie python jest przyspieszany przez pisanie w cytonie (znowu w zasadzie C). Muszę powiedzieć, że sam tego jeszcze nie użyłem. Niewiele można zrobić przy użyciu istniejących bibliotek (np. Scikit-learn, pandy w pythonie [które są napisane w cytonie, więc nie musisz!]).
seanv507
Niektóre inne przydatne biblioteki Pythona to: pandy, numpy, scipy itp. Dodanie tego w celu wsparcia uczenia się pytona :)
Shagun Sodhani
To jest na miejscu. Chciałbym zauważyć, że jeśli nie masz tła CS, szansa, że ​​napiszesz kod bardziej wydajnie niż funkcje leżące u podstaw Pythona lub pakietów dla R, jest dość odległa. Programowałem w C ++ przez 13 lat i nadal uważam, że istnieją aspekty zarządzania pamięcią i optymalizacji wydajności, których nie zrobiłem dobrze. Ponadto Python i R mają bardzo inteligentnych informatyków optymalizujących problemy z dystrybucją, więc języki C naprawdę zostaną przeniesione do systemów o ekstremalnie niskim opóźnieniu.
jagartner
10

Jak powiedział Andre Holzner, rozszerzenie R z rozszerzeniem C / C ++ jest bardzo dobrym sposobem na wykorzystanie najlepszych z obu stron. Możesz także wypróbować odwrotność, pracując z C ++ i od czasu do czasu wywołując funkcję R z pakietem RInside o R. Tutaj możesz znaleźć jak

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

Kiedy pracujesz w C ++, masz wiele bibliotek, z których wiele jest zbudowanych na konkretne problemy, inne bardziej ogólne

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

http://mlpack.org/

D.Castro
źródło
9

Zgadzam się, że obecnym trendem jest używanie Python / R i wiązanie go z niektórymi rozszerzeniami C / C ++ do zadań obliczeniowych.

Jeśli jednak chcesz pozostać w C / C ++, możesz rzucić okiem na Dlib :

Dlib to wieloplatformowa biblioteka C ++ ogólnego przeznaczenia zaprojektowana z wykorzystaniem programowania kontraktowego i nowoczesnych technik C ++. Jest to oprogramowanie typu open source i licencjonowane na podstawie licencji Boost Software.

wprowadź opis zdjęcia tutaj

Franck Dernoncourt
źródło
Kolejna bardzo przydatna odpowiedź. Czy wiesz, czy wolno nam swobodnie reprodukować ten obraz (na wypadek, gdy chcę umieścić go w prezentacji, blogu itp.)? Ponadto, kiedy mówi takie rzeczy jak „> 20k próbek”, zastanawiam się, czy to naprawdę oznacza „próbki” czy „obserwacje w twojej próbce”?
Hack-R
2
Jestem autorem dlib. Możesz opublikować ten obraz gdziekolwiek chcesz :). Ponadto> 20 000 próbek oznacza, że ​​masz 20 000 wektorów lub cokolwiek innego. Ile zmiennych jest w każdej próbce to osobny problem.
Davis King,
@ Hack-R „Próbka” jest jednym z tych przeciążonych terminów w statystykach / uczeniu maszynowym, gdzie czasami oznacza zbiór wystąpień pobranych z populacji (jak w „wielkości próby”, „średniej próby” itp.), A czasem oznacza poszczególne wystąpienia (jak w „przeszkoleniu klasyfikatora na próbkach 10 000”).
Tim Goodman
6

Moim zdaniem, aby być bardziej wszechstronnym profesjonalistą, byłoby miło znać przynajmniej jeden język programowania dla najpopularniejszych paradygmatów programowania ( proceduralny , obiektowy , funkcjonalny ). Z pewnością uważam R i Pythona za dwa najpopularniejsze języki programowania i środowiska dla nauki danych, a zatem podstawowe narzędzia do nauki danych.

Julia jest imponująca pod pewnymi względami, ale stara się dogonić tych dwóch i stać się ważnym narzędziem do analizy danych. Jednak nie widzę to dzieje się w najbliższym czasie, po prostu ze względu na R / Python „s popularności , bardzo duże społeczności , jak również ogromne ekosystemów istniejących i nowo opracowane / Zestawy bibliotek , obejmujące bardzo szeroki zakres dziedzin / kierunków nauka.

To powiedziawszy, wiele pakietów i bibliotek, koncentrujących się na analizie danych, obszarach ML i AI, jest zaimplementowanych i / lub zapewnia interfejsy API w językach innych niż R lub Python (dla potwierdzenia zobacz tę wyselekcjonowaną listę i wyselekcjonowaną listę , z których oba są doskonałe i dają solidne spojrzenie na różnorodność w terenie). Jest to szczególnie prawdziwe w przypadku oprogramowania zorientowanego na wydajność lub specjalistycznego . W przypadku tego oprogramowania widziałem projekty z implementacją i / lub interfejsami API głównie w Javie, C i C ++ (Java jest szczególnie popularna w segmencie danych dużych zbiorów danych - ze względu na jej bliskość do Hadoop i jej ekosystemu - oraz w NLPsegment)), ale dostępne są inne opcje, aczkolwiek w znacznie bardziej ograniczonym zakresie, zależnym od domeny. Żaden z tych języków nie jest stratą czasu, jednak priorytetem musi być opanowanie jednego lub wszystkich z nich przy obecnej sytuacji, projektach i zainteresowaniach. Tak więc, aby odpowiedzieć na twoje pytanie dotyczące żywotności C / C ++ (i Java), powiedziałbym, że wszystkie one są wykonalne , jednak nie jako podstawowe narzędzia do analizy danych, ale jako pomocnicze .

Odpowiadając na pytania dotyczące 1) C jako potencjalnego narzędzia do analizy danych i 2) jego wydajności , powiedziałbym, że: 1) chociaż możliwe jest wykorzystanie C do analizy danych, odradzam to, ponieważ masz bardzo trudno jest znaleźć odpowiednie biblioteki, a tym bardziej próbować samodzielnie wdrożyć odpowiednie algorytmy; 2) nie należy się martwić wydajnością, ponieważ wiele segmentów kodu o kluczowym znaczeniu dla wydajności jest implementowanych w językach niskiego poziomu, takich jak C, a ponadto istnieją opcje interfejsu popularnych języków nauki danych z, powiedzmy, C (na przykładRcpp pakiet dla integracja R z C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Jest to dodatek do prostszych, ale często raczej skutecznych podejść do wydajności, takich jak konsekwentne stosowanie wektoryzacji w języku R, a także stosowanie różnych równoległych ram programowania, pakietów i bibliotek. Aby zapoznać się z przykładami ekosystemów R, zobacz Widok zadań CRAN „Wysokowydajne i równoległe przetwarzanie z R” .

Mówiąc o analizie danych , myślę, że sensowne jest wspomnienie o znaczeniu odtwarzalnego podejścia badawczego, a także dostępności różnych narzędzi wspierających tę koncepcję (więcej szczegółów znajduje się w mojej odpowiedniej odpowiedzi ). Mam nadzieję, że moja odpowiedź jest pomocna.

Aleksandr Blekh
źródło
5

R jest jednym z kluczowych narzędzi dla naukowców zajmujących się danymi, cokolwiek nie przestaniesz z niego korzystać.

Teraz mówimy o C, C ++, a nawet Javie. Są dobrymi popularnymi językami. Wether ich potrzebujesz lub będą potrzebować zależą od rodzaju pracy lub projektów, które masz. Z własnego doświadczenia wynika, że ​​istnieje tak wiele narzędzi dla badaczy danych, że zawsze będziesz się czuł, jakbyś ciągle musiał się uczyć.

Możesz dodać Python lub Matlab do rzeczy, aby dowiedzieć się, jeśli chcesz i dodawać dalej. Najlepszym sposobem na naukę jest podjęcie pracy przy użyciu innych narzędzi, z którymi nie czujesz się komfortowo. Gdybym był tobą, nauczyłbym się Pythona przed C. Jest on częściej używany w społeczności niż C. Ale nauka C nie jest stratą czasu.

servais daligou
źródło
Wiem, co masz na myśli mówiąc o przytłaczającej liczbie narzędzi! Mówię mojemu stażyście, aby nie rozpraszał się i skupił na tylko 1 lub 2 rzeczach, ale ciężko jest przyjąć własną radę.
Hack-R
5

Jako naukowiec danych przydatne są inne języki (C ++ / Java), gdy trzeba włączyć uczenie maszynowe w istniejącym silniku produkcyjnym.

Gofry jest zarówno dobrze utrzymaną biblioteką klas C ++, jak i pakietem analizy wiersza poleceń. Ma nadzorowane i nienadzorowane uczenie się, mnóstwo narzędzi do manipulacji danymi, rzadkie narzędzia do danych i inne rzeczy, takie jak przetwarzanie audio. Ponieważ jest to także biblioteka klas, możesz ją rozszerzać według potrzeb. Nawet jeśli nie jesteś tym, który opracowuje silnik C ++ (istnieje duże prawdopodobieństwo, że nie będziesz), pozwoli ci to prototypować, testować i przekazywać coś programistom.

Co najważniejsze, uważam, że moja znajomość C ++ i Java naprawdę pomaga mi zrozumieć, jak działają Python i R. Każdy język jest używany właściwie tylko wtedy, gdy rozumiesz trochę o tym, co dzieje się pod spodem. Ucząc się różnic między językami, możesz nauczyć się wykorzystywać zalety swojego głównego języka.

Aktualizacja

W zastosowaniach komercyjnych z dużymi zestawami danych ważna jest Apache Spark - MLLib. Tutaj możesz używać Scala, Java lub Python.

Pete
źródło
2

Chciałbym zrozumieć, dlaczego potrzebujesz innego języka (oprócz Pythona), jeśli twoim celem jest „ale co z zaawansowaną regresją, uczeniem maszynowym, eksploracją tekstu i innymi bardziej zaawansowanymi operacjami statystycznymi”.
Na takie rzeczy C to strata czasu. To dobre narzędzie, ale w ciągu ~ 20 lat od pojawienia się Java rzadko kodowałem C.
Jeśli wolisz bardziej funkcjonalną stronę programowania R, naucz się Scali, zanim zaczniesz zbyt wiele proceduralnych złych nawyków kodowania w C .
w końcu nauczyć się korzystać z bibliotek Hadley Wickhama - będą Ci zaoszczędzić dużo czasu robi manipulację danymi.

Michael Cox
źródło
Ponieważ języki takie jak R i Python są bardzo powolne / nieefektywne w porównaniu do języków takich jak C. Zatem mając do czynienia z dużą ilością danych i obliczeń, jeśli możesz coś zrobić w C, jest to szybsze niż jeśli możesz to zrobić w R. Kocham i używam Pakiety Hadleya!
Hack-R
2

Istnieje kilka narzędzi C ++ do statystyki i nauki danych, takich jak ROOT https://root.cern.ch/drupal/ , BAT https://www.mppmu.mpg.de/bat/ , boost lub OpenCV

Gość
źródło
Niesamowite! Dziękuję Ci. Chciałbym tylko, żeby były one również dla zwykłego C, ale nadal pomocne.
Hack-R
1

Nie jestem pewien, czy zostało to wspomniane, ale jest też samogłoska Wabbit, ale może być specyficzna tylko dla niektórych rodzajów problemów.

Felipe Almeida
źródło
1
Wygląda ciekawie. Spojrzałem tylko na link, ale wspomniane typy modeli byłyby bardzo przydatne. Czy jest to jednak zwykła biblioteka C, której można używać w programie? Będę musiał zbadać dalej.
Hack-R
0

Spójrz na Intel DAAL, który jest w toku. Jest wysoce zoptymalizowany pod kątem architektury procesorów Intel i obsługuje obliczenia rozproszone.

0x1337
źródło
0

Skalowalne rozwiązania uczenia maszynowego dla dużych zbiorów danych:

Dodam moje 0,02 $, ponieważ istnieje kluczowy obszar, który wydaje się nie uwzględniony we wszystkich poprzednich postach - uczenie maszynowe na dużych danych !

W przypadku dużych zbiorów danych skalowalność jest kluczowa, a R jest niewystarczające. Co więcej, języki takie jak Python i R są przydatne tylko w przypadku interfejsów ze skalowalnymi rozwiązaniami, które zwykle są pisane w innych językach. Rozróżniam to nie dlatego, że chcę zdyskredytować tych, którzy ich używają, ale tylko dlatego, że członkowie społeczności zajmującej się analizą danych powinni wiedzieć, jak wyglądają naprawdę skalowalne rozwiązania uczenia maszynowego.

Większość pracy wykonuję przy użyciu dużych zbiorów danych w klastrach pamięci rozproszonej . Oznacza to, że nie używam tylko 16-rdzeniowej maszyny (4 czterordzeniowe procesory na jednej płycie głównej współużytkującej pamięć tej płyty głównej), używam małego klastra 64 16-rdzeniowych maszyn. Wymagania są bardzo różne dla tych klastrów pamięci rozproszonej niż dla środowisk pamięci współużytkowanej, a uczenie maszynowe dużych zbiorów danych wymaga w wielu przypadkach skalowalnych rozwiązań w środowiskach pamięci rozproszonej.

Używamy również C i C ++ wszędzie w zastrzeżonym produkcie bazodanowym. Wszystkie nasze elementy wysokiego poziomu są obsługiwane w C ++ i MPI, ale elementy niskiego poziomu, które dotykają danych, to długie i tablice znaków w stylu C, aby utrzymać produkt bardzo szybko. Wygoda ciągów standardowych nie jest po prostu warta kosztów obliczeniowych.

Nie ma wielu dostępnych bibliotek C ++, które oferują rozproszone, skalowalne możliwości uczenia maszynowego - MLPACK .

Istnieją jednak inne skalowalne rozwiązania z interfejsami API:

Apache Spark ma skalowalną bibliotekę uczenia maszynowego o nazwie MLib , z którą można się komunikować .

Również Tensorflow ma teraz rozproszony tensorflow i ma interfejs API C ++ .

Mam nadzieję że to pomoże!

AN6U5
źródło