examples chart javascript c++ node.js numpy multidimensional-array

javascript - chart - paquete numpy para nodo



plotly examples (7)

Aquí está https://deeplearnjs.org/#getting-started , que hace exactamente eso, y ha incorporado capacidades para entrenar redes neuronales profundas en GPU usando WebGL. También puede portar modelos de Tensorflow a él https://deeplearnjs.org/demos/mnist/mnist.html

No se deje engañar por pensar que esto es solo para el aprendizaje profundo. Es una plataforma de computación numérica completa con aceleración de gpu incorporada. Sigue el ansioso modelo de "ejecutar sobre la marcha", como numpy (y Tensorflow Eager, y PyTorch, y otros), no el modelo "definir y ejecutar" como Tensorflow. Como tal, se sentirá natural de usar a cualquiera que haya usado numpy antes.

Aquí está el repositorio muy informativo de github:

https://github.com/PAIR-code/deeplearnjs

Durante mis años en el desarrollo de Python, siempre me he sorprendido de cuánto más rápido se vuelven las cosas si logras reescribir ese código que recorre tu ndarray y hace algo, con funciones numpy que funcionan en toda la matriz a la vez. Más recientemente estoy cambiando cada vez más a nodo, y estoy buscando algo similar. Hasta ahora he encontrado algunas cosas, ninguna de las cuales parece prometedora:

  • scikit-node , ejecuta scikit-learn en python e interactúa con node. No lo he intentado, pero no creo que me dé la velocidad de vanguardia que me gustaría.
  • Hay algunas bibliotecas de matrices javascript más antiguas y más nuevas ( scikit-node , gl-matrix , ...). Además de no estar seguros de que funcionan bien con matrices de más de 4x4 (que es más útil en la representación 3D), parecen ser Javascript nativo (y algunos, no estoy seguro de esto, usan la aceleración webGL). Genial en el navegador, no en el nodo.

Por lo que yo sé, npms se puede escribir en C ++, así que me pregunto por qué no hay bibliotecas nudosas para el nodo. ¿Todavía no hay suficiente interés en el nodo de la comunidad que necesita ese tipo de poder? ¿Hay alguna esperanza de que las características de ES6 (listas de comprensión) permitan a los compiladores de JavaScript vectorizar automáticamente el código JS nativo a velocidades C ++? ¿Me estoy perdiendo algo más?

Editar , en respuesta a votos cerrados: Nota, no estoy preguntando "¿cuál es el mejor paquete para hacer xyz". Me pregunto si existe una razón técnica por la que no hay un paquete para hacer esto en un nodo, una razón social o ninguna razón y solo hay un paquete que omití. Tal vez para evitar demasiadas críticas obstinadas, quiero saber: tengo alrededor de 10000 matrices que son 100 x 100 cada una. ¿Cuál es la mejor (* corrección, una forma razonablemente rápida) de agregarlos?

Edit2 Después de excavar un poco más, resultó que estaba buscando en Google algo equivocado. Google para "informática científica node.js" y hay enlaces a algunas notas muy interesantes:

Básicamente, por lo que entiendo ahora, nadie se ha molestado hasta ahora. Además, dado que hay algunas omisiones importantes en js TypedArrays (como las de 64 bits), podría ser difícil agregar un buen soporte solo con el uso de los NPM, y no piratear el motor en sí, algo que frustraría el propósito. Por otra parte, no investigué más esta última afirmación.


Aunque nunca lo intenté, ¡ NumJs ve realmente genial! Es un intento muy convincente en un clon NumPy de JavaScript.

Eso es lo que usaría, ya sea solo por la conveniencia de las operaciones de transmisión.


En el mismo espíritu de la respuesta de @Julius sobre deeplearn.js, tensorflow.js es la continuación del mismo proyecto. Para jugar con el módulo tensorflow en REPL, lo instalé globalmente (FYI - generalmente se recomienda no hacer esto) usando esto:

$ npm install --global @tensorflow/tfjs

Luego, ejecuté $ node para iniciar el nodo REPL.

Esto puede diferir para usted (especialmente si decidió instalar tensorflow localmente), pero ingresé esto para hacer referencia al módulo tensorflow:

var tf = require(''/usr/local/lib/node_modules/@tensorflow/tfjs'')

Para crear un tensor de rango 1 (equivalente a una matriz 1-D en numpy), intente:

var x = tf.tensor( [-3,4] )

Y cuadrarlo con:

x.square().print()

Deberías obtener [9,16] para tu resultado. Ver https://js.tensorflow.org para más detalles.

Diría que tensorflow.js no es solo un reemplazo de JS para numpy, sino también para sklearn, keras y, por supuesto, tensorflow.



La mayoría del trabajo de nodos parece estar en el universo web de "pila completa", con mucho menos trabajo en áreas donde el procesamiento numérico rápido es una ventaja.

En las áreas en las que el procesamiento numérico rápido es una ventaja, Python, R, etc. probablemente tengan una cuota de pensamiento dominante.

Combine esos dos hechos, y terminará con poca gente esforzándose en las bibliotecas de procesamiento numérico de nodos.


No he intentado esto, pero encontré node-lapack . Dado que Numpy obtiene la mayor parte de su velocidad del uso de blas / lapack para hacer todo, esto debería ayudar. Del archivo léame parece que también tiene un objeto de matriz, que es esencial para no convertir JS y lapack en cada operación.

Aquí hay una parte de su demo:

var lapack = require(''lapack''); var result = lapack.sgeqrf([ [1, 2, 3], [3, 4, 5], [5, 6, 7] ]); console.log(result.R); console.log(result.tau); result = sgesvd(''A'', ''A'', [ [1, 2, 3], [3, 4, 5], [5, 6, 7] ]); console.log(result.U); console.log(result.S); console.log(result.VT); result = lapack.sgetrf([ [1, 2, 3], [3, 4, 5], [5, 6, 7] ]); // see the readme for more

Parece ser una interfaz bastante directa para lapack con los mismos nombres, por lo que no es tan conveniente como Numpy, pero al menos se ocupa de las dimensiones de la matriz y demás, y debería ser lo más rápido posible (ya que la mayor parte del trabajo es hecho por Lapack en cualquier caso).

Sin embargo, esto no funcionará en un navegador, lo que significa que en todas partes donde esté disponible, Python probablemente también esté disponible. Personalmente, me quedaría con Python, que es mucho más dominante en lo numérico, a menos que falte alguna funcionalidad específica de Nodo que Python ...


No, no existen razones técnicas por las cuales no exista un paquete numpy para Node.js y, en general, JavaScript.

Hay dos obstáculos principales que impiden que Node.js y JavaScript logren una mayor participación mental en las comunidades de ciencia de datos y computación numérica.

El primer obstáculo es la comunidad. Si bien la comunidad de JavaScript es enorme, el subconjunto de personas dentro de esa comunidad que hace cosas interesantes en computación numérica es pequeño. Por lo tanto, si desea hacer cálculos numéricos en JavaScript y Node.js, encontrar recursos para ayudarlo en el camino puede ser difícil, y puede parecer una tarea solitaria.

A continuación, la ausencia de bibliotecas comparables (pollo y huevo: se necesitan bibliotecas para atraer a los autores de la biblioteca y se necesitan autores para escribir buenas bibliotecas). No hay razones técnicas por las cuales las bibliotecas no se pueden escribir en JavaScript o aprovechar Node.js (por ejemplo, a través de complementos nativos). Lo sé, ya que he escrito muchas bibliotecas de computación numérica en JavaScript. Por lo tanto, aunque la computación numérica es posible en JavaScript, el problema surge de la incapacidad de atraer a desarrolladores que tengan suficiente experiencia y sean capaces de dedicar el tiempo y el esfuerzo necesarios para escribir implementaciones de computación numérica de alta calidad.

En cuanto a las características específicas del lenguaje mencionadas en el PO:

  • ES6 / ES2015 : ninguna de las adiciones de idiomas recientes ayuda u obstaculiza el desarrollo de bibliotecas de computación numérica en JavaScript. Las adiciones potenciales como las listas de comprensión tampoco serán cambiadores de juego. El único cambio en la plataforma web que marcará la diferencia es WebAssembly. Con WebAssembly, la compilación de bibliotecas C / C ++ / Fortran para ejecutar en navegadores web será más fácil. En el momento de esta respuesta, WebAssembly parece ser el medio para llevar SIMD a la web, lo que posiblemente permite algunas aceleraciones, aunque el enfoque parece estar en SIMD corto, en lugar de largo. Pero incluso con WebAssembly, la transferencia de bibliotecas de computación numérica a la web no será tan simple como presionar el botón de compilación. Las bases de códigos de cómputo numérico necesitarán ser modificadas para ser usadas en la web, e incluso entonces, es probable que se tengan que escribir API de nivel más alto para enmascarar algunas de las características de nivel inferior, como administrar manualmente el montón.
  • Complementos nativos : sí, los módulos de nodos se pueden escribir como complementos nativos, lo que permite utilizar el código C / C ++ / Fortran dentro de una aplicación Node.js. Los individuos han escrito bibliotecas para este fin; por ejemplo, vea stdlib . Si se hace bien, Node.js puede realizar cálculos numéricos a velocidades comparables al uso directo de implementaciones nativas.
  • Arrays tipados : como son ahora, son adecuados para el cálculo numérico. Al igual que C, puede crear almacenamientos intermedios agrupados, que permiten una reutilización de memoria eficiente y un mejor rendimiento. Además, de forma similar a los lenguajes como R, Python y Julia, puede aprovechar las matrices tipadas para crear interfaces ndarray (aka strided array). Si bien las matrices de enteros U / Int64 no están actualmente disponibles en el momento de esta respuesta, (a) su ausencia no es un stop show y (b) las propuestas avanzan en el nivel de especificación para agregar matrices de enteros U / Int64 a JavaScript. Lo mismo ocurre con los números complejos con tipos estructurados.

Mi creencia personal es que alguna forma de computación numérica es inevitable en JavaScript y en Node.js. Las ventajas (ubicuidad, distribución, rendimiento) y las aplicaciones potenciales (informática de punta, integración de aprendizaje automático, visualización de datos) son fuerzas evolutivas demasiado fuertes como para no admitir aplicaciones de ciencia de datos, al menos en un nivel básico.

divulgación : Yo y otros estamos trabajando actualmente en un proyecto ( https://github.com/stdlib-js/stdlib ) que tiene como objetivo proporcionar instalaciones de computación numérica en JavaScript y Node.js.