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

Pythonの特異値分解(SVD)で行列のランクを求める方法|ランク不足行列の判定例

Pythonで配列の行列ランクを特異値分解(SVD)の手法により求めるには、numpy.linalg.matrix_rank()メソッドを使用します。配列のランクとは、許容誤差(tol)よりも大きい特異値の個数として定義されます。

第1引数のAには、入力となるベクトルまたは行列のスタックを渡します。

第2引数のtolは、SVDの値がゼロとみなされる閾値です。tolをNone(省略)にした場合、SをMの特異値を持つ配列、epsをSのデータ型におけるイプシロン値とすると、tolは「S.max() * max(M, N) * eps」に自動的に設定されます。

第3引数のhermitianをTrueにすると、Aはエルミート行列であると仮定され、特異値をより効率的な方法で計算できるようになります。デフォルト値はFalseです。

実装の手順

ステップ1:必要なライブラリをインポートする

import numpy as np
from numpy.linalg import matrix_rank

ステップ2:配列を作成する

ここでは np.eye(5) を使って5×5の単位行列を作成します。

arr = np.eye(5)

ステップ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:matrix_rank()でランクを求める

numpy.linalg.matrix_rank()メソッドを使って、特異値分解に基づく行列ランクを取得します。さらに、対角成分の1つを0に変更してランク不足行列(ランク落ちした行列)にした場合のランクの変化も確認します。

print("\nRank...\n",matrix_rank(arr))
arr[-1,-1] = 0.
print("\nUpdated Rank (Rank-Deficit Matrix)...\n",matrix_rank(arr))

コード例全体

import numpy as np
from numpy.linalg import matrix_rank

# 配列を作成
arr = np.eye(5)

# 配列を表示
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)

# 特異値分解(SVD)の手法で行列ランクを求める
print("\nRank...\n",matrix_rank(arr))
arr[-1,-1] = 0.
print("\nUpdated Rank (Rank-Deficit Matrix)...\n",matrix_rank(arr))

実行結果

Our Array...
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]

Dimensions of our Array...
2

Datatype of our Array object...
float64

Shape of our Array object...
(5, 5)

Rank...
5

Updated Rank (Rank-Deficit Matrix)...
4

まとめ

numpy.linalg.matrix_rank()を使えば、特異値分解に基づいて行列のランクを簡単に求められます。5×5の単位行列はランク5ですが、対角要素を1つ0に変更すると線形独立な行・列が減少し、ランク4のランク不足行列になります。数値計算や機械学習の前処理などで行列のランクを判定したい場面で、ぜひ活用してみてください。

  1. Pythonのmap()関数を使って2次元配列(2D配列)の合計を求める方法

    このチュートリアルでは、Pythonのmap()関数を使って、2次元配列(リストのリスト)の合計を求める方法を解説します。 map()関数は、関数とイテラブル(反復可能オブジェクト)の2つの引数を受け取ります。イテラブルの各要素が関数に渡され、その結果はmapオブジェクトとして格納されます。mapオブジェクトはlist()などでイテラブルに変換できます。 処理の手順 リストを使って2次元配列を初期化します。 sum関数と2次元配列をmap()関数に渡します。 結果として得られるmapオブジェクトの合計を求めて出力します。 コード例 以下のコードを見てみましょう。 # 2次元配列の初期化 a

  2. Pythonの数学関数一覧|abs・ceil・sqrtなどの使い方と戻り値を徹底解説

    Pythonの数学関数とは Pythonには、絶対値・切り上げ・切り下げ・対数・平方根などの数値計算を行うための関数が標準で用意されています。その多くはmathモジュールに含まれており、import mathと記述することで利用できます。一方、abs()、max()、min()、round()は組み込み関数として提供されているため、インポートせずにすぐ使えるのが特徴です。 以下に、代表的な数学関数とその戻り値を一覧形式でまとめました。 No.関数説明(戻り値) 1abs(x)xの絶対値。xと0の間の(正の)距離を返します。 2ceil(x)xの切り上げ値。x以上となる最小の整数を返し