用一个简单的函数拟合一个小的 DataFrame
Fit a small DataFrame with a simple function
我有一组具有以下形状的数据框:
dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})
`dat
Out[14]:
Y X
0 0.0455 0.055
1 0.0790 0.110
2 0.0590 0.165
3 0.1440 0.220
我正在尝试用函数拟合此数据:Y = kX**m
我的预期输出是获取参数 'k' 和 'm'
似乎这不是一项艰巨的工作,但我只找到了一些使用 'scipy.optimize.curve_fit' 的示例,这些示例需要几轮模拟才能拟合数据,我认为仅对少数几个数字来说太复杂了。
一些想法?
线索:使用我已经知道的商业软件
k = -0.3176
米 = 0.8935
提前致谢
遵循 scipy.optimize.curve_fit
documentation.
上的示例并不复杂
此外,您不会获得与 商业软件 相同的值,因为您的数据集太小而无法正确拟合。
import pandas as pd
from scipy.optimize import curve_fit
def func(x, k, m):
return k * (x**m)
dat = pd.DataFrame({'Y': [0.0455, 0.079, 0.059, 0.144], 'X': [0.055, 0.110, 0.165, 0.220]})
popt, pcov = curve_fit(func, dat.X.values, dat.Y.values)
print('k:', popt[0])
print('m:', popt[1])
k: 0.4813840693004318
m: 0.8935556114206501
您可以线性化您的 data/model 并使用最小二乘法:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})
def func(x, y):
Y = np.log(y)
X = np.log(x)
M = np.array((np.ones(len(X)), X)).T
lnk, m = np.linalg.solve(np.dot(M.T, M), np.dot(M.T, Y))
return np.exp(lnk), m
x = dat['X']
y = dat['Y']
k, m = func(x, y)
print('k: ', k)
print('m: ', m)
k: 0.2922891128901261
m: 0.6501306234660938
我有一组具有以下形状的数据框:
dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})
`dat
Out[14]:
Y X
0 0.0455 0.055
1 0.0790 0.110
2 0.0590 0.165
3 0.1440 0.220
我正在尝试用函数拟合此数据:Y = kX**m 我的预期输出是获取参数 'k' 和 'm'
似乎这不是一项艰巨的工作,但我只找到了一些使用 'scipy.optimize.curve_fit' 的示例,这些示例需要几轮模拟才能拟合数据,我认为仅对少数几个数字来说太复杂了。 一些想法?
线索:使用我已经知道的商业软件 k = -0.3176 米 = 0.8935
提前致谢
遵循 scipy.optimize.curve_fit
documentation.
上的示例并不复杂
此外,您不会获得与 商业软件 相同的值,因为您的数据集太小而无法正确拟合。
import pandas as pd
from scipy.optimize import curve_fit
def func(x, k, m):
return k * (x**m)
dat = pd.DataFrame({'Y': [0.0455, 0.079, 0.059, 0.144], 'X': [0.055, 0.110, 0.165, 0.220]})
popt, pcov = curve_fit(func, dat.X.values, dat.Y.values)
print('k:', popt[0])
print('m:', popt[1])
k: 0.4813840693004318
m: 0.8935556114206501
您可以线性化您的 data/model 并使用最小二乘法:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dat = pd.DataFrame({'Y':[0.0455,0.079,0.059,0.144],'X':[0.055,0.110,0.165,0.220]})
def func(x, y):
Y = np.log(y)
X = np.log(x)
M = np.array((np.ones(len(X)), X)).T
lnk, m = np.linalg.solve(np.dot(M.T, M), np.dot(M.T, Y))
return np.exp(lnk), m
x = dat['X']
y = dat['Y']
k, m = func(x, y)
print('k: ', k)
print('m: ', m)
k: 0.2922891128901261
m: 0.6501306234660938