scipy 如何在Python中改变一条线的截距,使它通过一个选定的点?

wbrvyc0a  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(106)

我试图编写一个函数,使回归趋势线垂直移动,使其通过最低数据点。这一点起初看起来很简单,直到我意识到,线的斜率决定了哪一点最远。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

x = np.arange(0,10,2)
y = np.random.random(5)

res = linregress(x,y)

plt.figure(figsize=(9,4),dpi=450)
plt.plot(x, y, 'o', label='original data')
plt.plot(x, res.intercept + res.slope*x, 'r', label='fitted line')

plt.legend()
plt.show()

此代码生成的回归线的图像:

手动移动截距值后的直线图像:

如果能提供任何帮助,我们将不胜感激。

mkshixfv

mkshixfv1#

您已经知道如何在给定x值的情况下获取直线上任意点的y值:通过应用直线方程(y =斜率 * x +截距),就像绘制直线时所做的那样。这样就可以计算残差,残差是每个点的实际y值与回归直线估计的y值之间的差值。要移动直线,使其通过最低点(通过与直线的垂直距离来测量),将最小(即,最负)残差添加到每个y值:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

np.random.seed(42)

x = np.arange(0, 10, 2)
y = np.random.random(5)

res = linregress(x, y)

plt.figure(figsize=(9,4),dpi=450)
plt.plot(x, y, 'o', label='original data')
plt.plot(x, res.slope * x + res.intercept, 'r', label='fitted line')

residuals = [b - (res.slope * a + res.intercept)  for a, b in zip(x, y)]
shift = np.min(residuals)
plt.plot(x, res.slope * x + res.intercept + shift, 
         label='shifted line', color='blue')

plt.legend()
plt.show()

相关问题