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
の解を計算しました。このメソッドは、行列に重みを追加し始めると少し注意が必要になります。この種の問題の解決策を見つけるために使用できる主な方法は 2つあります。
最初の解決策は、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.newaxis
および np.linalg.lstsq()
関数を使用して、重み W
とともに線形行列方程式 AX = B
の解を計算しました。この方法は問題なく機能しますが、理解しやすく、読みやすくはありません。
2 番目の解決策は、もう少し読みやすく、理解しやすいものです。これには、重みを対角行列に変換してから使用することが含まれます。これは、以下のコーディング例に示されています。
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()
関数を使用して、重み W
とともに線形行列方程式 AX = B
の解を計算しました。
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