来源:原始 Jupyter Notebook。内容已转换为网页阅读格式;下载原文件

一元线性回归

假设有下面的数据,表示某地区房屋面积和售价的关系:

房屋面积(平米)售价(万)
39.93199
42.05290
43.18298
44.68310
49.87399
53.57420

将房屋面积作为横坐标(自变量),售价作为纵坐标(因变量),在二维坐标系中,可以画出一条类似直线的散点图:

import numpy as np
import matplotlib.pyplot as plt

plt.xlim(30, 60)
plt.ylim(100, 600)

X = np.array([[39.93,199],[42.05,290],[43.18,298],[44.68,310],[49.87,399],[53.57,420]])
plt.scatter(X[:,0], X[:,1])

plt.show()

运行结果

Notebook 运行结果

如何找到一条直线,能最大程度的拟合这些散点数据,这就是 线性回归,由于这里只有一个自变量,所以叫做 一元线性回归

import numpy as np
import matplotlib.pyplot as plt

plt.xlim(30, 60)
plt.ylim(100, 600)

X = np.array([[39.93,199],[42.05,290],[43.18,298],[44.68,310],[49.87,399],[53.57,420]])
plt.scatter(X[:,0], X[:,1])

x = np.linspace(30, 60, 100)
y = 15*x-360
plt.plot(x, y)

plt.show()

运行结果

Notebook 运行结果

在 Andrew Ng 的机器学习讲义中也举了个类似的例子,他使用的是美国俄亥俄州 Portland Oregon 城市的房屋价格,显得更真实一点。都是用房屋面积作为自变量,房屋价格作为因变量。我们知道一元线性函数一般表示为:

y=ax+b y = ax + b

一元线性回归就是确定这里的参数 a 和 b,如果刚好有两个点,就可以确定一个二元方程组:

{y1=ax1+by2=ax2+b \begin{cases} y_1 = ax_1 + b \\ y_2 = ax_2 + b \end{cases}

我们根据线性代数的知识,有很多种方法可以解这个方程组,比如矩阵消元法克莱姆法则逆矩阵增广矩阵法等等。但是对于大多数给定的数据集,线性方程组有唯一解的概率比较小,多数都是解不存在的超定方程组。对于这种问题,在计算数学中通常将参数求解问题退化为求最小误差问题,找到一个最接近的解,这叫做松弛求解