我可以使用 scikit-learn 中的
LinearRegression
类来计算完整的线性回归:
XX=np.array(plotx_aj).reshape((-1, 1))
YY=np.array(ploty_aj)
model=LinearRegression().fit(XX,YY)
r_sq=model.score(XX,YY)
inter=model.intercept_
coeff=model.coef_
r_sq, i, coef
这给了我以下情节
但是,我正在尝试拟合一条具有固定斜率的线。我只需要计算线的截距。
我首先考虑使用的方法是以下方法:
我认为我的解决方案给出了一个很好的近似值,但它非常糟糕。这就是为什么我试图用回归类型的方法来接近截距的值。我浏览了很多网站,但他们只描述了如何在 python 上进行线性回归,但似乎没有人谈论用固定系数进行线性回归,所以我什至不知道这是否可能或是否有意义。
由于您要计算固定斜率的截距,因此可以将此问题作为 SSE 上实际点与描述具有已知斜率和单个变量的线的函数之间的最小化问题:截距。
首先,让我们围绕一个已知的线方程创建一组带有一些噪声的点:
y = 0.5 * x + 0.1
.
from matplotlib import pyplot as plt
import numpy as np
def known_equation(x):
# m = 0.5; c = 0.1
return 0.5 * x + 0.1
def noise(y, n=0.05):
return y + (np.random.random(y.shape) - 0.5) * n
xvals = np.random.random((100,))
yvals = noise(known_equation(xvals))
line_x = np.linspace(0, 1, 10)
line_y = known_equation(line_x)
plt.subplots()
plt.plot(xvals, yvals, '.')
plt.plot(line_x, line_y, '-k')
接下来,让我们编写一个函数,计算已知点与假设直线之间的误差平方和
y = m * x + c
:
def err_f(m, c, known_x, known_y):
y_pred = m * known_x + c
return ((known_y - y_pred)**2).sum()
scipy.optimize.minimize
,但您可以使用您喜欢的任何其他内容。 functools.partial
调用修复了 err_f
的已知参数:m
、known_x
和 known_y
。
from functools import partial
from scipy.optimize import minimize
err_f_fixed = partial(err_f, 0.5, known_x=xvals, known_y=yvals)
# Make sure err_f_fixed is correct:
assert err_f(0.5, 0.1, xvals, yvals) == err_f_fixed(0.1)
opt_result = minimize(err_f_fixed, 0)
opt_intercept = opt_result.x[0] # Since this is an array, take its first element
我们得到
opt_intercept = 0.09903487233324053
,这已经足够接近我们已知的0.1
值了!
当我们绘制此图并比较两条线时,我们发现它们几乎相同:
line_y_calculated = 0.5 * x_plot + opt_intercept
plt.plot(line_x, line_y_calculated, '--r')