一元线性回归
上面针对 线性回归 的介绍内容中,我们列举了一个房屋面积与房价变化的例子。其中,房屋面积为自变量,而房价则为因变量。另外,我们将只有 1 个自变量的线性拟合过程叫做一元线性回归。
下面,我们就生成一组房屋面积和房价变化的示例数据。x 为房屋面积,单位是平方米; y 为房价,单位是万元。
import numpy as np
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
示例数据由 10 组房屋面积及价格对应组成。接下来,通过 Matplotlib 绘制数据点,x, y 分别对应着横坐标和纵坐标。
from matplotlib import pyplot as plt
%matplotlib inline
plt.scatter(x, y)
plt.xlabel("Area")
plt.ylabel("Price")
正如上面所说,线性回归即通过线性方程去拟合数据点。那么,我们可以令该 1 次函数的表达式为:
y(x,w)=w0+w1x (1)
公式 (1) 是典型的一元一次函数表达式,我们通过组合不同的 w0 和 w1 的值得到不同的拟合直线。
关于公式的重要说明
本次课程将会涉及到大量的公式,全部公式均使用 LaTeX 语法书写。由于渲染引擎上的区别,课程制作时优先支持 Notebook 环境中的公式显示,而「查看实验步骤」中部分公式可能无法正常渲染。
如果你急需在「查看实验步骤」时预览无法正常渲染的公式,可以选择复制粘贴相应的 LaTeX 代码到 一些在线编辑器 中预览。除此之外,由于一些因素限制,微信小程序中无法正常预览全部公式。
接下来,对公式 (1) 进行代码实现:
def f(x, w0, w1):
y = w0 + w1 * x
return y
那么,哪一条直线最能反应出数据的变化趋势呢?
想要找出对数据集拟合效果最好的直线,这里再拿出上小节图示进行说明。如下图所示,当我们使用 y(x,w)=w0+w1x 对数据进行拟合时,就能得到拟合的整体误差,即图中蓝色线段的长度总和。如果某一条直线对应的误差值最小,是不是就代表这条直线最能反映数据点的分布趋势呢?
正如上面所说,如果一个数据点为 (xi, yi),那么它对应的误差就为:
yi−(w0+w1xi) (2)
上面的误差往往也称之为「残差」。但是在机器学习中,我们更喜欢称作「损失」,即真实值和预测值之间的偏离程度。那么,对 n 个全部数据点而言,其对应的残差损失总和就为:
i=1∑n(yi−(w0+w1xi)) (3)
更进一步,在线性回归中,我们一般使用残差的平方和来表示所有样本点的误差。公式如下:
i=1∑n(yi−(w0+w1xi))2 (4)
使用残差平方和的好处在于能保证损失始终是累加的正数,而不会存在正负残差抵消的问题。对于公式 (4) 而言,机器学习中有一个专门的名词,那就是「平方损失函数」。而为了得到拟合参数 w0 和 w1 最优的数值,我们的目标就是让公式 (4) 对应的平方损失函数最小。
同样,我们可以对公式 (4) 进行代码实现:
def square_loss(x, y, w0, w1):
loss = sum(np.square(y - (w0 + w1*x)))
return loss
如果某条直线拟合样本得到的总损失最小,那么这条直线就是最终想得到的结果。而求解损失最小值的过程,就必须用到下面的数学方法了。
我们将公式 (7) 求解得到 w 的过程进行代码实现:
def w_calculator(x, y):
n = len(x)
w1 = (n*sum(x*y) - sum(x)*sum(y))/(n*sum(x*x) - sum(x)*sum(x))
w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))
return w0, w1
于是,可以向函数 w_calculator(x, y)
中传入 x 和 y 得到 w0 和 w1 的值。
w_calculator(x, y)
当然,我们也可以求得此时对应的平方损失的值:
w0 = w_calculator(x, y)[0]
w1 = w_calculator(x, y)[1]
square_loss(x, y, w0, w1)
接下来,我们尝试将拟合得到的直线绘制到原图中:
x_temp = np.linspace(50, 120, 100) # 绘制直线生成的临时点
plt.scatter(x, y)
plt.plot(x_temp, x_temp*w1 + w0, 'r')
从上图可以看出,拟合的效果还是不错的。那么,如果你手中有一套 150 平米的房产想售卖,获得预估报价就只需要带入方程即可:
f(150, w0, w1)
这里得到的预估售价约为 154 万元。这就是一个最小二乘法求解线性回归问题的完整过程。
最新评论