NumPy の最小二乗

Muhammad Maisam Abbas 2022年1月23日
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 の解を計算しました。

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