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

40

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

Это хорошо работает в моей роли Data Scientist, однако, начав свою карьеру Rи имея только базовые знания других скриптовых / веб-языков, я чувствовал себя несколько неадекватно в 2 ключевых областях:

  1. Отсутствие глубоких знаний теории программирования.
  2. Отсутствие конкурентного уровня навыков в более быстрых и более широко используемых языках, таких как C, C++и Java, которые могут быть использованы для увеличения скорости конвейера и вычислений больших данных, а также для создания продуктов DS / данных, которые могут быть более быстро превращены в быстрые серверные скрипты или автономные приложения.

Решение, конечно, простое - изучите программирование, и это то, чем я занимаюсь, записавшись на некоторые классы (в настоящее время программирование на Си).

Однако теперь, когда я начинаю решать проблемы № 1 и № 2 выше, я задаюсь вопросом: « Насколько жизнеспособны такие языки, как Cи C++для Data Science? ».

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

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

Лучший ресурс, который я нашел до сих пор в C, - это библиотека под названием Shark , которая дает C/ C++возможность использовать машины опорных векторов, линейную регрессию (не нелинейную и другие продвинутые регрессии, такие как многочленный пробит и т. Д.) И краткий список других (здорово, но) статистические функции.

Hack-R,
источник
5
Этот вопрос, по-видимому, прежде всего основан на мнении. Пожалуйста, подумайте перефразируя. Может быть, спросите, какие инструменты для обработки данных доступны для C / C ++ или какие приложения используют эти языки.
Шелдонкрегер
1
@sheldonkreger Это то, что я спрашиваю, я сделаю это более ясным, спасибо
Hack-R
1
Я использовал Waffles (C ++) для включения машинного обучения в существующие движки C ++.
Пит
@ Пит, если ты сможешь включить это в ответ, я, скорее всего, отмечу это как решение
Hack-R
1
Мета-инструментарий доступен на C ++: meta-toolkit.github.io/meta . Есть курс на Coursera, который использует его, он все еще на первой неделе, так что вы можете посмотреть. Курс называется «Поиск текста и поисковые системы».
LauriK

Ответы:

35

Или я должен потерять большую часть эффективности, получаемой при программировании на C, вызывая R-скрипты или другие языки?

Сделайте обратное: изучите C / C ++ для написания R-расширений. Используйте C / C ++ только для критических с точки зрения производительности разделов ваших новых алгоритмов, используйте R для построения анализа, импорта данных, составления графиков и т. Д.

Если вы хотите выйти за рамки R, я бы порекомендовал изучать Python. Доступно много библиотек, таких как scikit-learn для алгоритмов машинного обучения или PyBrain для построения нейронных сетей и т. Д. (И используйте pylab / matplotlib для построения графиков и записные книжки iPython для разработки анализа). Опять же, C / C ++ полезен для реализации критичных ко времени алгоритмов в качестве расширений Python.

Андре Хольцнер
источник
1
Спасибо, Андре. Я часто использую Pybrain; для меня Python - это нечто среднее между R и C, но я все же хотел изучить C как для скорости, так и для более широкого применения кода. Я выбрал это как решение, потому что я не думал об использовании C / C ++ для написания расширений R, что является действительно замечательной идеей, которую я обязательно собираюсь сделать. Благодарность!!
Hack-R
1
Я второе понятие изучения Python. Я работаю с большими наборами данных и специалистом по данным, использующим R для анализа этих наборов данных. Хотя я выучил C в очень раннем возрасте, Python - это единственный язык, который действительно дает мне ценность как программисту и помогает этим ученым в области данных. Поэтому ищи комплимент команде, а не себе.
Глен Свон
1
Точно так же Python ускоряется написанием на Cython (опять же в основном C). Я должен сказать, что еще не использовал это сам. Очень мало того, что нельзя сделать с помощью существующих библиотек (например, scikit-learn, pandas на python [которые написаны на cython, поэтому вам не нужно!]).
seanv507
Некоторые другие полезные библиотеки Python включают в себя: панды, Numpy, Scipy и т. Д. Добавление этого в поддержку изучения Python :)
Shagun Sodhani
Это место. Я хотел бы отметить, что если у вас нет фона CS, вероятность того, что вы будете писать код более эффективно, чем базовые функции для python или пакетов для R, весьма мала. Я программировал на C ++ 13 лет и до сих пор думаю, что есть аспекты управления памятью и оптимизации производительности, которые мне не очень понравились. Кроме того, в Python & R есть очень умные компьютерные специалисты, которые оптимизируют вопросы распространения, поэтому языки Си действительно будут переведены в системы с крайне низкой задержкой.
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/

D.Castro
источник
9

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

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

Dlib - это универсальная кроссплатформенная библиотека C ++, разработанная с использованием контрактного программирования и современных методов C ++. Это программное обеспечение с открытым исходным кодом и лицензируется в рамках Boost Software License.

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

Франк Дернонкур
источник
Еще один очень полезный ответ. Знаете ли вы, разрешено ли нам свободно воспроизводить это изображение (в случае, если я хочу разместить его в презентации или блоге и т. Д.)? Кроме того, когда он говорит что-то вроде «> 20 тыс. Выборок», мне интересно, действительно ли это означает «выборки» или «наблюдения в вашей выборке»?
Hack-R
2
Я автор dlib. Не стесняйтесь размещать это изображение, где вы хотите :). Кроме того,> 20 тыс. Образцов означает, что у вас есть 20 тыс. Векторов или что-то еще Сколько переменных в каждом образце - это отдельная проблема.
Дэвис Кинг,
@ 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, плюс есть опции для взаимодействия популярных языков науки с, скажем, 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 не является пустой тратой вашего времени.

Сервайс Далигу
источник
Я знаю, что вы имеете в виду по поводу огромного количества инструментов! Я говорю своему стажеру не отвлекаться и сосредотачиваться только на одной или двух вещах, но мне трудно принять мой собственный совет.
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
2

Существует несколько инструментов C ++ для статистики и науки о данных, таких как ROOT https://root.cern.ch/drupal/ , BAT https://www.mppmu.mpg.de/bat/ , boost или OpenCV.

гость
источник
Потрясающе! Спасибо. Я только хотел бы, чтобы они были для простого C тоже, но все же полезно.
Hack-R
1

Не уверен, было ли это упомянуто, но есть также ваубальный вапбит, но он может быть специфичным только для определенных видов проблем.

Фелипе Алмейда
источник
1
Выглядит интересно. Я только взглянул на ссылку, но упомянутые типы моделей были бы очень полезны. Это обычная библиотека C, которую вы можете использовать в программе? Мне придется расследовать дальше.
Hack-R
0

Взгляните на Intel DAAL, который идет полным ходом. Он высоко оптимизирован для архитектуры процессоров Intel и поддерживает распределенные вычисления.

0x1337
источник
0

Масштабируемые решения для машинного обучения для больших данных:

Я добавлю свои $ .02, потому что есть ключевая область, которая, кажется, не была рассмотрена во всех предыдущих постах - машинное обучение на больших данных !

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

Я делаю большую часть своей работы с большими данными на кластерах распределенной памяти . То есть я не просто использую одну 16-ядерную машину (4 четырехъядерных процессора на одной материнской плате, разделяющей память этой материнской платы), я использую небольшой кластер из 64 16-ядерных машин. Требования для этих кластеров распределенной памяти сильно отличаются от требований к средам с общей памятью, и машинное обучение с большими данными во многих случаях требует масштабируемых решений в средах распределенной памяти.

Мы также используем C и C ++ везде в рамках проприетарного продукта базы данных. Все наши высокоуровневые вещи обрабатываются в C ++ и MPI, но низкоуровневые вещи, которые касаются данных, - это все longs и массивы символов в стиле C, чтобы поддерживать продукт очень очень быстрым. Удобство строк std просто не стоит вычислительных затрат.

Существует не так много доступных библиотек C ++, которые предлагают распределенные, масштабируемые возможности машинного обучения - MLPACK .

Однако есть и другие масштабируемые решения с API:

Apache Spark имеет масштабируемую библиотеку машинного обучения MLib, с которой вы можете взаимодействовать.

Также Tensorflow теперь имеет распределенный тензор потока и имеет API C ++ .

Надеюсь это поможет!

AN6U5
источник