如何计算具有预定义斜率的线性回归?

问题描述 投票:0回答:1

我可以使用 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

这给了我以下情节

Linear regression

但是,我正在尝试拟合一条具有固定斜率的线。我只需要计算线的截距。

我首先考虑使用的方法是以下方法:

  • 取所有描述我的物体在其他温度下的轮廓的点,
  • 然后减去他们的距离*斜率
  • 这会使图片旋转,然后我只需要取点的平均值,这将给我一个截距的近似值。

我认为我的解决方案给出了一个很好的近似值,但它非常糟糕。这就是为什么我试图用回归类型的方法来接近截距的值。我浏览了很多网站,但他们只描述了如何在 python 上进行线性回归,但似乎没有人谈论用固定系数进行线性回归,所以我什至不知道这是否可能或是否有意义。

python python-3.x scikit-learn linear-regression
1个回答
1
投票

由于您要计算固定斜率的截距,因此可以将此问题作为 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')

enter image description here

接下来,让我们编写一个函数,计算已知点与假设直线之间的误差平方和

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')

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.