2009-02-09 11 views
17

I tiene un montón de datos, generalmente en forma a, b, c, ..., ycurva multidimensional simple apropiado

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

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

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

Por desgracia, mi última clase 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!

+5

Con respecto al título, ¿qué es simple acerca de ajuste de curva multidimensional? :-) –

+0

http://www.prz.rzeszow.pl/~janand/Theory_of_LSM.pdf – jfs

+1

La regresión de distancia ortogonal se podría usar para el problema. – jfs

Respuesta

2

Los fundamentos de la adaptación de datos implican asumir una forma general de solución, adivinar algunos valores iniciales para 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.

Busque en R o Octave para 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.

Editar: código de Octave para la estimación de los coeficientes para un segundo orden polinomial

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, me sale:

ans = 

    5.0886 3.9050 2.9577 
+0

Gracias, tengo ... ¡por eso dije "curva de aprendizaje muy mínima"! Esos son dos lenguajes estadísticos de propósito general excelentes, pero tienen una curva de aprendizaje bastante fuerte (en mi humilde opinión). – user64258

+0

Ya veo. Creo que, con funciones simples, no debería tomar demasiado tiempo para ponerse al día con cualquiera de las herramientas, o incluso para hacer esto en Python o Perl. –

+0

Creo que son relativamente simples (agregué detalles a la pregunta), y ya he pasado una hora más o menos en Google, por lo que he dado vuelta aquí ;-) – user64258

0

Si usted tiene una pista sobre la forma de f , [*] necesitas un minimizador para encontrar los parámetros óptimos. The tools Scottie T suggests funcionaría, al igual que ROOT, y muchos otros.

Si no tiene ni idea de qué forma puede tomar la f, de hecho tiene graves problemas.


[*] Es decir, usted sabe que

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

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

3

Hay una herramienta para el montaje y 1D curvas 2D en zunzun.com, pero yo no creo que va 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 el Numerical Recipes.

Pero como otros carteles indican, es probable que necesite al menos una idea básica de su modelo de función (que, con suerte, es lineal o puede linealizarse, en cuyo caso tendrá una gama mucho mayor de soluciones en su disposición)

+0

NR estaría entre los caminos más poderosos a seguir, pero probablemente no sea una curva de aprendizaje mínima. –

+0

Estoy de acuerdo. Pero no creo que este sea el tipo de problema donde hay una salida fácil. – Kena

1

¿Sabe a qué potencia desea limitar su polinomio?

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

+0

+1, he leído en alguna parte que se pueden usar datos de cuadrícula dispersos para lograr la misma precisión polinómica con menos nodos de los que se requieren en los datos de cuadrícula regulares. ¿Sabes cómo es eso posible? – owari

11

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

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) 

Si realmente quiere entender lo que está pasando, sin embargo, 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.

+0

scipy.odr (regresión de distancia ortogonal) podría ser útil si a, b, c no tiene una precisión infinita (al menos el cuadrado supone una precisión infinita para las coordenadas). – jfs

+0

Seguramente la función requiere un poco de salida de muestra para minimizar hacia, es decir, algunos valores de muestra y dados un conjunto de valores a, b, c? – Brendan

0

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) ¿De verdad le importan 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 usar una técnica de estimación no paramétrica.

Espero que esto ayude.

leif

Cuestiones relacionadas