Question

Je cherche une routine d'ajustement de courbe non linéaire (qui se trouve probablement le plus probable dans R ou Python, mais je suis ouvert à d'autres langues) qui prendrait données x, y et ajuster une courbe à elle.

Je devrais être en mesure de préciser comme une chaîne du type d'expression que je veux adapter.

Exemples:

"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"

Ce que je sortirais de c'est au moins les valeurs des constantes (A, B, C, etc.) et nous espérons que les statistiques sur l'aptitude du match.

Il existe des programmes commerciaux pour le faire, mais je devrait être en mesure de trouver quelque chose d'aussi commun approprié à une expression désirée dans une bibliothèque de langue de nos jours. Je soupçonne que des trucs d'optimisation de SciPy pourrait être en mesure de le faire, mais je ne vois pas que cela me permet de définir une équation. De même, je ne peux pas sembler trouver exactement ce que je veux dans la R.

Est-ce que je suis à la recherche là-bas, ou dois-je besoin de rouler ma propre? Je déteste de le faire si elle est là et je suis juste avoir du mal à trouver.


Edit: Je veux faire cela pour un peu plus de contrôle sur le processus que je reçois de LAB Fit. Le LAB Fit UI est terrible. Je voudrais aussi être en mesure de briser la gamme en plusieurs morceaux et ont différentes courbes représentent les différentes pièces de la gamme. En fin de compte, le résultat doit pouvoir (niveau de la vitesse) battre un LUT avec interpolation linéaire ou je ne suis pas intéressé.

Dans mon ensemble des problèmes actuels, j'ai fonctions trigonométriques ou exp () et je dois les exécuter 352,800 fois par seconde en temps réel (et utiliser seulement une fraction de la CPU). Donc je tracer la courbe et utiliser les données pour conduire la courbe en meilleure forme pour obtenir des approximations moins chers. Dans les temps anciens, LUT étaient presque toujours la solution, mais sauter de nos jours les recherches de mémoire et de faire une approximation est parfois plus rapide.

Était-ce utile?

La solution

Pour répondre à votre question dans un sens général (en ce qui concerne l'estimation des paramètres dans R) sans tenir compte des spécificités des équations que vous avez soulevées, je pense que vous cherchez nls () ou optim () ... « nls » est ma premier choix car il fournit des estimations d'erreur pour chaque paramètre estimé et quand il échoue j'utilise « Optim ». Si vous avez vos x, y sont des variables:

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) )

pour obtenir les coefficients, quelque chose comme

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

Si vous voulez que les erreurs standard dans le cas des 'nls',

summary(out)$parameters

Les fichiers d'aide et r aider les postes à la liste de diffusion contiennent de nombreuses discussions sur des algorithmes de minimisation spécifiques mis en œuvre par chacun (par défaut utilisé dans chaque cas d'exemple ci-dessus) et leur pertinence pour la forme spécifique de l'équation à portée de main. Certains algorithmes peuvent gérer les contraintes de la boîte, et une autre fonction appelée constrOptim () va gérer un ensemble de contraintes linéaires. Ce site peut également aider:

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

Autres conseils

Votre premier modèle est en fait linéaire dans les trois paramètres et peuvent être adaptés en utilisant R

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

qui vous permet d'obtenir vos trois paramètres.

Le deuxième modèle peut également être en forme avec nls() en R avec les mises en garde habituelles d'avoir à fournir des valeurs de départ, etc. statistiques problèmes d'optimisation ne sont pas nécessairement les mêmes que numérique questions -. vous ne pouvez pas optimiser simplement une forme fonctionnelle, peu importe la langue que vous choisissez

Consultez GNU Octave - entre ses polyfit () et la contraintes non linéaires solveur il devrait être possible de construire quelque chose adapté à votre problème.

R, cela est assez facile.

La méthode de construction est appelée optim (). Il prend comme arguments un vecteur à partir des paramètres potentiels, puis une fonction. Vous devez aller construire votre propre fonction d'erreur, mais ce qui est vraiment simple.

Ensuite, vous l'appelez comme out = optim (1, err_fn)

où err_fn est

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);
}

Ce que suppose que vous disposez d'un vecteur de valeurs x et y dans eckses et des données. Modifiez la ligne model_y comme bon vous semble, même ajouter plusieurs paramètres.

Il fonctionne sur non linéaire très bien, je l'utilise pour quatre dimensions e ^ x courbes et il est très rapide. Les données de sortie comprend la valeur d'erreur à la fin du montage, qui est une mesure de la façon dont il convient, compte tenu comme une somme de différences au carré (dans mon err_fn).

EDIT: Si vous avez besoin de prendre dans le modèle en tant que chaîne, vous pouvez avoir votre interface utilisateur de construire ce processus d'ajustement de modèle tout comme un script R et le charger pour fonctionner. R peut prendre du texte à partir STDIN ou d'un fichier, donc il ne devrait pas être trop difficile à fabriquer l'équivalent de chaîne de cette fonction, et le faire exécuter optim automatiquement.

Vous allez probablement pas à trouver une seule routine avec la flexibilité implicite dans vos exemples (polynômes et fonctions rationnelles en utilisant la même routine), et encore moins un qui analysera une chaîne pour savoir quel type d'équation pour adapter.

A moindres carrés polynomiale en meilleure forme serait approprié pour votre premier exemple. (Il vous est à ce polynôme degré d'utilisation - polynome, cubique, quartique, etc.). Pour une fonction rationnelle comme votre deuxième exemple, vous pourriez avoir à « rouler votre propre » si vous ne pouvez pas trouver une bibliothèque appropriée. De plus, gardez à l'esprit qu'un polynôme suffisamment degré élevé peut être utilisé pour rapprocher votre fonction « réelle », aussi longtemps que vous n'avez pas besoin d'extrapoler au-delà des limites de l'ensemble de données vous montage à.

Comme d'autres l'ont noté, il existe d'autres algorithmes d'estimation des paramètres plus généraux qui pourraient également être utiles. Mais ces algorithmes ne sont pas tout à fait « plug and play »: ils nécessitent généralement vous d'écrire des routines d'aide, et de fournir une liste de valeurs initiales pour les paramètres du modèle. Il est possible pour ces sortes d'algorithmes à diverger, ou se coincer dans un minimum local ou maximum pour un choix malheureux des estimations des paramètres initiaux.

si vous avez des contraintes sur vos coefficients, et vous savez qu'il ya un type spécifique de la fonction que vous voudriez adapter à vos données et cette fonction est un désordre où les méthodes classiques de régression ou d'autres méthodes d'ajustement de courbe ne sera pas travail, vous avez examiné les algorithmes génétiques?

ils ne sont pas mon premier choix, mais si vous essayez de trouver les coefficients de la deuxième fonction que vous avez mentionné, alors peut-être AGs travailleraient --- surtout si vous utilisez des mesures non standard pour évaluer le meilleur ajustement. par exemple, si vous voulez trouver les coefficients de « (A + Bx + Cx ^ 2) / (Dx + Ex ^ 2) » telle que la somme des différences carrés entre votre fonction et des données est minime et qu'il y ait une certaine contrainte sur la longueur de l'arc de la fonction résultante, puis un algorithme stochastique pourrait être une bonne façon d'aborder ce sujet.

quelques mises en garde: 1) les algorithmes stochastiques ne garantit pas le meilleur solution, mais ils seront souvent très proches. 2) vous devez faire attention à la stabilité de l'algorithme.

sur une note plus, si vous êtes à l'étape où vous voulez trouver une fonction à partir de l'espace de fonctions qui correspond le mieux à vos données (par exemple, vous n'allez imposer, par exemple, le deuxième modèle sur vos données) , d'autres techniques de programmation génétique peuvent également aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top