J'essaie de faire un ajustement général des moindres carrés pour trouver la meilleure ligne d'ajustement à travers quelques points de données (x, y). J'ai été capable de le faire via scipy, mais j'ai du mal à appliquer des poids. Je voudrais obtenir les poids à partir des résidus de l'ajustement d'origine et tenter une réorganisation via les moindres carrés en utilisant les poids. Les poids devraient être l'inverse des résidus, mais puisque -1 < residuals < 1
et ceci est juste un exemple, je suis d'accord avec l'utilisation des résidus comme les poids. Les points de données (x, y) sont calculés ailleurs, et le but est de trouver un alpha (1/pente) et d'intercepter pour la meilleure droite d'ajustement y = x/alpha +. Mon code est le suivant:Comment puis-je appliquer des poids dans cette routine d'optimisation des moindres carrés scipy?
import numpy as np
from scipy.optimize import least_squares
ydata = [9.7372923, 10.0587245, 10.3838510, 10.6931371, 10.9616260, 11.1833220, 11.3806770, 11.5248917, 11.7353000]
xdata = np.array([j+5 for j in range(len(ydata))])
def get_weights(resid):
"""
This function calculates the weights per (x,y) by using the inverse of the squared residuals divided by the total sum of the inverse of the squared residuals.
This might be incorrect but should work for the sake of example.
"""
total = sum([abs(resid[i]) for i in range(len(resid))])
fract = np.array([resid[i]/total for i in range(len(resid))])
return fract
def get_least_squares_fit(xs, ys):
"""
This function finds alpha (1/slope) and the y-intercept in the equation
of a line y = x/alpha + intercept = mx + b
"""
## SPECIFY INITIAL GUESS OF OPTIMIZED PARAMETERS
params_guess = [1/3, 9] ## ps = [alpha, intercept]
## DEFINE FITTING FUNCTIONS
fit_func = lambda ps,x : x/ps[0] + ps[1]
err_func = lambda ps,x,y : fit_func(ps,x) - y
## GET OPTIMIZED PARAMETERS, RESIDUALS & WEIGHTS
res = least_squares(err_func, params_guess, args=(xs, ys))
alpha, intercept, residuals = res.x[0], res.x[1], res.fun
weights = get_weights(residuals)
return alpha, intercept, residuals, weights
alpha, intercept, residuals, weights = get_least_squares_fit(xdata, ydata)
print(alpha, intercept)
>> 4.03378447722 8.6198247828
print(residuals)
>> [ 0.12206326 0.04853721 -0.02868313 -0.09006308 -0.11064582 -0.08443567
-0.03388451 0.06980694 0.1073048 ]
EDIT: Je obtenir des résultats identiques en utilisant scipy curve_fit, qui a sigma
et absolute_sigma
. Je suppose que c'est la meilleure façon de procéder. J'essaie toujours de le comprendre cependant.
Serait-il suffisant pour atteindre votre objectif global d'effectuer une régression par rapport aux données d'origine, montage à la plus petite somme d'erreur relative au carré, plutôt que de montage au plus bas somme d'erreur absolue au carré? –
Cela serait suffisant pour cet exemple. Je suis plus préoccupé par la façon d'appliquer les poids plutôt que les poids eux-mêmes; le carré absolu était juste une supposition de ma part. – mikey