¿Cuál es el enfoque preferido y eficiente para interpolar datos multidimensionales?

22

¿Cuál es el enfoque preferido y eficiente para interpolar datos multidimensionales?

Cosas que me preocupan:

  1. rendimiento y memoria para la construcción, evaluación individual / por lotes
  2. manejo de dimensiones de 1 a 6
  3. lineal o de orden superior
  4. capacidad de obtener gradientes (si no lineales)
  5. cuadrícula regular vs dispersa
  6. utilizando como función de interpolación, por ejemplo, para encontrar raíces o para minimizar
  7. capacidades de extrapolación

¿Existe una implementación eficiente de código abierto de esto?

Tuve suerte parcial con scipy.interpolate y kriging de scikit-learn.

No probé splines, polinomios de Chebyshev, etc.

Esto es lo que encontré hasta ahora sobre este tema:

Interpolación lineal Python 4D en una cuadrícula rectangular

Interpolación rápida de datos 3D muestreados regularmente con diferentes intervalos en x, y y z

Interpolación rápida de datos de cuadrícula regulares.

¿Qué método de interpolación dispersa multivariante es el mejor para uso práctico?

denfromufa
fuente
1
¿Para qué quieres tu interpolación? ¿Cómo son sus datos de entrada? No creo que la dimensionalidad cambie mucho el problema.
nicoguaro
2
Desafortunadamente, la interpolación multivariada no es tan corta y seca como univariada. Por ejemplo, en 1D, puede elegir nodos de interpolación arbitrarios (siempre que sean mutuamente distintos) y siempre obtenga un polinomio de interpolación único de cierto grado. Ya en 2D, esto no es cierto, y es posible que no tenga un problema de interpolación polinomial bien definido dependiendo de cómo elija sus nodos. En resumen, debe proporcionarnos más información sobre la estructura de sus datos para obtener información útil.
cfh
1
Aquí hay una encuesta en la aproximación polinómica, si desea proseguir con este enfoque: Gasca y Sauer, "La interpolación polinómica de varias variables", 2000 citeseerx.ist.psu.edu/viewdoc/...
CFH
3
Los polinomios de Chebyshev en una cuadrícula dispersa (por ejemplo, Smolyak) son muy rápidos para dimensiones más altas. Los puntos de la cuadrícula son un subconjunto predeterminado de los puntos de Chebyshev. Algunas implementaciones: tasmanian.ornl.gov , ians.uni-stuttgart.de/spinterp/about.html , github.com/EconForge/Smolyak
Ronaldo Carpio
1
Podrías probar algo como la teselación de Delaunay en el colector.
EngrStudent - Restablecer Monica

Respuestas:

14

Para la primera parte de mi pregunta, encontré esta comparación muy útil para el rendimiento de diferentes métodos de interpolación lineal utilizando bibliotecas de python:

http://nbviewer.ipython.org/github/pierre-haessig/stodynprog/blob/master/stodynprog/linear_interp_benchmark.ipynb

A continuación se muestra una lista de los métodos recopilados hasta ahora.

Interpolación estándar, cuadrícula estructurada:

http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.ndimage.interpolation.map_coordinates.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RegularGridInterpolator.html

https://github.com/rncarpio/linterp/

Cuadrícula no estructurada (dispersa):

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.LinearNDInterpolator.html#scipy.interpolate.LinearNDInterpolator

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html

http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.Rbf.html

2 grandes proyectos que incluyen interpolación:

https://github.com/sloriot/cgal-bindings (partes de CGAL, licencia GPL / LGPL)

https://www.earthsystemcog.org/projects/esmp/ (Licencia de la Universidad de Illinois-NCSA ~ = MIT + BSD-3)

Rejillas dispersas:

https://github.com/EconForge/Smolyak

https://github.com/EconForge/dolo/tree/master/dolo/numeric/interpolation

http://people.sc.fsu.edu/~jburkardt/py_src/sparse_grid/sparse_grid.html

https://aerodynamics.lr.tudelft.nl/~rdwight/work_sparse.html

https://pypi.python.org/pypi/puq

Kriging (proceso gaussiano):

http://scikit-learn.org/stable/modules/generated/sklearn.gaussian_process.GaussianProcess.html

https://github.com/SheffieldML/GPy

https://software.sandia.gov/svn/surfpack/trunk/

http://openmdao.org/dev_docs/_modules/openmdao/lib/surrogatemodels/kriging_surrogate.html

Licencia GPL general:

https://github.com/rncarpio/delaunay_linterp

Tasmanian

El juego de herramientas para el modelado estocástico adaptativo y la aproximación no intrusiva es una biblioteca robusta para la integración e interpolación de alta dimensión, así como la calibración de parámetros.

Enlace de Python para Tasmania:

https://github.com/rncarpio/py_tsg

https://github.com/sloriot/cgal-bindings (partes de CGAL, licencia GPL / LGPL)

denfromufa
fuente
2
Agregaré que el excelente paquete DAKOTA de sandia tiene todos los métodos anteriores implementados y muchos más, y proporciona enlaces de python. Puede que no sea el más fácil de poner en marcha, pero es de primera categoría y ofrece muchas opciones, y vale la pena echarle un vistazo.
Aurelius
@Aurelius, ¿puede señalar las rutinas de interpolación / aproximación dentro de DAKOTA? Tengo experiencia con ese paquete, pero solo noté surfpack (ya ref-d arriba) para kriging.
denfromufa
@Aurelius todos los modelos de aproximación de dakota están en surfpack
denfromufa
Este es un as sangriento; ¡bien hecho!
Astrid