Data Science in C (oder C ++)


40

Ich bin ein RSprachprogrammierer. Ich gehöre auch zu der Gruppe von Leuten, die als Data Scientists gelten, aber aus anderen akademischen Disziplinen als CS stammen.

Dies funktioniert in meiner Rolle als Data Scientist sehr gut. Als ich meine Karriere in Randeren Skriptsprachen / Web-Sprachen begann und nur Grundkenntnisse in diesen hatte, fühlte ich mich in zwei Schlüsselbereichen etwas unzureichend:

  1. Mangel an soliden Kenntnissen der Programmiertheorie.
  2. Der Mangel an einem wettbewerbsfähigen Niveau von Fähigkeiten in schnellen und verbreiteten Sprachen wie C, C++und Java, die verwendet werden, um die Geschwindigkeit der Pipeline und Big Data Berechnungen zu erhöhen sowie DS / Daten Produkte zu schaffen , die leichter zu schnell entwickelt werden können Back-End-Skripte oder eigenständige Anwendungen.

Die Lösung ist natürlich einfach - lernen Sie etwas über das Programmieren, was ich getan habe, indem ich mich in einigen Klassen eingeschrieben habe (derzeit C-Programmierung).

Nun, da ich mich jedoch mit den Problemen 1 und 2 befasse, frage ich mich: " Wie lebensfähig sind Sprachen wie Cund C++für Data Science? ".

Zum Beispiel kann ich Daten sehr schnell verschieben und problemlos mit Benutzern interagieren, aber was ist mit fortgeschrittener Regression, maschinellem Lernen, Text Mining und anderen fortgeschrittenen statistischen Operationen?

Damit. kann Cdie Arbeit erledigen - welche Tools stehen für fortgeschrittene Statistik, ML, AI und andere Bereiche der Datenwissenschaft zur Verfügung? Oder muss ich den größten Teil der Effizienz verlieren, die beim Programmieren Cdurch Aufrufen von RSkripten oder anderen Sprachen erzielt wird?

Die beste Ressource , die ich bisher in C gefunden habe , ist eine Bibliothek namens Shark , die gibt C/ C++die Fähigkeit , Support Vector Machines zu verwenden, die lineare Regression (nicht nicht-lineare und andere erweiterte Regression wie multinomial Probit, usw.) und eine Auswahlliste von anderen (großartige, aber) statistische Funktionen.


5
Diese Frage scheint in erster Linie auf Meinungen zu beruhen. Bitte überlegen Sie sich eine Neuformulierung. Fragen Sie sich vielleicht, welche Arten von Data Science-Tools für C / C ++ verfügbar sind oder welche Arten von Anwendungen diese Sprachen verwenden.
Sheldonkreger

1
@sheldonkreger Das ist, was ich frage, ich werde das klarer machen, danke
Hack-R

1
Ich habe Waffeln (C ++) verwendet, um maschinelles Lernen in vorhandene C ++ - Engines zu integrieren.
Pete

@Pete, wenn Sie das in eine Antwort integrieren können, würde ich es wahrscheinlich als die Lösung markieren
Hack-R

1
Das Meta-Toolkit ist in C ++ verfügbar: meta-toolkit.github.io/meta . Es gibt einen Kurs auf Coursera, der ihn verwendet. Er befindet sich noch in Woche 1. Vielleicht möchten Sie einen Blick darauf werfen. Der Kurs heißt "Text Retrieval and Search Engines".
LauriK

Antworten:


35

Oder muss ich den größten Teil der Effizienz verlieren, die durch das Programmieren in C durch Aufrufen von R-Skripten oder anderen Sprachen erzielt wird?

Machen Sie das Gegenteil: Lernen Sie C / C ++, um R-Erweiterungen zu schreiben. Verwenden Sie C / C ++ nur für die leistungskritischen Bereiche Ihrer neuen Algorithmen. Verwenden Sie R, um Ihre Analyse zu erstellen, Daten zu importieren, Diagramme zu erstellen usw.

Wenn Sie über R hinausgehen möchten, würde ich empfehlen, Python zu lernen. Es stehen viele Bibliotheken zur Verfügung, z. B. Scikit-Learn für Algorithmen zum maschinellen Lernen oder PyBrain zum Erstellen neuronaler Netze usw. (und verwenden Sie pylab / matplotlib zum Plotten und iPython-Notebooks zum Entwickeln Ihrer Analysen). Auch hier ist C / C ++ nützlich, um zeitkritische Algorithmen als Python-Erweiterungen zu implementieren.


1
Danke, Andre. Ich benutze Pybrain sehr oft. Für mich ist Python ein Mittelweg zwischen R und C, aber ich wollte immer noch C lernen, um den Code schneller und umfassender anwenden zu können. Ich habe mich für diese Lösung entschieden, weil ich nicht daran gedacht hatte, R-Erweiterungen mit C / C ++ zu schreiben. Das ist eine wunderbare Idee, die ich unbedingt machen werde. Vielen Dank!!
Hack-R

1
Ich befürworte den Gedanken, Python zu lernen. Ich arbeite mit großen Datensätzen und Datenwissenschaftlern, die R verwenden, um diese Datensätze zu analysieren. Obwohl ich C in sehr jungen Jahren gelernt habe, ist Python die eine Sprache, die mir als Programmierer wirklich Wert gibt und diesen Datenwissenschaftlern hilft. Deshalb solltest du dem Team ein Kompliment machen, nicht dir selbst.
Glen Swan

1
In ähnlicher Weise wird Python beschleunigt, indem man in Cython schreibt (wieder im Grunde C). Ich muss sagen, dass ich es selbst noch nicht benutzt habe. Es gibt sehr wenig, was mit vorhandenen Bibliotheken nicht gemacht werden kann (zB Scikit-Learn, Pandas in Python [die in Cython geschrieben sind, müssen Sie also nicht!]).
Seanv507

Einige andere nützliche Python-Bibliotheken sind: Pandas, Numpy, Scipy usw. Hinzufügen, um Python zu lernen :)
Shagun Sodhani

Das ist genau richtig. Ich würde bemerken, dass, wenn Sie keinen CS-Hintergrund haben, die Chance, dass Sie Code effizienter schreiben als die zugrunde liegenden Funktionen für Python oder Pakete für R, ziemlich gering ist. Ich habe 13 Jahre lang in C ++ programmiert und denke immer noch, dass es Aspekte der Speicherverwaltung und der Leistungsoptimierung gibt, die ich nicht gut gemacht habe. Darüber hinaus haben Python & R sehr clevere Informatiker, die Distributionsprobleme optimieren, sodass C-Sprachen wirklich auf Systeme mit extrem niedriger Latenz verwiesen werden.
Jagartner

10

Wie Andre Holzner sagte, ist die Erweiterung von R um C / C ++ eine sehr gute Möglichkeit, das Beste von beiden Seiten zu nutzen. Sie können auch die inverse, mit C ++ arbeitende und gelegentlich aufrufende Funktion von R mit dem RInside-Paket o R ausprobieren. Hier finden Sie, wie

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

Sobald Sie in C ++ arbeiten, haben Sie viele Bibliotheken, von denen viele für bestimmte Probleme entwickelt wurden, andere allgemeiner

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

http://mlpack.org/


9

Ich bin damit einverstanden, dass der aktuelle Trend darin besteht, Python / R zu verwenden und es für rechenintensive Aufgaben an einige C / C ++ - Erweiterungen zu binden.

Wenn Sie jedoch in C / C ++ bleiben möchten, sollten Sie sich Dlib ansehen :

Dlib ist eine plattformübergreifende Allzweck-C ++ - Bibliothek, die unter Verwendung von Vertragsprogrammierung und modernen C ++ - Techniken entwickelt wurde. Es handelt sich um Open Source-Software, die unter der Boost-Softwarelizenz lizenziert ist.

Bildbeschreibung hier eingeben


Eine weitere sehr nützliche Antwort. Wissen Sie, ob wir dieses Bild frei reproduzieren dürfen (falls ich es in eine Präsentation oder einen Blog einfügen möchte, etc.)? Auch wenn es Dinge wie "> 20k Proben" sagt, frage ich mich, ob es wirklich "Proben" oder "Beobachtungen in Ihrer Probe" bedeutet?
Hack-R

2
Ich bin der Dlib-Autor. Fühlen Sie sich frei, dieses Bild zu posten, wo immer Sie wollen :). Außerdem bedeutet> 20k Samples, dass Sie 20k Vektoren oder was auch immer haben. Wie viele Variablen in jeder Stichprobe enthalten sind, ist ein separates Problem.
Davis King

@ Hack-R "Stichprobe" ist einer dieser überlasteten Begriffe im Bereich Statistik / Maschinelles Lernen, bei dem es sich manchmal um eine Menge von Instanzen handelt, die aus einer Grundgesamtheit stammen (wie in "Stichprobengröße", "Stichprobenmittelwert" usw.), und manchmal auch bedeutet die einzelnen Instanzen (wie in "einen Klassifikator auf 10K Proben trainiert").
Tim Goodman

6

Meiner Meinung nach wäre es ideal, um ein besserer Fachmann zu sein, mindestens eine Programmiersprache für die gängigsten Programmierparadigmen ( prozedural , objektorientiert , funktional ) zu kennen. Sicherlich betrachte ich R und Python als die beiden beliebtesten Programmiersprachen und -umgebungen für Data Science und daher als primäre Data Science-Tools.

Julia ist in gewisser Hinsicht beeindruckend, aber sie versucht, diese beiden aufzuholen und sich als wichtiges datenwissenschaftliches Werkzeug zu etablieren. Aber ich sehe nicht , dies in absehbarer Zeit geschieht, einfach aufgrund R / Python ‚s Beliebtheit , sehr große Gemeinden sowie enorme Ökosysteme von bestehenden und neu entwickelten Komponenten / Bibliotheken und deckt einen sehr weiten Bereich von Domains / Felder Studie.

Allerdings sind viele Pakete und Bibliotheken mit Schwerpunkt auf Data Science, ML und AI implementiert und / oder bieten APIs in anderen Sprachen als R oder Python an (zum Beweis siehe diese kuratierte Liste und diese kuratierte Liste , beide sind hervorragend und geben einen soliden Überblick über die Vielfalt auf dem Gebiet). Dies gilt insbesondere für leistungsorientierte oder spezialisierte Software. Für diese Software habe ich Projekte mit Implementierungen und / oder APIs gesehen, hauptsächlich in Java, C und C ++ (Java ist aufgrund seiner Nähe zu Hadoop und seinem Ökosystem im Big-Data- Segment der Datenwissenschaft besonders beliebt - und im NLPSegment), aber es stehen andere Optionen zur Verfügung, wenn auch in viel geringerem Umfang domänenbasiert. Keine dieser Sprachen ist Zeitverschwendung, Sie müssen jedoch die Beherrschung einiger oder aller Sprachen anhand Ihrer aktuellen Arbeitssituation, Ihrer Projekte und Interessen priorisieren . Um Ihre Frage zur Lebensfähigkeit von C / C ++ (und Java) zu beantworten, würde ich sagen, dass sie alle lebensfähig sind , jedoch nicht als primäres datenwissenschaftliches Tool, sondern als sekundäres .

Beantworten Sie Ihre Fragen zu 1) C als potenzielles Data-Science-Tool und 2) seiner Effizienz , so würde ich Folgendes sagen: 1) Es ist zwar möglich, C für Data Science zu verwenden, ich würde jedoch davon abraten, da Sie ein sehr effizientes Tool hätten Es ist schwierig, entsprechende Bibliotheken zu finden, oder, noch mehr, selbst zu versuchen, entsprechende Algorithmen zu implementieren. 2) Sie sollten sich keine Gedanken über die Effizienz machen, da viele leistungskritische Codesegmente in einfachen Sprachen wie C implementiert sind. Außerdem gibt es Optionen, um gängige datenwissenschaftliche Sprachen mit C zu verbinden (z. B. Rcpppackage for) Integration R mit C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Dies kommt zu einfacheren, aber oftmals sehr effektiven Leistungsansätzen wie der konsequenten Verwendung der Vektorisierung in R sowie der Verwendung verschiedener paralleler Programmierframeworks, -pakete und -bibliotheken hinzu. Beispiele für R ecosysteme finden Sie in der CRAN-Task-Ansicht "Hochleistungsfähiges und paralleles Rechnen mit R" .

In Bezug auf die Datenwissenschaft erscheint es mir sehr sinnvoll, die Wichtigkeit eines reproduzierbaren Forschungsansatzes sowie die Verfügbarkeit verschiedener Tools zu erwähnen , die dieses Konzept unterstützen (für weitere Einzelheiten siehe meine relevante Antwort ). Ich hoffe, dass meine Antwort hilfreich ist.


5

R ist eines der wichtigsten Tools für Data Scientist. Was auch immer Sie tun, hören Sie nicht auf, es zu verwenden.

Sprechen Sie jetzt über C, C ++ oder sogar Java. Sie sind gute Volkssprachen. Ob Sie sie brauchen oder brauchen werden, hängt von der Art des Jobs oder den Projekten ab, die Sie haben. Aus eigener Erfahrung gibt es so viele Tools für Data Scientists, dass Sie immer das Gefühl haben, ständig lernen zu müssen.

Sie können Python oder Matlab zu den Lerninhalten hinzufügen, wenn Sie dies möchten. Der beste Weg zu lernen ist, ein Arbeitsprojekt mit anderen Werkzeugen anzunehmen, mit denen Sie nicht vertraut sind. Wenn ich Sie wäre, würde ich Python vor C lernen. Es wird in der Community häufiger verwendet als C. Aber C zu lernen ist keine Zeitverschwendung.


Ich weiß, was du mit der überwältigenden Anzahl an Werkzeugen meinst! Ich sage meinem Praktikanten, er solle sich nicht ablenken lassen und sich nur auf ein oder zwei Dinge konzentrieren, aber es ist schwierig, meinen eigenen Rat zu befolgen.
Hack-R

5

Als Data Scientist sind die anderen Sprachen (C ++ / Java) nützlich, wenn Sie maschinelles Lernen in eine vorhandene Produktionsmaschine integrieren möchten.

Waffles ist sowohl eine gut gepflegte C ++ - Klassenbibliothek als auch ein Befehlszeilen-Analysepaket. Es bietet überwachtes und unbeaufsichtigtes Lernen, unzählige Tools zur Datenbearbeitung, Tools für spärliche Daten und andere Dinge wie die Audioverarbeitung. Da es sich auch um eine Klassenbibliothek handelt, können Sie sie nach Bedarf erweitern. Selbst wenn Sie nicht derjenige sind, der die C ++ - Engine entwickelt (wahrscheinlich nicht), können Sie auf diese Weise Prototypen erstellen, testen und den Entwicklern etwas übergeben.

Vor allem glaube ich, dass meine Kenntnisse in C ++ und Java mir wirklich helfen, die Funktionsweise von Python und R zu verstehen. Jede Sprache wird nur dann richtig verwendet, wenn Sie ein wenig verstehen, was darunter vor sich geht. Indem Sie die Unterschiede zwischen den Sprachen lernen, können Sie lernen, die Stärken Ihrer Hauptsprache zu nutzen.

Aktualisieren

Für kommerzielle Anwendungen mit großen Datenmengen ist Apache Spark - MLLib wichtig. Hier können Sie Scala, Java oder Python verwenden.


2

Ich würde gerne verstehen, warum Sie eine andere Sprache benötigen würden (abgesehen von Python), wenn Ihr Ziel "aber was ist mit fortgeschrittener Regression, maschinellem Lernen, Text Mining und anderen fortgeschrittenen statistischen Operationen".
Für so etwas ist C Zeitverschwendung. Es ist ein gutes Werkzeug, aber in den ~ 20 Jahren seit der Veröffentlichung von Java habe ich selten C codiert.
Wenn Sie die funktionalere Seite von R bevorzugen, lernen Sie Scala, bevor Sie sich mit zu vielen prozeduralen schlechten Gewohnheiten beim Codieren mit C auseinandersetzen .
lernen Schließlich Hadley Wickham-Bibliotheken verwenden - sie werden Sie tun , Datenmanipulation viel Zeit sparen.


Da Sprachen wie R und Python im Vergleich zu Sprachen wie C sehr langsam / ineffizient sind. Wenn Sie also mit vielen Daten und Berechnungen umgehen, ist es schneller, wenn Sie etwas in C tun können, als wenn Sie es in R tun können. Ich liebe und benutze Hadleys Päckchen tho!
Hack-R


1

Ich bin nicht sicher, ob es schon erwähnt wurde, aber es gibt auch Vowpal Wabbit, aber es könnte nur für bestimmte Arten von Problemen spezifisch sein.


1
Sieht interessant aus. Ich habe nur einen Blick auf den Link geworfen, aber die genannten Modelltypen wären sehr nützlich. Ist es eine reguläre C-Bibliothek, die Sie in einem Programm verwenden können? Ich werde weitere Nachforschungen anstellen müssen.
Hack-R

0

Werfen Sie einen Blick auf Intel DAAL, das gerade läuft. Es ist stark für die Intel-CPU-Architektur optimiert und unterstützt verteilte Berechnungen.


0

Skalierbare Lösungen für maschinelles Lernen für Big Data:

Ich werde meine $ .02 hinzufügen, da es einen Schlüsselbereich gibt, der anscheinend nicht in allen vorherigen Beiträgen behandelt wurde - maschinelles Lernen mit Big Data !

Für Big Data ist Skalierbarkeit der Schlüssel und R ist unzureichend. Darüber hinaus sind Sprachen wie Python und R nur für die Anbindung an skalierbare Lösungen nützlich, die normalerweise in anderen Sprachen geschrieben sind. Ich mache diese Unterscheidung nicht, weil ich diejenigen, die sie verwenden, herabsetzen möchte, sondern nur, weil es für Mitglieder der Data-Science-Community so wichtig ist, zu verstehen, wie wirklich skalierbare Lösungen für maschinelles Lernen aussehen.

Ich arbeite hauptsächlich mit Big Data auf verteilten Speicherclustern . Das heißt, ich verwende nicht nur einen 16-Core-Rechner (4 Quad-Core-Prozessoren auf einem einzigen Motherboard, das den Speicher dieses Motherboards gemeinsam nutzt), sondern einen kleinen Cluster von 64 16-Core-Rechnern. Die Anforderungen für diese Cluster mit verteiltem Speicher sind sehr unterschiedlich als für Umgebungen mit gemeinsamem Speicher, und das Lernen von Big-Data-Maschinen erfordert in vielen Fällen skalierbare Lösungen in Umgebungen mit verteiltem Speicher.

Wir verwenden C und C ++ auch überall in einem proprietären Datenbankprodukt. Alle unsere High-Level-Inhalte werden in C ++ und MPI verarbeitet, aber die Low-Level-Inhalte, die die Daten berühren, sind allesamt Longs und C-Style-Character-Arrays, um das Produkt sehr schnell zu halten. Die Bequemlichkeit von Standard-Strings ist den Rechenaufwand einfach nicht wert.

Es gibt nicht viele C ++ - Bibliotheken, die verteilte, skalierbare Funktionen für maschinelles Lernen bieten - MLPACK .

Es gibt jedoch andere skalierbare Lösungen mit APIs:

Apache Spark verfügt über eine skalierbare maschinelle Lernbibliothek namens MLib , mit der Sie eine Schnittstelle herstellen können.

Auch Tensorflow hat jetzt Tensorflow verteilt und hat eine C ++ API .

Hoffe das hilft!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.