簡體   English   中英

scipy曲線擬合中的回歸系數

[英]Regression coefficient in scipy curve fitting

我面臨以下問題。

我有這個數據:

x = np.array([ 1.00E-03, 1.00E-04, 1.00E-05, 1.00E-06 ])

y = np.array([ 0.01, 0.002469136, 0.000771605, 0.000257202 ])

我想對這些數據進行冪律擬合並獲得回歸系數。

但是,我在 WPS office 和 scipy 之間得到了不同的結果。

我的代碼如下:

import numpy as np
from scipy.optimize import curve_fit
from sklearn.metrics import r2_score

xdata = x
ydata = y

# Power Law function
def f(x,a,b):
    return (a*(x**b))

popt, pcov = curve_fit(f,  xdata,  ydata)

r_squared = r2_score(ydata, f(xdata, popt[0], popt[1]))

在 WPS 辦公室,我得到 R² = 0.9968

在此處輸入圖片說明

在谷歌表中相同的值在此處輸入圖片說明

在 scipy 中,我得到 R² = 0.9995。

關於為什么會發生這種情況的任何解釋? 即使使用可能的不同算法,它們也應該收斂到類似的解決方案,不是嗎?

最好的祝福!

如果我將數據更改為對數日志中的線性擬合:

parameters =  np.polyfit(np.log(xdata), np.log(ydata), 1)

a = np.exp(parameters[1])
b = parameters[0]
r2_score(y, a*x**b)

我將獲得與 Excel 中相同的ab值,但現在 R² = 0.9883 ...

好的...我找到了答案。

R2 的計算如下: https://www.got-it.ai/solutions/excel-chat/excel-tutorial/r-squared/r-squared-in-excel

所以:

x_log = np.log(x)
y_log = np.log(y)

tmp1 = len(x)*(np.sum(x_log*y_log))-np.sum(x_log)*np.sum(y_log)
tmp2 = len(x)*np.sum(x_log**2)-np.sum(x_log)**2
tmp3 = len(x)*np.sum(y_log**2)-np.sum(y_log)**2    

r2 = (tmp1/np.sqrt(tmp2*tmp3))**2

產生正確的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM