最小二乘法

在最小二乘法或线性回归问题中,我们有测量值 \(A \in \mathcal{R}^{m \times n}\)\(b \in \mathcal{R}^m\),并且寻找一个向量 \(x \in \mathcal{R}^{n}\),使得 \(Ax\) 接近于 \(b\)。接近度被定义为平方差的和:

\[\sum_{i=1}^m (a_i^Tx - b_i)^2,\]

也被称为 \(\ell_2\) 范数的平方, \(\|Ax - b\|_2^2\)

例如,我们可能有 \(m\) 个用户的数据集,每个用户由 \(n\) 个特征表示。矩阵 \(A\) 的每一行 \(a_i^T\) 都是用户 \(i\) 的特征,而 \(b\) 的对应条目 \(b_i\) 是我们想要从 \(a_i^T\) 预测的测量值,比如广告花费。预测值由 \(a_i^Tx\) 给出。

我们通过求解优化问题来找到最优的 \(x\)

\[\begin{array}{ll} \mbox{最小化} & \|Ax - b\|_2^2. \end{array}\]

\(x^\star\) 为最优 \(x\)。量 \(r = Ax^\star - b\) 被称为残差。如果 \(\|r\|_2 = 0\),我们有一个完美的拟合。

例子 —-在下面的代码中,我们使用CVXPY解决了一个最小二乘问题。

# 导入包。
import cvxpy as cp
import numpy as np

# 生成数据。
m = 20
n = 15
np.random.seed(1)
A = np.random.randn(m, n)
b = np.random.randn(m)

# 定义并解决CVXPY问题。
x = cp.Variable(n)
cost = cp.sum_squares(A @ x - b)
prob = cp.Problem(cp.Minimize(cost))
prob.solve()

# 打印结果。
print("\n最优值为", prob.value)
print("最优的x为")
print(x.value)
print("残差的范数为", cp.norm(A @ x - b, p=2).value)
最优值为 7.005909828287484
最优的x为
[ 0.17492418 -0.38102551  0.34732251  0.0173098  -0.0845784  -0.08134019
  0.293119    0.27019762  0.17493179 -0.23953449  0.64097935 -0.41633637
  0.12799688  0.1063942  -0.32158411]
残差的范数为 2.6468679280023557