机器学习 - 正规矩阵方法

利用正规方程进行线性回归预测

本文分为 理论介绍Python 代码实现 两部分

👉 点此直接跳转到代码实现

理论介绍

线性回归

线性回归是回归分析的一种。

假设目标值(因变量)与特征值(自变量)之间线性相关

然后构建损失函数;

最后通过令损失函数最小来确定参数。(最关键的一步)

损失函数

🔗 点击查看损失函数相关文档

正规方程

为了评估出线性函数拟合的怎么样,需要使用到 Cost Function(代价函数),代价函数越接近 0,说明越好,等于 0 的时候即为完全拟合,我们可以对损失函数求导并令其等于 0。

假设有 n 组数据,其中目标值(因变量)与特征值(自变量)之间的关系为:

$$ f(x(i))= \theta _ {0} + \theta _ {1} x_ {1}^ {(i)} + \cdots + \theta _ {n} x_ {n}^ {(i)} $$

用代码可以表示为 theta = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)

正规方程的的适用条件

在实际中可能会出现是奇异矩阵,往往是因为特征值之间不独立。这时候需要对特征值进行筛选,剔除那些存在线性关系的特征值(好比在预测房价中,特征值 1 代表以英尺为尺寸计算房子,特征值 2 代表以平方米为尺寸计算房子,这时特征值 1 和特征值 2 只需要留 1 个即可)。

正规方程很方便而且容易实现,但是如果特征变量的数量变得很大的时候,计算量就会变得非常巨大,训练的速度将会变慢,所以,在使用正规方程时,应该考虑样本的数量,如果 n 超过 10000 时,建议不使用正规方程,可以使用下节讲到的梯度下降。

均值方差

在得到 $\theta $ 后,就可以预测出结果 prediction = x_test.dot(theta)

模型评估其实是相似的法则——找真实标签和预测值的差异。

我们的回归类算法中,可以使用均值方差评判是否预测到了正确的数值、以及是否拟合到了足够的信息。

$$ MSE= \frac {1}{m} \sum _ {i=1}^ {m} (f(x_ {i})-y_ {i})^ {2} $$

用代码可以表示为:mse = np.mean((prediction - y)**2) 其中 prediction 表示预测结果,y 表示目标值。

Python 代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def lr(x_train, x_test, y_train, y_test):
    """
    :param x_train: 训练集
    :param x_test: 训练集标签
    :param y_train: 测试集
    :param y_test: 测试集标签
    :return: 预测值与测试集标签的均方误差
    """
    
    # 使用正规方程公式求得 theta
    theta = np.linalg.inv(x_train.T.dot(x_train)).dot(x_train.T).dot(y_train)
    # 使用 theta 预测结果
    prediction = x_test.dot(theta)
    # 求出预测值与目标值的均方误差
    mse = np.mean((prediction-y_test)**2)
    
    # 输出四舍五入,保留到小数点后 15 位
    return round(mse, 15)