software online fitting fit statistics regression best-fit-curve

statistics - online - curve fitting matlab



Ajuste simple de curva multidimensional (6)

Tengo un montón de datos, generalmente en la forma a, b, c, ..., y

donde y = f (a, b, c ...)

La mayoría de ellos son tres y cuatro variables, y tienen registros de 10k a 10M. Mi suposición general es que son de naturaleza algebraica, algo así como:

y = P1 a ^ E1 + P2 b ^ E2 + P3 c ^ E3

Desafortunadamente, mi última clase de análisis estadístico fue hace 20 años. ¿Cuál es la forma más fácil de obtener una buena aproximación de f? Las herramientas de código abierto con una curva de aprendizaje mínima (es decir, algo donde podría obtener una aproximación decente en una hora más o menos) serían ideales. ¡Gracias!


¿Sabes a qué potencia quieres limitar tu polinomio?

Si no hay límite, siempre puede obtener una coincidencia exacta para N puntos al hacer coincidirlo con un polinomio que tenga N coeficientes. Para hacer esto, conectas N puntos diferentes en tu ecuación, obteniendo N ecuaciones y N incógnitas (los coeficientes), que luego puedes utilizar ya sea álgebra simple de secundaria o una matriz para resolver las incógnitas.


Hay una herramienta para ajustar curvas 1D y 2D en zunzun.com , pero no creo que vaya más allá de dos variables. Del mismo modo, Matlab no admite el ajuste de más de dos dimensiones (hasta donde yo sé) y ciertamente no es gratis.

De lo contrario, es posible que pueda encontrar parte de su solución en las recetas numéricas .

Pero como otros carteles indicaron, probablemente necesitarás al menos una idea básica de tu modelo de función (que, con suerte, es lineal o puede linealizarse, en cuyo caso tendrás a tu disposición una gama mucho más amplia de soluciones).


Los aspectos básicos del ajuste de datos implican asumir una forma general de solución, adivinar algunos valores iniciales para las constantes y luego iterar para minimizar el error de la solución adivinada para encontrar una solución específica, generalmente en el sentido de mínimos cuadrados.

Mire en R u Octave las herramientas de código abierto. Ambos son capaces de análisis de mínimos cuadrados, con varios tutoriales a solo una búsqueda de Google de distancia.

Edit: código de octava para estimar los coeficientes para un polinomio de segundo orden

x = 0:0.1:10; y = 5.*x.^2 + 4.*x + 3; % Add noise to y data y = y + randn(size(y))*0.1; % Estimate coefficients of polynomial p = polyfit(x,y,2)

En mi máquina, obtengo:

ans = 5.0886 3.9050 2.9577


Respuesta corta: no es tan simple. Considere un enfoque no paramétrico en los subconjuntos de datos.

Hay dos cuestiones principales que debe decidir sobre (1) ¿Le importan realmente los parámetros de la función, es decir, su P1, E1, ..., o estaría bien con solo estimar la función media (2)? realmente necesita estimar la función en todos los datos?

Lo primero que mencionaré es que su función especificada no es lineal (en los parámetros que se estimarán), por lo que los mínimos cuadrados ordinarios no funcionarán. Supongamos que ha especificado una función lineal. Aún tendrías un problema con los valores de 10M. La regresión lineal se puede realizar de manera eficiente utilizando la factorización QR, pero aún le queda un algoritmo O (p * n ^ 2), donde p es el número de parámetros que está tratando de estimar. Si desea estimar la función media no lineal, empeora.

La única forma en que podrá estimar cualquier cosa en un conjunto de datos tan grande es mediante el uso de un subconjunto para realizar la estimación. Básicamente, selecciona al azar un subconjunto y lo usa para estimar la función.

Si no le importan los valores de sus parámetros y solo quiere estimar la función media, probablemente sea mejor utilizar una técnica de estimación no paramétrica.

Espero que esto ayude.

leif


En caso de que sea útil, aquí hay una plantilla de Numpy / Scipy (Python) para hacer lo que quieras:

from numpy import array from scipy.optimize import leastsq def __residual(params, y, a, b, c): p0, e0, p1, e1, p2, e2 = params return p0 * a ** e0 + p1 * b ** e1 + p2 * c ** e2 - y # load a, b, c # guess initial values for p0, e0, p1, e1, p2, e2 p_opt = leastsq(__residual, array([p0, e0, p1, e1, p2, e2]), args=(y, a, b, c)) print ''y = %f a^%f + %f b^%f %f c^%f'' % map(float, p_opt)

Sin embargo, si realmente quieres entender lo que está pasando, vas a tener que invertir el tiempo para escalar la curva de aprendizaje de alguna herramienta o entorno de programación, realmente no creo que haya forma de evitarlo. La gente generalmente no escribe herramientas especializadas para hacer cosas como regresiones de poder de 3 términos exclusivamente.


Si tiene una conjetura sobre la forma de f, [*] necesita un minimizador para encontrar los parámetros óptimos. Las herramientas que Scottie T sugiere funcionarían, como ROOT , y muchas otras.

Si no tienes idea de qué forma puede tomar, en verdad estás en un gran problema.

[*] Es decir, tú sabes eso

f = f (x, y, z, w, ...; p1, p2, p3 ...)

donde los p s son parámetros y las coordenadas son x , y ...