Наука даних в C (або C ++)


40

Я Rмовний програміст. Я також в групі людей, яких вважають науковцями даних, але які виходять з наукових дисциплін, відмінних від CS.

Це добре справляється з моєю роллю вченого даних, однак, розпочинаючи свою кар’єру Rі маючи лише базові знання інших сценаріїв / веб-мов, я почувався дещо неадекватним у двох ключових сферах:

  1. Відсутність ґрунтовних знань з теорії програмування.
  2. Відсутність конкурентоспроможного рівня навичок у більш швидких та широко використовуваних мовах, таких як C, C++і Javaякі можна було б використати для збільшення швидкості конвеєра та обчислень Big Data, а також для створення продуктів DS / даних, які можна легше перетворити на швидкі резервні сценарії або автономні програми.

Рішення звичайно просте - перейдіть, вивчіть програмування, чим я займався, записавшись у деякі класи (зараз програмування на С).

Однак тепер, коли я починаю вирішувати проблеми №1 та №2 вище, я залишаюсь запитувати себе " Наскільки життєздатні такі мови, як Cі C++для Data Science? ".

Наприклад, я можу дуже швидко переміщувати дані та взаємодіяти з користувачами, але як бути з розширеною регресією, машинним навчанням, вилученням тексту та іншими більш досконалими статистичними операціями?

Тому. можна Cзробити роботу - які інструменти доступні для передової статистики, ML, AI та інших областей Science Data? Або я повинен втратити більшу частину ефективності, отриманої програмуванням, за Cдопомогою виклику Rсценаріїв або інших мов?

Найкращий ресурс, який я поки що знайшов у C, - це бібліотека під назвою Shark , яка дає C/ C++можливість використовувати підтримку векторних машин, лінійну регресію (нелінійну та інші розширені регресії, такі як багаточленний probit тощо) та шорт-лист інших (чудові, але) статистичні функції.


5
Це питання, як видається, грунтується насамперед на думках. Зверніть увагу на перефразовування. Можливо, запитайте, які види інструментів інформаційних даних доступні для C / C ++ або які програми використовують ці мови.
sheldonkreger

1
@sheldonkreger Ось про що я прошу, я це зроблю більш зрозумілим, дякую
Hack-R

1
Я використовував Waffles (C ++) для включення машинного навчання в існуючі двигуни C ++.
Піт

@Перечитайте, якщо ви можете включити це у відповідь, я, швидше за все, позначу це як рішення
Hack-R

1
Мета інструментарій доступний на C ++: meta-toolkit.github.io/meta . Є курс на Coursera, який його використовує, він ще на 1-му тижні, тому ви можете поглянути. Курс називається "Пошук тексту та пошукові системи".
LauriK

Відповіді:


35

Або я повинен втратити більшу частину ефективності, отриманої програмуванням на C, використовуючи R-скрипти або інші мови?

Зробіть навпаки: навчіться C / C ++ писати R розширення. Використовуйте C / C ++ лише для критичних розділів нових алгоритмів, використовуйте R для створення аналізу, імпорту даних, створення графіків тощо.

Якщо ви хочете вийти за межі R, рекомендую вивчити пітон. Існує багато бібліотек, таких як scikit-learn для алгоритмів машинного навчання або PyBrain для побудови нейронних мереж тощо (і використовувати pylab / matplotlib для побудови графіків та зошитів iPython для розробки ваших аналізів). Знову ж таки, C / C ++ корисно реалізовувати алгоритми, критичні за часом, як розширення python.


1
Спасибі, Андре. Я дуже використовую Pybrain; для мене Python - це середнє місце між R і C, але я все ж хотів вивчити C як для швидкості, так і для більш широкого застосування коду. Я вибрав це як рішення, тому що я не думав використовувати C / C ++ для написання розширень R, що є дійсно чудовою ідеєю, яку я абсолютно збираюся робити. Спасибі!!
Hack-R

1
Я друге поняття вивчення Python. Я працюю з великими наборами даних та науковцем даних, використовуючи R для аналізу цих наборів даних. Хоча я вивчав С ще в юному віці, Python - це одна мова, яка справді дає мені значення як програміста і допомагає цим вченим. Тому, дивіться, щоб зробити комплімент команді, а не собі.
Глен Лебедь

1
аналогічно python записується написанням на cython (знову ж таки C). Я мушу сказати, що ще не маю цього використовувати. Використовувати існуючі бібліотеки дуже мало (наприклад, scikit-learn, панди в python [які написані на cython, тому не потрібно!]).
seanv507

Деякі інші корисні бібліотеки пітона включають в себе: панда, NumPy, SciPy і т.д. Додавання цього в підтримці навчання пітона :)
Шагун Sodhani

Це місце на. Я зауважу, що якщо у вас немає CS-фону, шанс, що ви пишете код ефективніше, ніж основні функції для python або пакунків для R, є досить віддаленим. Я програмував на C ++ протягом 13 років, і все ще думаю, що є аспекти управління пам’яттю та оптимізація продуктивності, які я не робив добре. Крім того, у python & R є дуже розумні комп'ютерні вчені, що оптимізують питання розповсюдження, тому мови C справді будуть перенесені на екстремально низькі затримки.
jagartner

10

Як сказав Андре Хольцнер, розширення R за допомогою C / C ++ розширення - це дуже хороший спосіб скористатись кращими з обох сторін. Крім того, ви можете спробувати зворотну, працюючи з C ++ і випадково викликаючи функцію R з пакетом RInside o R. Тут ви можете дізнатися, як

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

Коли ви працюєте в C ++, у вас є багато бібліотек, багато з яких створені для конкретних проблем, інші більш загальні

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

http://mlpack.org/


9

Я погоджуюся, що поточна тенденція полягає в тому, щоб використовувати Python / R і прив’язувати його до деяких розширень C / C ++ для обчислювально дорогих завдань.

Однак якщо ви хочете залишитися в C / C ++, ви можете поглянути на Dlib :

Dlib - це універсальна міжплатформна бібліотека C ++, створена з використанням контрактного програмування та сучасних методів C ++. Це програмне забезпечення з відкритим кодом та ліцензоване під ліцензією Boost Software.

введіть тут опис зображення


Ще одна дуже корисна відповідь. Чи знаєте ви, чи дозволено нам вільно відтворювати це зображення (на випадок, якщо я хочу розмістити його у презентації чи блозі тощо)? Крім того, коли він говорить такі речі, як "> 20k зразки", мені цікаво, чи це насправді означає "зразки" чи "спостереження у вашій вибірці"?
Hack-R

2
Я автор dlib. Не соромтеся розміщувати це зображення де завгодно :). Крім того,> 20k зразків означає, що у вас є 20k векторів або що завгодно. Скільки змінних у кожному зразку - це окреме питання.
Кінг Девіса

@ Hack-R "Зразок" - це один із перевантажених термінів у статистиці / машинному навчанні, де іноді він означає набір екземплярів, витягнутих із сукупності (як "розмір вибірки", "середня вибірка" тощо), а іноді це означає окремі екземпляри (як у "підготовленому класифікаторі на 10K зразках").
Тім Гудман

6

На мою думку, в ідеалі, щоб бути більш чітким професіоналом, непогано було б знати хоча б одну мову програмування для найпопулярніших парадигм програмування ( процедурна , об’єктно-орієнтована , функціональна ). Безумовно, я розглядаю R і Python як дві найпопулярніші мови програмування та середовища для наукових даних і, отже, первинні засоби науки про дані.

Джулія вражає в певних аспектах, але намагається наздогнати це двоє і утвердитися як головний інструмент науки про дані. Тим НЕ менше, я не бачу це відбувається в найближчим часом, просто з - за R / Python «s популярності , дуже великі спільноти , а також величезні екосистеми існуючого і знову розроблені пакети / бібліотеки , покриваючи дуже широкий спектр областей / полів дослідження.

Сказавши це, багато пакетів і бібліотек, зосереджених на науці даних, областях ML та AI, реалізовані та / або надають API іншими мовами, ніж R або Python (для підтвердження див. Цей кураторний список і цей кураторний список , обидва з яких є чудовими та дають ґрунтовну точку зору на різноманітність у цій галузі). Особливо це стосується продуктивного або спеціалізованого програмного забезпечення. Для цього програмного забезпечення я бачив проекти з реалізацією та / або API, здебільшого на Java, C та C ++ (Java особливо популярна у великому сегменті даних даних - через близькість до Hadoop та її екосистеми - та в NLPсегмент), але інші варіанти доступні, хоча і в набагато більш обмеженій мірі, заснованій на домені. Жодна з цих мов не є марною витратою часу, однак вам доведеться розставити пріоритет у оволодінні будь-яким або всіма ними відповідно до вашої поточної робочої ситуації, проектів та інтересів. Отже, щоб відповісти на ваше запитання про життєздатність C / C ++ (і Java), я б сказав, що всі вони є життєздатними , але не як первинні засоби наукових даних, а як вторинні .

Відповідаючи на ваші запитання щодо 1) C як потенційного інструментарію науки про дані та 2) його ефективності , я б сказав, що: 1) хоча це можливо використовувати C для наукових даних, я б рекомендував не робити цього, тому що у вас буде дуже важкий час знайти відповідні бібліотеки або, тим більше, намагатися реалізувати відповідні алгоритми самостійно; 2) Ви не повинні турбуватися про ефективність, оскільки багато критично важливих для продуктивності сегменти коду реалізовані на мовах низького рівня, таких як C, плюс є варіанти інтерфейсу популярних мов наукових даних з, скажімо, С (наприклад, Rcppпакет для інтеграція R з C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Це на додаток до більш простих, але часто досить ефективних підходів до продуктивності, таких як послідовне використання векторизації в R, а також використання різних рамок паралельного програмування, пакетів і бібліотек. Для прикладів екосистеми R див. Перегляд завдань CRAN "Високопродуктивний та паралельний обчислення з R" .

Говорячи про науку про дані , я вважаю, що має досить багато сенсу згадати про важливість відтворюваного дослідницького підходу, а також про наявність різних інструментів , що підтримують цю концепцію (детальніше див. Мою відповідну відповідь ). Я сподіваюся, що моя відповідь корисна.


5

R - один з ключових інструментів для вченого, який ніколи не припиняє його використовувати.

Зараз ми говоримо про C, C ++ або навіть Java. Вони хороші популярні мови. Чим вони вам потрібні, чи вони вам знадобляться, залежить від типу роботи чи проектів. З особистого досвіду існує стільки інструментів для науковця, що завжди буде відчувати, що вам потрібно постійно вчитися.

Ви можете додати Python або Matlab до речей, щоб дізнатися, чи хочете, і продовжуйте додавати. Найкращий спосіб вчитися - це взяти на себе робочий проект, використовуючи інші інструменти, які вам не зручні. Якби я був ти, я пізнав би Python до C. Він більше використовується у спільноті, ніж C. Але навчання C - це не марно твого часу.


Я знаю, що ви маєте на увазі про переважну кількість інструментів! Я кажу своєму стажеру не відволікатися і зосередитись лише на 1 або 2 речах, але важко приймати власну пораду.
Hack-R

5

Інші мови (C ++ / Java), як учений даних, стають у нагоді, коли вам потрібно включити машинне навчання у існуючий механізм виробництва.

Waffles - це як доглянута бібліотека класів C ++, так і пакет аналізу командного рядка. Отримано під наглядом та без нагляду навчання, багато інструментів для маніпулювання даними, розріджені засоби передачі даних та інші речі, такі як обробка аудіо. Оскільки це також бібліотека класів, ви можете розширити її як потрібно. Навіть якщо ви не є тим, хто розробляє двигун C ++ (швидше за все, цього ви не будете), це дозволить вам прообразувати, протестувати і передавати щось розробникам.

Найголовніше, я вважаю, що мої знання C ++ та Java справді допомагають мені зрозуміти, як працюють Python та R. Будь-яка мова використовується належним чином лише тоді, коли ви трохи розумієте, що відбувається внизу. Вивчаючи відмінності між мовами, ви можете навчитися використовувати сильні сторони вашої основної мови.

Оновлення

Для комерційних програм із великими наборами даних важливим є Apache Spark - MLLib. Тут ви можете використовувати Scala, Java або Python.


2

Мені б хотілося зрозуміти, для чого вам потрібна інша мова (крім форми Python), якщо ваша мета - «а як щодо розширеної регресії, машинного навчання, пошуку тексту та інших більш досконалих статистичних операцій».
Для такої речі, С - це марна трата часу. Це хороший інструмент, але за ~ 20 років з часу появи Java я рідко кодував C.
Якщо ви віддаєте перевагу більш функціональній програмувальній стороні R, навчіться Scala, перш ніж потрапляти в занадто багато процедурних шкідливих звичок, що кодують C . І
нарешті навчитися використовувати бібліотеки Hadley Вікхем - вони заощадять вам багато часу на виконання маніпуляції з даними.


Оскільки такі мови, як R і Python, дуже повільні / неефективні в порівнянні з мовами, такими як C. Таким чином, при роботі з великою кількістю даних і обчислень, якщо ви можете зробити щось на C, це швидше, ніж якщо ви можете це зробити в R. Я люблю і використовую Пакети Хедлі тхо!
Hack-R


1

Не впевнений, чи це вже згадувалося, але також є wabpal wabbit, але це може бути характерно лише для певних типів проблем.


1
Виглядає цікаво. Я лише поглянув на посилання, але згадані типи моделей були б дуже корисними. Це звичайна бібліотека С, яку ви можете використовувати в програмі? Мені доведеться далі розслідувати.
Hack-R

0

Погляньте на Intel DAAL, який зараз триває. Він оптимізований для архітектури процесора Intel та підтримує розподілені обчислення.


0

Масштабовані рішення для машинного навчання для великих даних:

Я додам свої $ 02, оскільки є ключова область, яка, здається, не була розглянута у всіх попередніх публікаціях - машинне навчання на великих даних !

Для великих даних масштабованість є ключовою, а R - недостатньою. Крім того, такі мови, як Python та R, корисні лише для взаємодії зі масштабованими рішеннями, які зазвичай пишуться іншими мовами. Я відрізняю це не тому, що хочу знехтувати тих, хто їх використовує, а лише тому, що це так важливо, щоб члени спільноти наукових даних розуміли, як виглядають справді масштабовані рішення машинного навчання.

Більшу частину роботи я роблю з великими даними про розподілені кластери пам'яті . Тобто я не використовую лише одну 16-ядерну машину (4 чотирьохядерні процесори на одній материнській платі, що обмінюється пам’яттю цієї материнської плати), я використовую невеликий кластер із 64 16-ядерних машин. Вимоги до цих кластерів розподіленої пам’яті сильно відрізняються, ніж для середовищ спільної пам’яті, а машинне навчання великих даних вимагає масштабованих рішень у середовищах розподіленої пам’яті у багатьох випадках.

Ми також використовуємо C та C ++ скрізь у межах власного продукту бази даних. Усі наші матеріали високого рівня обробляються в C ++ та MPI, але низький рівень даних, який стосується даних, - це все довго і масиви символів стилю C, щоб продукт дуже швидко зберігався. Зручність рядків std просто не вартує обчислювальних витрат.

Існує не так багато бібліотек C ++, які пропонують розподілені, масштабовані можливості машинного навчання - MLPACK .

Однак є й інші масштабовані рішення з API:

Apache Spark має масштабовану бібліотеку машинного навчання під назвою MLib, з якою ви можете взаємодіяти.

Також компанія Tensorflow тепер розповсюдила тензорфлоу і має C ++ api .

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.