Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで行列のムーア・ペンローズ疑似逆行列を計算する方法(numpy.linalg.pinv)

Pythonで行列のムーア・ペンローズ(Moore-Penrose)疑似逆行列を計算するには、NumPyの numpy.linalg.pinv() メソッドを使用します。このメソッドは、特異値分解(SVD)を利用して行列の一般化逆行列を求め、大きな特異値をすべて考慮した計算を行います。

numpy.linalg.pinv() の主なパラメータ

  • 第1引数 a:疑似逆行列を求めたい行列、または行列のスタック(複数の行列をまとめた配列)を指定します。
  • 第2引数 rcond:小さな特異値に対するカットオフ値です。最大特異値 × rcond 以下の特異値はゼロとして扱われます。行列のスタックに対してはブロードキャストが適用されます。
  • 第3引数 hermitian:True を指定すると、入力行列 a がエルミート行列であると仮定され、より効率的な手法で特異値を計算できます。デフォルトは False です。

計算手順

1. 必要なライブラリをインポートする

まず、NumPyをインポートします。

import numpy as np

2. ランダムな値で配列を作成する

randn() 関数を使って、9行6列のランダムな値を持つ配列を作成します。

arr = np.random.randn(9, 6)

3. 配列の内容を表示する

print("Our Array...\n",arr)

4. 配列の次元を確認する

print("\nDimensions of our Array...\n",arr.ndim)

5. データ型を確認する

print("\nDatatype of our Array object...\n",arr.dtype)

6. 配列の形状を確認する

print("\nShape of our Array object...\n",arr.shape)

7. 疑似逆行列を計算する

numpy.linalg.pinv() メソッドを使って、ムーア・ペンローズ疑似逆行列を計算します。

print("\nResult...\n",np.linalg.pinv(arr))

完全なサンプルコード

import numpy as np

# randn()を使ってランダムな値で配列を作成
arr = np.random.randn(9, 6)

# 配列を表示
print("Our Array...\n",arr)

# 次元を確認
print("\nDimensions of our Array...\n",arr.ndim)

# データ型を確認
print("\nDatatype of our Array object...\n",arr.dtype)

# 形状を確認
print("\nShape of our Array object...\n",arr.shape)

# numpy.linalg.pinv()でムーア・ペンローズ疑似逆行列を計算
print("\nResult...\n",np.linalg.pinv(arr))

実行結果

Our Array...
[[ 2.14644893 -0.14757929 0.14252834 0.54433625 -0.21374741 0.08804508]
[-0.05644831 -0.75323572 -1.95304923 0.17167461 -0.64155798 -1.38576017]
[-1.40043868 -0.62073383 -0.13501655 0.79788858 -1.47284176 1.03076414]
[ 0.52384943 -0.51581571 -0.35674166 1.32374059 -0.31340491 0.26292693]
[-0.28434997 0.07384262 1.62577397 -0.54059147 -1.02090985 2.36613533]
[-0.22025823 -1.07203572 1.30598633 0.39122889 2.05180917 1.59262088]
[-2.53455261 0.79274529 0.1822599 1.11345144 0.54343454 0.27523291]
[-1.11915817 1.21435385 0.87345865 0.85541497 1.90349169 -0.05778244]
[ 0.99636776 0.83682256 -0.03753307 -0.11389184 1.14089214 0.11317533]]

Dimensions of our Array...
2

Datatype of our Array object...
float64

Shape of our Array object...
(9, 6)

Result...
[[ 0.19229685 -0.03266066 -0.05913054 0.0990068 0.01377734 -0.02829296
-0.11340774 -0.02715551 0.13106032]
[ 0.01242764 -0.03612164 -0.0019295 0.00090135 0.15372234 -0.31686534
0.16305901 0.09059529 0.45836714]
[ 0.23344397 -0.46295399 -0.17382325 -0.0801975 -0.10227208 -0.04366331
-0.14434698 0.2615106 -0.84357154]
[ 0.28299012 -0.06772757 0.11355691 0.31272279 -0.11283442 -0.0361218
0.12165585 0.17999476 -0.14682526]
[-0.11148768 0.11063486 -0.07823299 -0.03096356 -0.07104466 0.24122668
0.02395283 0.01890529 0.26797921]
[-0.13235983 0.21188986 0.20340676 0.09081754 0.31058622 0.13372814
0.11417357 -0.20740154 0.71096452]]

まとめ

この例では、9×6 の正方行列ではない長方形行列に対して疑似逆行列を計算しました。その結果、6×9 の行列が得られています。疑似逆行列は、通常の逆行列が存在しない正方行列や長方形行列に対して最小二乗解などを求める際に役立つ強力なツールです。rcond パラメータを調整することで、数値的な安定性を制御できる点も覚えておくとよいでしょう。

  1. Pythonで行列の転置を求める方法をわかりやすく解説

    本記事では、Pythonを使って行列の転置(transpose)を求める方法について、2つのアプローチを交えながら詳しく解説します。 問題の概要 問題設定: 与えられた行列に対して、その転置行列を求めて表示します。 行列の転置とは、行列Aの要素 A[i][j] を A[j][i] と入れ替えることで得られる行列のことです。つまり、行と列を入れ替えた新しい行列が転置行列となります。 それでは、実際のコード実装を見ながら概念を確認していきましょう。 方法1:新しい行列を作成して転置を格納する 1つ目の方法は、入力行列とは別に新しい行列を用意し、そこに転置結果を格納するアプローチです。元の行列を保持

  2. Pythonで行列の転置を求めるプログラム

    この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ