Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多元线性回归模型的截距和系数预测_Python_Curve Fitting - Fatal编程技术网

Python 多元线性回归模型的截距和系数预测

Python 多元线性回归模型的截距和系数预测,python,curve-fitting,Python,Curve Fitting,我有以下等式: P = B0 + B1*Var1 + B2*Var2 我随身携带p、Var1和Var2的值。我尝试对此进行建模,然后计算系数和截距 下面是我得到的代码和输出: P = [1035.89, 1060.4, 1064, 1075.89, 1078.69, 1074.93, 1090.71, 1080.95, 1086.19,1080.46] # Total power l = [51.275510204081634, 102.89115646258503, 160.7142857

我有以下等式:

P = B0 + B1*Var1 + B2*Var2
我随身携带
p
Var1
Var2
的值。我尝试对此进行建模,然后计算系数和截距

下面是我得到的代码和输出:

P = [1035.89, 1060.4, 1064, 1075.89, 1078.69, 1074.93, 1090.71, 1080.95, 1086.19,1080.46] # Total power

l = [51.275510204081634, 102.89115646258503, 160.7142857142857, 205.78231292517006, 256.80272108843536, 307.82312925170066, 360.5442176870748, 409.0136054421768, 460.03401360544217, 492.3469387755102]
t = [6.110918671507064, 12.262374116954474, 19.153625686813186, 24.524748233908948, 30.60526432496075, 36.685780416012555, 42.96898037676609, 48.7454706632653, 54.82598675431711, 58.67698027864992]


X = []
for index in range(0,len(P)):
    row = []
    row.append(t[index])
    row.append(l[index])
    X.append(row)

print "Using statsmodels"
import statsmodels.api as sm

X = sm.add_constant(X)
est = sm.OLS(P, X).fit()

print est.params[0]
print est.params[1]
print est.params[2]
我得到的结果如下:

Using statsmodels
1048.32518503
0.0102496334198
0.0860026475829
这是正确的吗?
est.params[0]
是否指等式的
B0
? 当我运行实验时,我得到
B0
600-650
范围内


此数据是否会因为数据错误而不匹配?

我不熟悉
statsmodels
,但这里有一个使用
曲线拟合的实现(请参见下面的代码)。模型预测与您观察到的实验结果不匹配的原因是,我认为您的模型(
B0+B1*Var1+B2*Var2
)不能很好地描述数据(指数/log/sqrt可能更好)。在下一个图中,我显示了原始数据、通过
曲线拟合获得的拟合(下面的代码)和使用参数的拟合

如您所见,两个拟合函数给出相同的结果,但是,在我看来,您的数据应该由另一个函数建模。如果我有时间,我会寻找更适合您的数据的函数

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

P = [1035.89, 1060.4, 1064, 1075.89, 1078.69, 1074.93, 1090.71, 1080.95, 1086.19,1080.46] # Total power
l = [51.275510204081634, 102.89115646258503, 160.7142857142857, 205.78231292517006, 256.80272108843536, 307.82312925170066, 360.5442176870748, 409.0136054421768, 460.03401360544217, 492.3469387755102]
t = [6.110918671507064, 12.262374116954474, 19.153625686813186, 24.524748233908948, 30.60526432496075, 36.685780416012555, 42.96898037676609, 48.7454706632653, 54.82598675431711, 58.67698027864992]

# your model
def func(x, b0, b1, b2):

    var1, var2 = x

    return b0 + np.dot(b1, var1) + np.dot(b2, var2)

# Curve fit
coeff, _ = curve_fit(func, (l, t), P)
b0, b1, b2 = coeff[0], coeff[1], coeff[2]
print b0, b1, b2

# plot the data
xval = range(1 ,len(P)+1)
plt.scatter(xval, P, s=30, marker = "v", label='P')
plt.scatter(xval, func((l,t), *coeff), s=30, marker = "v", color="red", label='curvefit')
plt.legend(loc='upper left')
plt.figure()
plt.scatter(xval, P, s=30, marker = "v", label='P')
plt.scatter(xval, func((l, t), 1048.32518503, 0.0860026475829, 0.0102496334198 ), s=30, marker = "v",color="black",label='your parameter')
plt.legend(loc='upper left')
plt.show()
print "residuals curve_fit:",((P - func((l,t), *coeff))**2).sum()
print "residuals stats:",((P - func((l,t), 1048.32518503,0.086002647582,0.0102496334198))**2).sum()

我不熟悉
statsmodels
,但这里有一个使用
curve\u fit
的实现(请参见下面的代码)。模型预测与您观察到的实验结果不匹配的原因是,我认为您的模型(
B0+B1*Var1+B2*Var2
)不能很好地描述数据(指数/log/sqrt可能更好)。在下一个图中,我显示了原始数据、通过
曲线拟合获得的拟合(下面的代码)和使用参数的拟合

如您所见,两个拟合函数给出相同的结果,但是,在我看来,您的数据应该由另一个函数建模。如果我有时间,我会寻找更适合您的数据的函数

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

P = [1035.89, 1060.4, 1064, 1075.89, 1078.69, 1074.93, 1090.71, 1080.95, 1086.19,1080.46] # Total power
l = [51.275510204081634, 102.89115646258503, 160.7142857142857, 205.78231292517006, 256.80272108843536, 307.82312925170066, 360.5442176870748, 409.0136054421768, 460.03401360544217, 492.3469387755102]
t = [6.110918671507064, 12.262374116954474, 19.153625686813186, 24.524748233908948, 30.60526432496075, 36.685780416012555, 42.96898037676609, 48.7454706632653, 54.82598675431711, 58.67698027864992]

# your model
def func(x, b0, b1, b2):

    var1, var2 = x

    return b0 + np.dot(b1, var1) + np.dot(b2, var2)

# Curve fit
coeff, _ = curve_fit(func, (l, t), P)
b0, b1, b2 = coeff[0], coeff[1], coeff[2]
print b0, b1, b2

# plot the data
xval = range(1 ,len(P)+1)
plt.scatter(xval, P, s=30, marker = "v", label='P')
plt.scatter(xval, func((l,t), *coeff), s=30, marker = "v", color="red", label='curvefit')
plt.legend(loc='upper left')
plt.figure()
plt.scatter(xval, P, s=30, marker = "v", label='P')
plt.scatter(xval, func((l, t), 1048.32518503, 0.0860026475829, 0.0102496334198 ), s=30, marker = "v",color="black",label='your parameter')
plt.legend(loc='upper left')
plt.show()
print "residuals curve_fit:",((P - func((l,t), *coeff))**2).sum()
print "residuals stats:",((P - func((l,t), 1048.32518503,0.086002647582,0.0102496334198))**2).sum()

除了我下面的回答:你能说说数据的背景吗?这可能会更容易找到合适的型号。数据指的是智能手机的能耗值。好的,我在回答下面添加了另一条评论。线性拟合可以很好地描述没有第一个数据点的数据,但仍然离B0=650很远。观察到的不匹配在回答中很快提到,如果还需要其他东西,请告诉我!除了我下面的回答:你能说说数据的背景吗?这可能会更容易找到合适的型号。数据指的是智能手机的能耗值。好的,我在回答下面添加了另一条评论。线性拟合可以很好地描述没有第一个数据点的数据,但仍然离B0=650很远。观察到的不匹配在回答中很快提到,如果还需要其他东西,请告诉我!解释模型方程的文本强调方程是线性的,因此曲线拟合可能会偏离模型。(如果这种理解是错误的,请更正)。很遗憾,我对您的数据背景了解不够。我更新了我的帖子:在原始版本中,我混淆了你的参数(B1和B2)。现在,拟合方法和曲线拟合给出了相同的结果。合身看起来并不可怕;我只是在想,另一个函数可以更好地描述数据,但如果底层模型是“已知”的,那么它应该是好的。答案是回答你的问题还是你还需要别的什么?如果是这样,请让我知道,然后我修改代码。解释模型方程的文本强调方程是线性的,因此曲线拟合会有点偏离模型。(如果这种理解是错误的,请更正)。很遗憾,我对您的数据背景知之甚少。我更新了我的帖子:在原始版本中,我混淆了你的参数(B1和B2)。现在,拟合方法和曲线拟合给出了相同的结果。合身看起来并不可怕;我只是在想,另一个函数可以更好地描述数据,但如果底层模型是“已知”的,那么它应该是好的。答案是回答你的问题还是你还需要别的什么?如果是,请告诉我,我会修改代码。