我知道如何使用 Python 通过最小二乘法求解 A.X = B:
示例:
A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]
B=[1,1,1,1,1]
X=numpy.linalg.lstsq(A, B)
print X[0]
# [ 5.00000000e-01 5.00000000e-01 -1.66533454e-16 -1.11022302e-16]
但是如果权重矩阵不是恒等式来求解相同的方程呢:
A.X = B (W)
示例:
A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]
B=[1,1,1,1,1]
W=[1,2,3,4,5]
可以使用加权最小二乘法来解决这个问题。在加权最小二乘法中,我们试图最小化加权残差平方和,而不是普通最小二乘法中最小化残差平方和。
以下是如何在 Python 中使用权重矩阵执行加权最小二乘法:
import numpy as np
A = np.array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 0, 0]])
B = np.array([1, 1, 1, 1, 1])
W = np.array([1, 2, 3, 4, 5])
# 创建一个对角权重矩阵
W_matrix = np.diag(W)
# 计算加权最小二乘解
X = np.linalg.solve(A.T @ W_matrix @ A, A.T @ W_matrix @ B)
print(X)
解释:
- 创建对角权重矩阵:
-
W_matrix = np.diag(W)
使用权重列表W
创建一个对角矩阵。这将权重放置在矩阵的对角线上,表示每个数据点的相对重要性。 -
计算加权最小二乘解:
-
X = np.linalg.solve(A.T @ W_matrix @ A, A.T @ W_matrix @ B)
使用以下公式计算加权最小二乘解:-
(A^T * W * A)^-1 * A^T * W * B
-
其中
@
是矩阵乘法运算符,A.T
是A
的转置,W
是权重矩阵。
-
这个解决方案是如何工作的:
加权最小二乘法通过赋予某些数据点比其他数据点更大的权重来修改普通最小二乘法。具有较大权重的数据点对最终解的影响更大。在数学上,这相当于最小化加权残差平方和,其中每个残差都乘以其相应数据点的权重。
在上面的代码中,我们通过创建一个对角权重矩阵并将数据和设计矩阵分别乘以该矩阵的平方根,将加权最小二乘问题转换为等效的普通最小二乘问题。然后,我们可以使用标准最小二乘法求解该问题。
注意:
-
确保的权重矩阵
W
的维数与的数据点数相同。 - 权重不必总和为 1。它们表示每个数据点的相对重要性。