损失函数就是为了度量模型计算值与真实值的差异大小,通用的损失函数表达式即为将每个样本数据值与模型计算值的差值平方后求累计和,最后对样本求平均。
通用的损失函数表达式如下所示:
(1)
:损失函数,将所有样本的结果与模型计算的结果求差再平方,计算累计和
:样本数量,为了避免样本数量对损失值的影响,故平方和除以m求平均
:代表样本数据中的结果值,一共有m个,这里可以先试图理解为一个m行的列向量
:代表模型求出的值,一共有m个,即为模型结果向量
一元线性方程表达式如下:
(2)
注意:
a.因变量的数量决定了线性回归的元数,一元线性只有一个因变量存在;
b.上述表达式只表达了一个样本值的关系,样本数量由上角标表示;
根据以上一元线性公式(2)可推导出模型计算值表达式:
(3)
上述表达式(3)代入通用损失函数(1)即可得到一元线性回归模型的损失函数:
(4)
注意:
损失函数与线性回归模型函数不同,损失函数的因变量是参数,而
是参数
无论是简单一元线性回归还是多元线性回归,可以看出其参数至少有两个及以上,这就决定了损失函数是多元函数。
接下来我们将基于一元线性回归的损失函数推导过程应用到更通用的多元线性回归的损失函数推导。
多元线性回归模型表达式如下:
(5)
考虑到有多个样本的存在,每个自变量都存在m个样本值,矩阵表达如下:
是一个m行n列的矩阵,行代表了样本数量,列代表了样本维度(即样本特征值数量)
是一个列向量,又称参数向量,向量中的每个元素即为参数值
如果用向量表达的话,可转换为:
(6)
注意:上述表达式非常重要,后续求梯度及代码实现均是基于向量表达式,为了更好的理解向量表达式,笔者用代码实现构造了如下样本数据帮助理解:
import numpy as np
np.random.seed(666)
# 随机10个数
x = np.random.random(size=10)
# 将10个随机数转换成5行2列的矩阵,并在矩阵的第一列添加一个全为1的列向量
X_b = np.hstack([np.ones((5, 1)), x.reshape(-1, 2)])
# 三个参数构成的列向量作为参数向量
theta = np.array([3, 4, 5]).reshape(-1, 1)
"""
y_hat: 是一个样本数量为5的列向量
X_b: 是一个(3,5)的样本矩阵,有2个特征值,5个样本
theta:是一个参数量为5的列向量
"""
y_hat = X_b.dot(theta)
print("X.theta = {} . {} = {}".format(X_b, theta, y_hat))
X.theta = y_hat
[[1 0.70043712 0.84418664] .[[3] = [[10.0226817 ]
[1 0.67651434 0.72785806] [4] [ 9.34534763]
[1 0.95145796 0.0127032 ] [5]] [ 6.86934781]
[1 0.4135877 0.04881279] [ 4.89841476]
[1 0.09992856 0.50806631]] [ 5.94004577]]
将上述线性回归向量表达式(6)带入通用损失函数表达式(1)中,我们就得到了通用的线性回归损失函数:
(7)
如果看不习惯向量表达式,可换成数值表达式,即为:
(8)