Pregunta

Busco una curva rutina de ajuste no lineal (probablemente más probable que se encuentre en I o Python, pero estoy abierto a otras lenguas) que tomaría x, y y datos de ajustar una curva a la misma.

Debería ser capaz de especificar como una cadena del tipo de expresión que quiero encajar.

Ejemplos:

"A+B*x+C*x*x"
"(A+B*x+C*x*x)/(D*x+E*x*x)"
"sin(A+B*x)*exp(C+D*x)+E+F*x"

Lo que iba a salir de esto es, al menos, los valores de las constantes (A, B, C, etc.) y es de esperar las estadísticas sobre la idoneidad del partido.

Existen programas comerciales para hacer esto, pero espera que sea capaz de encontrar algo tan común como el ajuste a una expresión deseada en una biblioteca de idiomas en la actualidad. Sospecho cosas optimización de SciPy podría ser capaz de hacer esto, pero no puedo ver que me permite definir una ecuación. Del mismo modo, me parece que no puede encontrar exactamente lo que quiero en I.

Es lo que estoy buscando por ahí, o necesito para rodar mi propia? No me gusta hacerlo si está allí y yo estoy teniendo problemas para encontrarlo.


Edit: Quiero hacer esto un poco más de control sobre el proceso de lo que recibo de LAB Fit. El FIT Lab interfaz de usuario es terrible. También me gustaría ser capaz de romper el rango en varias piezas y tienen diferentes curvas representan las diferentes piezas de la gama. Al final, el resultado tiene que ser capaz de (velocidad del reloj) vencer a una LUT con interpolación lineal o no me interesa.

En mi actual serie de problemas, que tienen funciones trigonométricas o exp () y necesito ejecutarlos 352,800 veces por segundo en tiempo real (y utilizar sólo una fracción de la CPU). Así que trazar la curva y utilizar los datos para impulsar la curva en forma de obtener aproximaciones menos costosos. En los viejos tiempos, LUT eran casi siempre la solución, pero hoy en día saltarse las operaciones de búsqueda de memoria y hacer una aproximación a veces es más rápido.

¿Fue útil?

Solución

Para responder a su pregunta en un sentido general (con respecto a la estimación de parámetros en I) sin tener en cuenta las características específicas de las ecuaciones usted ha señalado, creo que busca NLS () o Optim () ... '' es mi NLS primera opción, ya que proporciona estimaciones de error para cada parámetro estimado y cuando no utilizo 'Optim'. Si usted tiene sus x, variables Y:

out <- tryCatch(nls( y ~ A+B*x+C*x*x, data = data.frame(x,y), 
                start = c(A=0,B=1,C=1) ) ,
                error=function(e) 
                optim( c(A=0,B=1,C=1), function(p,x,y)  
                      sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y) )

para obtener los coeficientes, algo así como

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par
getcoef(out)

Si desea que los errores estándar en el caso de ÑLS ',

summary(out)$parameters

Los archivos de ayuda y r-ayuda de listas de correo mensajes contienen muchas discusiones con respecto a los algoritmos de minimización específicas llevadas a cabo por cada uno (el valor por defecto utilizado en cada caso del ejemplo anterior) y su adecuación para la forma específica de la ecuación que nos ocupa. Ciertos algoritmos pueden manejar las restricciones de caja, y otra función llamada constrOptim () se encargará de un conjunto de restricciones lineales. Este sitio web también puede ayudar a:

http://cran.r-project.org/web/views/ Optimization.html

Otros consejos

Su primer modelo es en realidad linear en los tres parámetros y puede estar en forma en I utilizando

 fit <- lm(y ~ x + I(x^2), data=X)

que te llevará sus tres parámetros.

El segundo modelo también puede estar en forma usando nls() en R con las salvedades habituales de tener que proporcionar valores que comienzan etc. La estadística problemas en la optimización no son necesariamente el mismo que el numérico temas -. no se puede simplemente optimizar cualquier forma funcional sin importar el idioma que elija

GNU Octave - entre su polyfit () y la solucionador de restricciones no lineales que debería ser posible construir algo adecuado para su problema.

R, esto es bastante fácil.

El construido en el método que se llama Optim (). Se toma como argumentos un vector de partida de los posibles parámetros, entonces una función. Tienes que ir a construir su propia función de error, pero eso es muy simple.

A continuación, se llame como fuera Optim = (1, err_fn)

donde err_fn es

err_fn = function(A) {
    diff = 0;
    for(i in 1:data_length){
      x = eckses[i];
      y = data[i];
      model_y = A*x;
      diff = diff + ( y - model_y )^2
    }
    return(diff);
}

Esto se supone que tiene un vector de valores X e Y en eckses y datos. Cambie la línea model_y como mejor le parezca, incluso agregar más parámetros.

Funciona en no lineal muy bien, lo uso para cuatro e ^ x curvas tridimensionales y es muy rápido. Los datos de salida incluye el valor de error en el extremo del accesorio, que es una medida de lo bien que se ajusta, dado como una suma de las diferencias al cuadrado (en mi err_fn).

EDIT: Si usted necesita tomar en el modelo como una cadena, puede hacer que la interfaz de usuario construcción de todo este proceso de ajuste del modelo como una secuencia de comandos R y cargarlo en ejecutar. R puede tomar el texto de STDIN o de un archivo, por lo que no debería ser demasiado difícil de elaborar equivalente cadena de esta función, y hacer que se ejecute automáticamente Optim.

Usted está probablemente no va a encontrar una sola rutina con la flexibilidad implícita en sus ejemplos (polinomios y funciones racionales que utilizan la misma rutina), y mucho menos uno que va a analizar una cadena de averiguar qué tipo de ecuación para encajar.

A polinómica de mínimos cuadrados más en forma que sería apropiado para su primer ejemplo. (Depende de lo que polinomio de grado de usar - quadradic, cúbica, etc.). Para una función racional como el segundo ejemplo, puede que tenga que "hágalo usted mismo" si no se puede encontrar una biblioteca adecuada. Además, tenga en cuenta que un polinomio suficientemente alto grado puede ser usado para aproximar la función de su "real", siempre y cuando no es necesario extrapolar más allá de los límites del conjunto de datos que está ajustada a.

Como otros han señalado, existen otros algoritmos de estimación de parámetros, más generalizadas que también pueden resultar útiles. Sin embargo, estos algoritmos no son bastante "plug and play": por lo general requieren que escribir algunas rutinas de ayuda, y el suministro de una lista de valores iniciales para los parámetros del modelo. Es posible que este tipo de algoritmos que divergen o se atascan en un mínimo o máximo local para una elección desafortunada de las estimaciones de los parámetros iniciales.

Si usted tiene limitaciones en sus coeficientes, y usted sabe que hay un tipo específico de la función que te gustaría para adaptarse a sus datos y que la función es un desordenado uno donde los métodos de regresión estándar u otros métodos de ajuste de curvas no lo hará trabajo, ¿ha considerado algoritmos genéticos?

no son mi primera opción, pero si usted está tratando de encontrar los coeficientes de la segunda función que usted ha mencionado, entonces quizás gas sería trabajar --- especialmente si está utilizando métricas no estándares para evaluar mejor ajuste. por ejemplo, si quieres encontrar los coeficientes de "(A + Bx + Cx ^ 2) / (dx + ex ^ 2)" de tal manera que la suma de las diferencias cuadradas entre su función y los datos es mínimo y que haya alguna restricción en la longitud de arco de la función resultante, a continuación, un algoritmo estocástico podría ser una buena manera de abordar esto.

algunas advertencias: 1) algoritmos estocásticos no garantizará la mejor solución, sino que será a menudo muy cerca. 2) usted tiene que tener cuidado con la estabilidad del algoritmo.

En una nota más, si usted está en la etapa en la que desea encontrar una función de algún espacio de las funciones que mejor se adapte a sus datos (por ejemplo, no se le va a imponer, por ejemplo, el segundo modelo de datos) , entonces las técnicas de programación genética también pueden ayudar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top