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