【问题标题】:Plotting regression line绘制回归线
【发布时间】:2018-07-10 09:41:04
【问题描述】:

我在绘制一些回归线时遇到了一些问题。我的问题可能是我没有正确理解这些函数所做的数学运算,所以我在这里要求确定。

from matplotlib import pyplot as plt
import numpy as np

def estimate_coef(x, y):
    # number of observations/points
    n = np.size(x)

    # mean of x and y vector
    m_x, m_y = np.mean(x), np.mean(y)

    # calculating cross-deviation and deviation about x
    SS_xy = np.sum(y*x - n*m_y*m_x)
    SS_xx = np.sum(x*x - n*m_x*m_x)

    # calculating regression coefficients
    b_1 = SS_xy / SS_xx
    b_0 = m_y - b_1 * m_x

    return (b_0, b_1)

def plot_regression_line(xs, ys):
    # dev stands for deviation
    dev = estimate_coef(xs, ys)

    y_pred = []
    for x in xs:
        y_pred.append(dev[0] + dev[1] * x)

    # plotting the regression line
    plt.plot(xs, y_pred, color = "g")

def main():
    # Defining points.
    xarr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    yarr = [1, 3, 2, 5, 7, 8, 8, 9, 10, 12]

    # Setting points as numpy arrays.
    # It is more convenient this way for further process.
    x = np.array(xarr)
    y = np.array(yarr)

    # Plotting points.
    plt.scatter(x, y)

    plot_regression_line(x, y)
    plt.show()

if __name__ == "__main__":
    main()

上面的代码显示了一个很好的绘制图形,例如:

但是...如果我反转我的y 轴中的点,只是为了测试我的功能,例如在main() 功能中我会这样做:

yarr = [1, 3, 2, 5, 7, 8, 8, 9, 10, 12]
yarr.reverse()

我得到以下...


显然希望我的plot_regression_line 函数为我绘制我正在等待考虑我输入的数据的线。而且我不明白为什么这不起作用。

我认为问题出在 estimate_coef 函数,尤其是 b_0 的计算方式,但我不知道应该应用哪些更改才能使函数按预期工作。

【问题讨论】:

标签: python numpy matplotlib linear-regression


【解决方案1】:

我不知道,你从哪里得到你的回归公式。 Wikipedia has a different one.如果你把它转录成你的脚本约定,它应该是

SS_xy = np.sum((x - m_x) * (y - m_y))
SS_xx = np.sum(x*x - m_x*m_x)

这为您提供了两种情况下的正确回归线。而且您不再需要计算n,因为在计算平均值时已经将其考虑在内。

【讨论】:

  • 好吧,老实说,我不知道我在哪里找到了公式,我很久以前就关闭了标签,不记得我从哪里得到的。感谢您指出公式中的错误。由于我来自文学背景,我很难将纯数学公式翻译成编程。我找到公式,测试它们,如果它们有效,试着找出它们是如何从数学转化为 prog 的。如果他们不这样做,我会尝试解决它们,但这对我来说太多了。 ://
  • 很高兴,我们解决了这个问题。对于 Math.SE 或 Cross Validated.SE,这实际上是一个很好的问题,为什么您的公式在一种情况下给出了相似(尽管不完全相同)的斜率,而在另一种情况下给出了负值。
  • 我已经知道我基本上不需要太多的数学背景来执行这样的操作,因为像 scipy(或 sklearn 和其他一堆)这样的库已经很好地实现了数学。但我需要理解数学是如何运作的才能变得更好。 ;)
  • 优秀的答案。我很震惊,这里有多少人试图实现人脸识别、遗传算法和神经网络学习,却无法掌握基本的数学概念。
  • 好吧,另一个论点是不要重新发明轮子。而且由于它已经实施了……如果您不想在研究领域工作,有时,您最好学习如何使用研究人员为您制作的工具。我不需要深入理解数学原理的每一步,但如果我从头到尾理解一个例子,包括所有的矩阵操作......我相信我已经是一名优秀的数据科学家了。 --- 我读过,很难的是想象力。 “机器学习很容易。在现实生活中应用机器学习才是真正的挑战”。
猜你喜欢
  • 2017-06-12
  • 2016-05-12
  • 2021-11-23
  • 1970-01-01
  • 2017-02-05
  • 2012-11-28
  • 1970-01-01
  • 2023-01-17
  • 2021-10-12
相关资源
最近更新 更多