NumPy 中的最小二乘法

Muhammad Maisam Abbas 2021年10月2日
NumPy 中的最小二乘法

本文将介绍如何用 Python 中的最小二乘法计算 AX = B。

Python 中带有 numpy.linalg.lstsq() 函数的最小二乘 NumPy

方程 AX = B 被称为线性矩阵方程。numpy.linalg.lstsq() 函数可用于在 Python 中使用最小二乘法求解线性矩阵方程 AX = B。实际上,这很简单。此函数采用矩阵并以另一个矩阵的形式返回线性矩阵方程的最小二乘解。请参考以下代码示例。

import numpy as np

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 = np.linalg.lstsq(A, B, rcond=-1)
print(X[0])

输出:

[5.00000000e-01 5.00000000e-01 1.09109979e-16 1.64621130e-16]

在上面的代码中,我们使用 Python 中的 np.linalg.lstsq() 函数计算了线性矩阵方程 AX = B 的解。当我们开始向矩阵添加权重时,这种方法会变得有点棘手。我们可以使用两种主要方法来找到此类问题的解决方案。

第一个解决方案涉及使用带有 np.newaxis 说明符的数组索引来为权重添加新维度。它在下面的编码示例中进行了说明。

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])

Aw = A * np.sqrt(W[:, np.newaxis])
Bw = B * np.sqrt(W)

X = np.linalg.lstsq(Aw, Bw, rcond=-1)
print(X[0])

输出:

[ 5.00000000e-01  5.00000000e-01 -4.40221936e-17  1.14889576e-17]

在上面的代码中,我们使用 Python 中的 np.newaxisnp.linalg.lstsq() 函数计算了线性矩阵方程 AX = B 的解以及权重 W。这种方法工作正常,但不是很容易理解和阅读。

第二种解决方案更具可读性和易于理解。它涉及将权重转换为对角矩阵,然后使用它。它在下面的编码示例中进行了演示。

import numpy as np

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]

W = np.sqrt(np.diag(W))

Aw = np.dot(W, A)
Bw = np.dot(B, W)

X = np.linalg.lstsq(Aw, Bw, rcond=-1)
print(X[0])

输出:

[ 5.00000000e-01  5.00000000e-01 -4.40221936e-17  1.14889576e-17]

在上面的代码中,我们通过将权重转换为对角矩阵,然后使用 np.linalg.lstsq() 函数计算了线性矩阵方程 AX = B 的解以及权重 W

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn