Je voudrais courir une régression linéaire avec l'interception de Y-intercepte de 0,115. C'est le code que j'ai essayé. Je me suis mis à fit_intercept = true pour obtenir une interception non nulle, mais puis-je la définir à une valeur?
Aussi, comment puis-je obtenir la meilleure ligne d'ajustement à tracer plutôt qu'une ligne reliant chaque point?
Merci d'avance. P>
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit from sklearn.metrics import r2_score from sklearn.linear_model import LinearRegression x=np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]).reshape(-1,1) y=np.array([0.113, 0.116, 0.130, 0.150, 0.150, 0.160, 0.180, 0.210, 0.220, 0.260, 0.280]) regression=LinearRegression(fit_intercept=True).fit(x,y) r_sq=round(regression.score(x,y),4) m=round(regression.coef_[0],4) b=round(regression.intercept_,4) print("r_sq:", r_sq,"m:",m,"b:",b) plt.figure() plt.scatter(x,y) plt.title('A') plt.ylabel('X') plt.xlabel('Y') plt.plot(x,y,'r--',label='measured') plt.legend(loc='best')
3 Réponses :
Soustrayez l'interception Y Vous souhaitez résoudre vos données et définir Par exemple P> fit_intercept = false code>.
Fit intercept: True
r_sq: 0.9473
m: 0.0017
b: -0.0192
Fit intercept: False
r_sq: 0.9112
m: 0.0014
b: 0.0000
Les résultats ne correspondent pas à ce que je reçois de Excel. Je reçois: R_SQ: -3,1784 m: 0.0014 B: 0.0
Cependant, à partir d'Excel, les résultats sont r-carrés = 0,9473, la pente est de 0,0014 (qui correspond), et l'interception de y-intercept est de 0,115 comme forcé. J'ai changé en "r_sq = rond (régression.score (x, y-y__intercept), 4)" Mais le R-Squared ne correspond toujours pas. Je reçois 0.9112 plutôt que 0.9473. Dois-je modifier d'autres paramètres?
J'ai mis à jour ma réponse, jetez un coup d'oeil. Lorsque vous adaptez l'interception, vous obtenez la même valeur R ^ 2 comme Excel. Je ne sais pas ce qu'est Excel sous la hotte, mais j'ai joué autour de: vous pouvez définir l'interception sur n'importe quelle valeur i> non nulle et cela renvoie le même i> R ^ 2 valeur. On dirait un bug dans Excel pour moi.
Cela fonctionne et il semble que Excel donne la même valeur R ^ 2 pour les deux, donc probablement un bug. Les données que je reçois sont un peu différentes, mais cela provient d'une copie et d'une pâte de votre code, et correspond aux résultats d'Excel, à l'exception de la valeur R ^ 2 pour le cas "Fit Intercept: False". Ajustement d'interception: TRUE R_SQ: 0.9473 m: 0.0017 B: 0.0958 Ajustement Interception: Faux R_SQ: 0.9112 m: 0.0014 B: 0.1150
Cette réponse corrige la parcelle et la réponse ci-dessus fournit comment forcer une interception non nulle.
J'ai trouvé une solution générale qui m'a donné la même réponse, mais me permet également d'installer des équations qui ne sont pas linéaires en modifiant simplement la fonction.
import matplotlib.pyplot as plt from scipy.optimize import curve_fit import numpy as np #set y-intercept b=0.115 #Fitting function def func(x, m): return (x*m)+b #Experimental x and y data points x_A1 = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) y_A1 = np.array([0.113, 0.116, 0.130, 0.150, 0.150, 0.160, 0.180, 0.210, 0.220, 0.260, 0.280]) #Plot experimental data points plt.plot(x_A1, y_A1, 'bo', label='experimental') #Perform the curve-fit popt, pcov = curve_fit(func, x_A1, y_A1) #, initialGuess) #print(popt) #x values for the fitted function x_A1_Fit = np.arange(x_A1[0], x_A1[-1], 0.1) residuals = y_A1- func(x_A1, *popt) ss_res = np.sum(residuals**2) ss_tot = np.sum((y_A1-np.mean(y_A1))**2) r_sq = 1 - (ss_res / ss_tot) #Plot the fitted function plt.plot(x_A1_Fit, func(x_A1_Fit, *popt), 'r--', label='fitted: m=%5.4f' % tuple(popt)) plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show() print ('r_sq=', "%.4f"%r_sq, 'm=', "%.4f"%popt, "b=", "%.4f"%b)