Ciência de dados em C (ou C ++)

40

Sou Rprogramador de idiomas. Também faço parte do grupo de pessoas que são consideradas cientistas de dados, mas que vêm de outras disciplinas acadêmicas que não a CS.

Isso funciona bem no meu papel de cientista de dados, no entanto, ao iniciar minha carreira Re ter apenas o conhecimento básico de outras linguagens de script / web, me senti um tanto inadequado em duas áreas principais:

  1. Falta de um sólido conhecimento da teoria da programação.
  2. Falta de um nível competitivo de habilidades em linguagens mais rápidas e amplamente usadas, como C, C++e Java, que poderiam ser utilizadas para aumentar a velocidade do pipeline e os cálculos de Big Data, além de criar produtos de DS / dados que podem ser mais rapidamente desenvolvidos em rápido scripts de back-end ou aplicativos independentes.

A solução é simples, é claro - aprenda sobre programação, que é o que tenho feito ao me matricular em algumas aulas (atualmente em programação C).

No entanto, agora que estou começando a resolver os problemas 1 e 2 acima, fico me perguntando " quão viáveis ​​são as linguagens Ce C++a Ciência de Dados? ".

Por exemplo, posso mover dados muito rapidamente e interagir muito bem com os usuários, mas e quanto à regressão avançada, Machine Learning, mineração de texto e outras operações estatísticas mais avançadas?

Tão. pode Cfazer o trabalho - quais ferramentas estão disponíveis para estatísticas avançadas, ML, AI e outras áreas da ciência de dados? Ou devo perder a maior parte da eficiência obtida com a programação Cchamando Rscripts ou outros idiomas?

O melhor recurso que encontrei até agora em C é uma biblioteca chamada Shark , que oferece C/ C++a capacidade de usar Máquinas de Vetor de Suporte, regressão linear (não-linear e outra regressão avançada como probit multinomial, etc.) e uma lista restrita de outras (ótimas, mas) funções estatísticas.

Hack-R
fonte
5
Esta questão parece ser primariamente baseada em opiniões. Por favor, considere reformular. Talvez pergunte que tipos de ferramentas de ciência de dados estão disponíveis para C / C ++ ou que tipos de aplicativos usam essas linguagens.
Sheldonkreger 20/03/2015
11
@sheldonkreger Isso é o que eu estou pedindo, eu vou fazer que mais claras, graças
Hack-R
11
Usei Waffles (C ++) para incorporar o aprendizado de máquina aos mecanismos C ++ existentes.
Pete
@Pete se você pode incorporar em que uma resposta que eu seria provável que marcá-lo como a solução
Hack-R
11
O Meta Toolkit está disponível em C ++: meta-toolkit.github.io/meta . Há um curso no Coursera que o utiliza, ainda está na semana 1, então você pode dar uma olhada. O curso é chamado de "Recuperação de texto e mecanismos de pesquisa".
23715 LauriK

Respostas:

35

Ou devo perder a maior parte da eficiência obtida pela programação em C chamando scripts R ou outras linguagens?

Faça o oposto: aprenda C / C ++ para escrever extensões R. Use C / C ++ apenas para as seções críticas de desempenho de seus novos algoritmos, use R para criar sua análise, importar dados, fazer gráficos etc.

Se você quiser ir além do R, recomendo aprender python. Existem muitas bibliotecas disponíveis, como o scikit-learn para algoritmos de aprendizado de máquina ou o PyBrain para construção de redes neurais etc. (e use pylab / matplotlib para plotagem e notebooks iPython para desenvolver suas análises). Novamente, o C / C ++ é útil para implementar algoritmos de tempo crítico como extensões python.

Andre Holzner
fonte
11
Obrigado, Andre. Eu uso muito o Pybrain; para mim, Python é um campo intermediário entre R e C, mas eu ainda queria aprender C para velocidade e aplicação mais ampla do código. Selecionei isso como a solução, porque não tinha pensado em usar C / C ++ para escrever extensões R, o que é uma ideia realmente maravilhosa que eu absolutamente vou fazer. Obrigado!!
Hack-R
11
Eu apóio a noção de aprender Python. Trabalho com grandes conjuntos de dados e cientista de dados utilizando R para analisar esses conjuntos de dados. Embora eu tenha aprendido C muito cedo, Python é a única linguagem que realmente está me valorizando como programador e ajudando esses cientistas de dados. Portanto, procure elogiar a equipe, não a si mesmo.
Glen Swan
11
da mesma forma, o python é acelerado escrevendo em cython (novamente basicamente C). Eu tenho que dizer que ainda tenho que usá-lo. Há muito pouco que não pode ser feito usando bibliotecas existentes (por exemplo, scikit-learn, pandas em python [que são escritos em cython para que você não precise!]).
precisa saber é o seguinte
Algumas outras bibliotecas python úteis incluem: pandas, numpy, scipy etc. adicionando este em apoio de aprender python :)
Shagun Sodhani
Este é o local. Eu observaria que, se você não possui um background em CS, a chance de escrever código com mais eficiência do que as funções subjacentes para python ou pacotes para R é bastante remota. Programei em C ++ por 13 anos e ainda acho que há aspectos de gerenciamento de memória e otimização de desempenho que eu não fiz bem. Além disso, python & R têm cientistas de computação muito inteligentes que otimizam problemas de distribuição, para que as linguagens C sejam realmente relegadas a sistemas de latência extremamente baixa.
Jagartner 18/08
10

Como Andre Holzner disse, estender o R ​​com extensão C / C ++ é uma maneira muito boa de aproveitar o melhor dos dois lados. Além disso, você pode tentar o inverso, trabalhando com C ++ e ocasionalmente chamando a função de R com o pacote RInside o R. Aqui você pode descobrir como

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

Quando você trabalha em C ++, você tem muitas bibliotecas, muitas delas criadas para problemas específicos, outras mais gerais.

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

http://mlpack.org/

D.Castro
fonte
9

Concordo que a tendência atual é usar Python / R e vinculá-lo a algumas extensões C / C ++ para tarefas computacionalmente caras.

No entanto, se você quiser permanecer no C / C ++, poderá dar uma olhada no Dlib :

Dlib é uma biblioteca C ++ multiplataforma de uso geral projetada usando programação de contrato e técnicas modernas de C ++. É um software de código aberto e licenciado sob a Boost Software License.

insira a descrição da imagem aqui

Franck Dernoncourt
fonte
Outra resposta altamente útil. Você sabe se temos permissão para reproduzir livremente essa imagem (caso queira colocá-la em uma apresentação ou blog, etc.)? Além disso, quando diz coisas como "> 20k amostras", eu me pergunto se realmente significa "amostras" ou "observações na sua amostra"?
Hack-R
2
Eu sou o autor dlib. Sinta-se livre para postar essa imagem onde quiser :). Além disso,> 20k amostras significa que você tem 20k vetores ou o que for. Quantas variáveis ​​existem em cada amostra é um problema separado.
Davis rei
@ Hack-R "Amostra" é um daqueles termos sobrecarregados em estatísticas / aprendizado de máquina, onde às vezes significa um conjunto de instâncias extraídas de uma população (como em "tamanho da amostra", "média da amostra" etc.) e outras vezes significa as instâncias individuais (como em "treinou um classificador em 10 mil amostras").
Tim Goodman
6

Na minha opinião, idealmente, para ser um profissional mais completo , seria bom conhecer pelo menos uma linguagem de programação para os paradigmas de programação mais populares ( processual , orientado a objetos , funcional ). Certamente, considero R e Python as duas linguagens e ambientes de programação mais populares para ciência de dados e, portanto, ferramentas primárias de ciência de dados.

Julia é impressionante em certos aspectos, mas tenta alcançá-los e se estabelecer como uma importante ferramenta de ciência de dados. No entanto, eu não vejo isso acontecendo tão cedo, simplesmente devido ao R / Python 's popularidade , muito grandes comunidades , bem como enormes ecossistemas de existentes e recentemente desenvolvidos pacotes / bibliotecas , cobrindo uma vasta gama de domínios / campos de estude.

Dito isto, muitos pacotes e bibliotecas, focados nas áreas de ciência de dados, ML e AI, são implementados e / ou fornecem APIs em linguagens diferentes de R ou Python (para a prova, veja esta lista com curadoria e esta lista com curadoria , ambas as quais são excelentes e oferecem uma perspectiva sólida sobre a variedade no campo). Isto é especialmente verdade para software especializado ou orientado para o desempenho . Para esse software, eu vi projetos com implementação e / ou APIs principalmente em Java, C e C ++ (Java é especialmente popular no segmento de big data da ciência de dados - devido à sua proximidade com o Hadoop e seu ecossistema - e na PNLsegmento), mas outras opções estão disponíveis, embora em uma extensão muito mais limitada, baseada em domínio. Nenhum desses idiomas é uma perda de tempo; no entanto, é necessário priorizar o domínio de um ou de todos eles com a sua situação de trabalho, projetos e interesses atuais. Portanto, para responder sua pergunta sobre a viabilidade do C / C ++ (e Java), eu diria que todos eles são viáveis , mas não como ferramentas primárias de ciência de dados, mas como ferramentas secundárias .

Respondendo às suas perguntas sobre 1) C como uma ferramenta potencial de ciência de dados e 2) sua eficiência , eu diria que: 1) embora seja possível usar C para ciência de dados, eu recomendaria não fazê-lo, porque você teria muito dificuldade em encontrar bibliotecas correspondentes ou, ainda mais, tentando implementar os algoritmos correspondentes por si mesmo; 2) você não deve se preocupar com eficiência, pois muitos segmentos de código críticos para o desempenho são implementados em linguagens de baixo nível como C, além disso, existem opções para fazer a interface de linguagens populares de ciência de dados com, digamos, C (por exemplo, Rcpppacote para integração R com C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html) Além de abordagens mais simples, mas geralmente bastante eficazes, ao desempenho, como o uso consistente de vetorização em R e o uso de várias estruturas de programação paralela, pacotes e bibliotecas. Para obter exemplos de ecossistema R, consulte Visão da tarefa CRAN "Computação paralela e de alto desempenho com R" .

Falando sobre ciência de dados , acho que faz muito sentido mencionar a importância da abordagem de pesquisa reproduzível , bem como a disponibilidade de várias ferramentas , suportando esse conceito (para mais detalhes, consulte minha resposta relevante ). Espero que minha resposta seja útil.

Aleksandr Blekh
fonte
5

R é uma das principais ferramentas para o cientista de dados, o que quer que você faça não para de usá-lo.

Agora falando sobre C, C ++ ou mesmo Java. São boas línguas populares. Se você precisa ou vai depender do tipo de trabalho ou projeto que possui. Por experiência pessoal, existem tantas ferramentas disponíveis para o cientista de dados que você sempre sentirá que precisa constantemente aprender.

Você pode adicionar Python ou Matlab a coisas para aprender se quiser e continuar adicionando. A melhor maneira de aprender é assumir um projeto de trabalho usando outras ferramentas com as quais você não se sente confortável. Se eu fosse você, aprenderia Python antes do C. É mais usado na comunidade do que C. Mas aprender C não é uma perda de tempo.

servais daligou
fonte
Eu sei o que você quer dizer com o grande número de ferramentas! Eu digo ao meu estagiário para não se distrair e se concentrar em apenas 1 ou 2 coisas, mas é difícil seguir meu próprio conselho.
Hack-R
5

Como cientista de dados, as outras linguagens (C ++ / Java) são úteis quando você precisa incorporar o aprendizado de máquina a um mecanismo de produção existente.

Waffles é uma biblioteca de classes C ++ bem mantida e um pacote de análise de linha de comando. Possui aprendizado supervisionado e não supervisionado, toneladas de ferramentas de manipulação de dados, ferramentas de dados esparsas e outras coisas, como processamento de áudio. Como também é uma biblioteca de classes, você pode estendê-la conforme necessário. Mesmo que você não desenvolva o mecanismo C ++ (é provável que não o seja), isso permitirá que você protótipo, teste e entregue algo aos desenvolvedores.

Mais importante, acredito que meu conhecimento de C ++ e Java realmente me ajuda a entender como o Python e o R funcionam. Qualquer idioma é usado apenas corretamente quando você entende um pouco sobre o que está acontecendo por baixo. Ao aprender as diferenças entre os idiomas, você pode aprender a explorar os pontos fortes do seu idioma principal.

Atualizar

Para aplicativos comerciais com grandes conjuntos de dados, o Apache Spark - MLLib é importante. Aqui você pode usar Scala, Java ou Python.

Pete
fonte
2

Eu gostaria de entender por que você precisaria de outra linguagem (além do Python) se seu objetivo for "mas o que dizer de regressão avançada, aprendizado de máquina, mineração de texto e outras operações estatísticas mais avançadas".
Para esse tipo de coisa, C é uma perda de tempo. É uma boa ferramenta para se ter, mas nos ~ 20 anos desde que o Java foi lançado, eu raramente codifiquei C.
Se você prefere o lado da programação mais funcional do R, aprenda o Scala antes de entrar em muitos maus hábitos de procedimento codificando com C .
Finalmente aprender a usar as bibliotecas do Hadley Wickham - que vai lhe poupar uma grande quantidade de tempo fazendo manipulação de dados.

Michael Cox
fonte
Como linguagens como R e Python são muito lentas / ineficientes em comparação com linguagens como C. Portanto, ao lidar com muitos dados e cálculos, se você pode fazer algo em C, é mais rápido do que se você puder fazer em R. Eu amo e uso Os pacotes de Hadley!
Hack-R
2

Existem algumas ferramentas C ++ para estatística e ciência de dados como ROOT https://root.cern.ch/drupal/ , BAT https://www.mppmu.mpg.de/bat/ , boost ou OpenCV

hóspede
fonte
Impressionante! Obrigado. Eu só queria que eles fossem para C simples também, mas ainda assim útil.
Hack-R
1

Não tenho certeza se isso já foi mencionado, mas também há o wabbit vowpal, mas pode ser específico apenas a certos tipos de problemas.

Felipe Almeida
fonte
11
Parece interessante. Apenas olhei para o link, mas os tipos de modelos mencionados seriam altamente úteis. É uma biblioteca C regular que você pode usar em um programa? Vou ter que investigar mais.
Hack-R
0

Dê uma olhada no Intel DAAL, que está em andamento. É altamente otimizado para a arquitetura de CPU Intel e suporta cálculos distribuídos.

0x1337
fonte
0

Soluções escaláveis ​​de aprendizado de máquina para Big Data:

Adicionarei meu $ .02 porque há uma área-chave que parece não ter sido abordada em todas as postagens anteriores - aprendizado de máquina em big data !

Para big data, a escalabilidade é essencial e R é insuficiente. Além disso, linguagens como Python e R são úteis apenas para interface com soluções escalonáveis ​​que geralmente são escritas em outras linguagens. Faço essa distinção não porque quero menosprezar quem os usa, mas apenas porque é tão importante para os membros da comunidade de ciência de dados entender como são as soluções de aprendizado de máquina verdadeiramente escaláveis.

Eu faço a maior parte do meu trabalho com big data em clusters de memória distribuída . Ou seja, eu não uso apenas uma máquina de 16 núcleos (4 processadores quad core em uma única placa-mãe compartilhando a memória dessa placa-mãe), uso um pequeno cluster de 64 máquinas de 16 núcleos. Os requisitos são muito diferentes para esses clusters de memória distribuída e para ambientes de memória compartilhada, e o aprendizado de máquina de big data requer soluções escaláveis ​​em ambientes de memória distribuída em muitos casos.

Também usamos C e C ++ em qualquer lugar dentro de um produto de banco de dados proprietário. Todas as nossas coisas de alto nível são tratadas em C ++ e MPI, mas as coisas de baixo nível que tocam nos dados são longas e matrizes de caracteres no estilo C para manter o produto muito rapidamente. A conveniência das strings std simplesmente não vale o custo computacional.

Não há muitas bibliotecas C ++ disponíveis que ofereçam recursos de aprendizado de máquina escalonáveis ​​e distribuídos - MLPACK .

No entanto, existem outras soluções escaláveis ​​com APIs:

O Apache Spark possui uma biblioteca de aprendizado de máquina escalável chamada MLib com a qual você pode interagir.

Além disso, o Tensorflow agora distribuiu o tensorflow e possui uma API C ++ .

Espero que isto ajude!

AN6U5
fonte