paramètre d'ajustement à l'intérieur d'un python en utilisant un seul tenant (ou une autre langue utile)

voix
0

Je un ensemble de données, essentiellement avec les informations de f (x) en fonction de x, et x lui-même. Je sais que de la théorie du problème que je travaille sur le format de f (x), qui est donné comme l'expression ci-dessous:

Eq.

Essentiellement, je veux utiliser cet ensemble de données pour trouver les paramètres a et b. Mon problème est: Comment puis-je faire cela? Que dois-je utiliser la bibliothèque? Je voudrais une réponse en utilisant Python. Mais R ou Julia serait bien aussi.

De tout ce que je l' avais fait jusqu'à présent, je l' ai lu sur un appelé functionallity courbe en forme de la bibliothèque SciPy mais je vais avoir des ennuis sous quelle forme je ferais le code tant ma variable x est situé dans l' une de la limite d'intégration .

Pour de meilleures façons de travailler avec le problème, j'ai aussi les ressources suivantes:

Un ensemble d'échantillons , dont je connais les paramètres que je cherche. Pour cet ensemble , je sais que a = 2 et b = 1 (et c = 3). Et avant qu'il ne se lève quelques questions sur la façon dont je sais que ces paramètres: Je sais qu'ils parce que je créé cet ensemble échantillon à l' aide des paramètres de l'intégration de l'équation ci - dessus juste pour utiliser l'échantillon pour étudier comment puis - je les trouver et une référence.

J'ai aussi cet ensemble , pour lesquels la seule information dont je dispose est que c = 4 et que vous souhaitez trouver a et b.

Je voudrais aussi souligner que:

i) J'ai actuellement pas de code à poster ici parce que je n'ai pas la moindre idée comment écrire quelque chose pour résoudre mon problème. Mais je serais heureux d'éditer et de mettre à jour la question après avoir lu une réponse ou de l'aide que vous avez pu me fournir.

ii) Je suis à la recherche d'abord pour une solution où je ne sais pas a et b. Mais dans le cas où il est trop difficile, je serais heureux de voir une solution où je suppose que l'on a ou b est connu.

Créé 13/01/2020 à 23:59
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Ils sont trois variables a, b, c qui ne sont pas indépendants. L'un d'eux doit être donnée si l'on veut calculer les deux autres grâce à la régression. Avec donné c, la résolution a, b est simple:

entrez la description d'image ici

L'exemple de calcul numérique ci-dessous est faite avec une petite données (n = 10) afin de le rendre facile à vérifier.

entrez la description d'image ici

Notez que la régression est la fonction t (y) Wich est pas exactement les mêmes que pour y (x) lorsque les données sont dispersées (Le résultat est le même si aucune dispersion).

S'il est absolument nécessaire d'avoir la régression pour y (x) une régression non linéaire est nécessaire. Cela implique un processus itératif à partir de bonne estimation initiale enought a, b. Le calcul ci-dessus donne de très bonnes valeurs initiales.

EN OUTRE :

Pendant ce temps, Andrea a posté une réponse pertinente. Bien sûr, la mise en place avec sa méthode est mieux parce que cela est une régression non linéaire au lieu de linéaire comme déjà indiqué dans la note ci-dessus.

Néanmoins, dispite les différentes valeurs (a = 1,881, b = 1,617) par rapport à (a = 2,346, b = -0,361) les courbes respectives tracées ci-dessous ne sont pas loin l'un de l'autre:

Courbe bleue: à partir de la régression linéaire (méthode ci-dessus)

Courbe verte: à partir de la régression non linéaire (Andrea)

entrez la description d'image ici

Créé 14/01/2020 à 15:25
source utilisateur

voix
0

J'utiliser une approche numérique pur, que vous pouvez utiliser même si vous ne pouvez pas résoudre directement l'intégrale. Voici un snipper pour le montage que le aparamètre:

import numpy as np
from scipy.optimize import curve_fit
import pandas as pd
import matplotlib.pyplot as plt

def integrand(x, a):
    b = 1
    c = 3
    return 1/(a*np.sqrt(b*(1+x)**3 + c*(1+x)**4))

def integral(x, a):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

df = pd.read_csv('data-with-known-coef-a2-b1-c3.csv')
x = df.domin.values
y = df.resultados2.values
out_mean, out_var = curve_fit(vec_integral, x, y, p0=[2])

plt.plot(x, y)
plt.plot(x, vec_integral(x, out_mean[0]))
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}')
plt.show()

vec_integral = np.vectorize(integral)

entrez la description d'image ici

Bien sûr, vous pouvez réduire la valeur dxpour obtenir la précision souhaitée. Alors que pour le montage juste le a, lorsque vous essayez de sapin b, ainsi, l'ajustement ne converge pas correctement (à mon avis , car aet bsont fortement corrélées). Voici ce que vous obtenez:

def integrand(x, a, b):
    c = 3
    return 1/(a*np.sqrt(np.abs(b*(1+x)**3 + c*(1+x)**4)))

def integral(x, a, b):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a, b)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

out_mean, out_var = sp.optimize.curve_fit(vec_integral, x, y, p0=[2,3])
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}\nb = {out_mean[1]:.3f} +- {np.sqrt(out_var[1][1]):.3f}')

plt.plot(x, y, alpha=0.4)
plt.plot(x, vec_integral(x, out_mean[0], out_mean[1]), color='green', label='fitted solution')
plt.plot(x, vec_integral(x, 2, 1),'--', color='red', label='theoretical solution')
plt.legend()
plt.show()

entrez la description d'image ici

Comme vous pouvez le voir, même si les résultantes aet les bparamètres forment l'ajustement sont « pas bon », l'intrigue est très similaire.

Créé 14/01/2020 à 16:24
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more