Ciencia de datos en C (o C ++)

40

Soy un Rprogramador de idiomas. También estoy en el grupo de personas que se consideran científicos de datos pero que provienen de disciplinas académicas distintas de la CS.

Sin embargo, esto funciona bien en mi papel como Científico de Datos, al comenzar mi carrera Ry tener solo conocimientos básicos de otros lenguajes de secuencias de comandos / web, me he sentido algo inadecuado en 2 áreas clave:

  1. Falta de un conocimiento sólido de la teoría de la programación.
  2. Falta de un nivel competitivo de habilidad en lenguajes más rápidos y de mayor uso como C, C++y Java, que podría utilizarse para aumentar la velocidad de la tubería y los cálculos de Big Data, así como para crear productos de DS / datos que pueden desarrollarse más rápidamente scripts de back-end o aplicaciones independientes.

La solución es simple, por supuesto: vaya a aprender sobre programación, que es lo que he estado haciendo al inscribirme en algunas clases (actualmente programación en C).

Sin embargo, ahora que estoy empezando a abordar los problemas # 1 y # 2 anteriores, me pregunto " ¿CC++ Qué tan viables son los lenguajes y para Data Science? ".

Por ejemplo, puedo mover datos rápidamente e interactuar con los usuarios perfectamente, pero ¿qué pasa con la regresión avanzada, el aprendizaje automático, la minería de texto y otras operaciones estadísticas más avanzadas?

Asi que. puede Chacer el trabajo: ¿qué herramientas están disponibles para estadísticas avanzadas, ML, AI y otras áreas de la ciencia de datos? ¿O debo perder la mayor parte de la eficiencia obtenida programando Cinvocando Rscripts u otros lenguajes?

El mejor recurso que he encontrado hasta ahora en C es una biblioteca llamada tiburón , lo que da C/ C++la capacidad de utilizar las máquinas de vectores de soporte, la regresión lineal (no no lineal y otra de regresión probit multinomial avanzada como, etc) y una lista de otros (genial pero) funciones estadísticas.

Hack-R
fuente
55
Esta pregunta parece estar basada principalmente en la opinión. Por favor considere reformular. Tal vez pregunte qué tipos de herramientas de ciencia de datos están disponibles para C / C ++, o qué tipos de aplicaciones usan estos lenguajes.
sheldonkreger
1
@sheldonkreger Eso es lo que estoy preguntando, lo dejaré más claro, gracias
Hack-R
1
He usado Waffles (C ++) para incorporar el aprendizaje automático en los motores C ++ existentes.
Pete
@Pete, si puedes incorporar eso en una respuesta, es probable que lo marque como la solución
Hack-R el
1
Meta toolkit está disponible en C ++: meta-toolkk.github.io/meta . Hay un curso en Coursera que lo usa, todavía está en la semana 1, por lo que es posible que desee echar un vistazo. El curso se llama "Recuperación de texto y motores de búsqueda".
LauriK

Respuestas:

35

¿O debo perder la mayor parte de la eficiencia obtenida al programar en C al invocar scripts R u otros lenguajes?

Haga lo contrario: aprenda C / C ++ para escribir extensiones R. Use C / C ++ solo para las secciones críticas de rendimiento de sus nuevos algoritmos, use R para construir su análisis, importar datos, hacer gráficos, etc.

Si quieres ir más allá de R, te recomiendo aprender Python. Hay muchas bibliotecas disponibles, como scikit-learn para algoritmos de aprendizaje automático o PyBrain para construir redes neuronales, etc. (y use pylab / matplotlib para trazar y cuadernos iPython para desarrollar sus análisis). Nuevamente, C / C ++ es útil para implementar algoritmos de tiempo crítico como extensiones de Python.

Andre Holzner
fuente
1
Gracias Andre. Yo uso mucho Pybrain; para mí Python es un término medio entre R y C, pero todavía quería aprender C para la velocidad y la aplicación más amplia del código. Seleccioné esto como la solución porque no había pensado en usar C / C ++ para escribir extensiones R, lo cual es una idea realmente maravillosa que voy a hacer absolutamente. ¡¡Gracias!!
Hack-R
1
Secundo la noción de aprender Python. Trabajo con grandes conjuntos de datos y científicos de datos utilizando R para analizar esos conjuntos de datos. Aunque aprendí C a una edad muy temprana, Python es el único lenguaje que realmente me da valor como programador y ayuda a estos científicos de datos. Por lo tanto, busca felicitar al equipo, no a ti mismo.
Glen Swan
1
De manera similar, Python se acelera escribiendo en Cython (de nuevo básicamente C). Tengo que decir que todavía tengo que usarlo. Es muy poco lo que no se puede hacer con las bibliotecas existentes (p. Ej., Scikit-learn, pandas en python [que están escritas en cython para que no tenga que hacerlo]).
seanv507
Algunas otras bibliotecas de python útiles incluyen: pandas, numpy, scipy, etc. Agregar esto en apoyo del aprendizaje de python :)
Shagun Sodhani
Esto es perfecto. Me gustaría señalar que si no tiene un fondo CS, la posibilidad de escribir código de manera más eficiente que las funciones subyacentes para python o paquetes para R es bastante remota. Programé en C ++ durante 13 años y sigo pensando que hay aspectos de la gestión de la memoria y la optimización del rendimiento que no hice bien. Además, python & R tienen científicos informáticos muy inteligentes que optimizan los problemas de distribución, por lo que los lenguajes C realmente se relegarán a sistemas de latencia extremadamente baja.
jagartner
10

Como Andre Holzner ha dicho, extender R con la extensión C / C ++ es una muy buena manera de aprovechar lo mejor de ambos lados. También puede probar lo inverso, trabajando con C ++ y ocasionalmente llamando a la función de R con el paquete RInside o R. Aquí puede encontrar cómo

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

Una vez que está trabajando en C ++, tiene muchas bibliotecas, muchas de ellas creadas para problemas específicos, otras más generales

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

http://mlpack.org/

D.Castro
fuente
9

Estoy de acuerdo en que la tendencia actual es usar Python / R y vincularlo a algunas extensiones C / C ++ para tareas computacionalmente costosas.

Sin embargo, si desea permanecer en C / C ++, es posible que desee echar un vistazo a Dlib :

Dlib es una biblioteca C ++ multiplataforma de propósito general diseñada usando programación por contrato y técnicas modernas de C ++. Es un software de código abierto y está licenciado bajo la Licencia de software Boost.

ingrese la descripción de la imagen aquí

Franck Dernoncourt
fuente
Otra respuesta muy útil. ¿Sabes si podemos reproducir libremente esa imagen (en caso de que quiera ponerla en una presentación o blog, etc.)? Además, cuando dice cosas como "> 20k muestras" ¿Me pregunto si realmente significa "muestras" u "observaciones en su muestra"?
Hack-R
2
Soy el autor dlib. No dudes en publicar esa imagen donde quieras :). Además,> 20k samples significa que tienes 20k vectores o lo que sea. Cuántas variables hay en cada muestra es un tema separado.
Davis King
@ Hack-R "Muestra" es uno de esos términos sobrecargados en estadística / aprendizaje automático donde a veces significa un conjunto de instancias extraídas de una población (como en "tamaño de muestra", "media de muestra", etc.), y otras veces significa las instancias individuales (como en "entrenó a un clasificador en muestras de 10K").
Tim Goodman
6

En mi opinión, idealmente, para ser un profesional más completo , sería bueno conocer al menos un lenguaje de programación para los paradigmas de programación más populares ( procesal , orientado a objetos , funcional ). Ciertamente, considero a R y Python como los dos lenguajes y entornos de programación más populares para la ciencia de datos y, por lo tanto, las principales herramientas de ciencia de datos.

Julia es impresionante en ciertos aspectos, pero trata de alcanzar a esos dos y establecerse como una importante herramienta de ciencia de datos. Sin embargo, no veo que esto suceda pronto, simplemente debido a la popularidad de R / Python , comunidades muy grandes , así como enormes ecosistemas de paquetes / bibliotecas existentes y recientemente desarrollados , que cubren una amplia gama de dominios / campos de estudiar.

Dicho esto, muchos paquetes y bibliotecas, enfocados en ciencia de datos, áreas de ML e IA, se implementan y / o proporcionan API en lenguajes diferentes a R o Python (para la prueba, vea esta lista curada y esta lista curada , ambos de los cuales son excelentes y dan una perspectiva sólida sobre la variedad en el campo). Esto es especialmente cierto para el software orientado al rendimiento o especializado . Para ese software, he visto proyectos con implementación y / o API principalmente en Java, C y C ++ (Java es especialmente popular en el segmento de big data de la ciencia de datos, debido a su cercanía con Hadoop y su ecosistema, y ​​en la PNLsegmento), pero hay otras opciones disponibles, aunque en un grado mucho más limitado, basado en el dominio. Ninguno de estos idiomas es una pérdida de tiempo, sin embargo, debe priorizar el dominio de uno o todos con su situación laboral actual, proyectos e intereses. Entonces, para responder a su pregunta sobre la viabilidad de C / C ++ (y Java), diría que todos son viables , sin embargo, no como herramientas primarias de ciencia de datos, sino como secundarias .

Respondiendo a sus preguntas sobre 1) C como una herramienta potencial de ciencia de datos y 2) su eficiencia , diría que: 1) si bien es posible usar C para la ciencia de datos, recomendaría no hacerlo, porque tendría una muy buena dificultad para encontrar las bibliotecas correspondientes o, aún más, para tratar de implementar los algoritmos correspondientes usted mismo; 2) no debe preocuparse por la eficiencia, ya que muchos segmentos de código críticos para el rendimiento se implementan en lenguajes de bajo nivel como C, además, hay opciones para interconectar lenguajes de ciencia de datos populares con, por ejemplo, C (por ejemplo, Rcpppaquete para integración R con C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html) Esto se suma a enfoques de rendimiento más simples, pero a menudo bastante efectivos, como el uso constante de la vectorización en R, así como el uso de varios marcos de programación paralela, paquetes y bibliotecas. Para ver ejemplos del ecosistema R, consulte Vista de tareas CRAN "Computación paralela y de alto rendimiento con R" .

Hablando de ciencia de datos , creo que tiene mucho sentido mencionar la importancia del enfoque de investigación reproducible , así como la disponibilidad de varias herramientas que respaldan este concepto (para más detalles, vea mi respuesta relevante ). Espero que mi respuesta sea útil.

Aleksandr Blekh
fuente
5

R es una de las herramientas clave para el científico de datos, lo que sea que hagas no dejes de usarlo.

Ahora hablando de C, C ++ o incluso Java. Son buenos idiomas populares. Si los necesita o los necesitará, dependerá del tipo de trabajo o proyectos que tenga. Por experiencia personal, existen tantas herramientas para los científicos de datos que siempre sentirá que necesita aprender constantemente.

Puede agregar Python o Matlab a cosas para aprender si lo desea y seguir agregando. La mejor manera de aprender es asumir un proyecto de trabajo utilizando otras herramientas con las que no se sienta cómodo. Si yo fuera tú, aprendería Python antes que C. Se usa más en la comunidad que C. Pero aprender C no es una pérdida de tiempo.

servais daligou
fuente
¡Sé lo que quieres decir con la abrumadora cantidad de herramientas! Le digo a mi interno que no se distraiga y que se concentre en solo 1 o 2 cosas, pero es difícil seguir mi propio consejo.
Hack-R
5

Como científico de datos, los otros lenguajes (C ++ / Java) son útiles cuando necesita incorporar el aprendizaje automático en un motor de producción existente.

Waffles es tanto una biblioteca de clase C ++ bien mantenida como un paquete de análisis de línea de comandos. Tiene aprendizaje supervisado y no supervisado, toneladas de herramientas de manipulación de datos, herramientas de datos dispersos y otras cosas como el procesamiento de audio. Como también es una biblioteca de clases, puede ampliarla según lo necesite. Incluso si usted no es el que desarrolla el motor C ++ (es probable que no lo sea), esto le permitirá crear prototipos, probar y entregar algo a los desarrolladores.

Lo más importante, creo que mi conocimiento de C ++ y Java realmente me ayuda a entender cómo funcionan Python y R. Cualquier lenguaje solo se usa correctamente cuando entiendes un poco lo que está sucediendo debajo. Al aprender las diferencias entre idiomas, puede aprender a explotar las fortalezas de su idioma principal.

Actualizar

Para aplicaciones comerciales con grandes conjuntos de datos, Apache Spark - MLLib es importante. Aquí puede usar Scala, Java o Python.

Pete
fuente
2

Me gustaría entender por qué necesitaría otro idioma (aparte de Python) si su objetivo es "pero qué pasa con la regresión avanzada, el aprendizaje automático, la minería de texto y otras operaciones estadísticas más avanzadas".
Para ese tipo de cosas, C es una pérdida de tiempo. Es una buena herramienta, pero en los ~ 20 años desde que salió Java, rara vez he codificado C.
Si prefiere el lado más funcional de programación de R, aprenda Scala antes de meterse en demasiados hábitos de procedimientos que codifican con C .
Por último aprenden a utilizar las bibliotecas de Hadley Wickham - que va a ahorrar un montón de tiempo haciendo la manipulación de datos.

Michael Cox
fuente
Debido a que los lenguajes como R y Python son muy lentos / ineficientes en comparación con los lenguajes como C. Por lo tanto, cuando se trata de una gran cantidad de datos y cálculos, si puede hacer algo en C, es más rápido que si puede hacerlo en R. Me encanta y uso ¡Los paquetes de Hadley aunque!
Hack-R
1

No estoy seguro de si se ha mencionado todavía, pero también hay un wabbit vocal, pero podría ser específico solo para ciertos tipos de problemas.

Felipe Almeida
fuente
1
Parece interesante. Solo eché un vistazo al enlace, pero los tipos de modelos mencionados serían muy útiles. ¿Es una biblioteca de C normal que puedes usar en un programa? Tendré que investigar más a fondo.
Hack-R
0

Echa un vistazo a Intel DAAL que está en marcha. Está altamente optimizado para la arquitectura de CPU Intel y admite cálculos distribuidos.

0x1337
fuente
0

Soluciones escalables de aprendizaje automático para Big Data:

Agregaré mis $ .02 porque hay un área clave que parece no haber sido abordada en todas las publicaciones anteriores: ¡ aprendizaje automático en big data !

Para Big Data, la escalabilidad es clave y R es insuficiente. Además, lenguajes como Python y R solo son útiles para interactuar con soluciones escalables que generalmente están escritas en otros idiomas. Hago esta distinción no porque quiera menospreciar a quienes los usan, sino solo porque es muy importante para los miembros de la comunidad de ciencia de datos comprender cómo son las soluciones de aprendizaje automático realmente escalables.

Hago la mayor parte de mi trabajo con big data en clústeres de memoria distribuida . Es decir, no solo uso una máquina de 16 núcleos (4 procesadores de cuatro núcleos en una sola placa base que comparte la memoria de esa placa base), utilizo un pequeño grupo de 64 máquinas de 16 núcleos. Los requisitos son muy diferentes para estos grupos de memoria distribuida que para entornos de memoria compartida y el aprendizaje automático de big data requiere soluciones escalables dentro de entornos de memoria distribuida en muchos casos.

También utilizamos C y C ++ en todas partes dentro de un producto de base de datos patentado. Todas nuestras cosas de alto nivel se manejan en C ++ y MPI, pero las cosas de bajo nivel que tocan los datos son todos largos y matrices de caracteres de estilo C para mantener el producto muy rápido. La conveniencia de las cadenas estándar simplemente no vale el costo computacional.

No hay muchas bibliotecas C ++ disponibles que ofrezcan capacidades distribuidas y escalables de aprendizaje automático: MLPACK .

Sin embargo, hay otras soluciones escalables con API:

Apache Spark tiene una biblioteca escalable de aprendizaje automático llamada MLib con la que puede interactuar.

También Tensorflow ahora tiene tensorflow distribuido y tiene una api C ++ .

¡Espero que esto ayude!

AN6U5
fuente