43

scipyを使用して行列の数学的ランクを計算したいと思います。最も明白な関数numpy.rankは、配列の次元を計算します(つまり、スカラーの次元は0、ベクトル1、行列2などです)。モジュールにこの機能があることは知っていnumpy.linalg.lstsqますが、そのような基本的な操作がどこかのマトリックスクラスに組み込まれているのではないかと思いました。

明示的な例を次に示します。

from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)

これは2、私がの答えを探している次元を与え3ます。

4

7 に答える 7

62

Numpyは以下を提供しますnumpy.linalg.matrix_rank()

>>> import numpy
>>> numpy.__version__
'1.5.1'
>>> A = numpy.matrix([[1,3,7],[2,8,3],[7,8,1]])
>>> numpy.linalg.matrix_rank(A)
3
于 2011-08-01T15:32:57.597 に答える
15

これを実際に行う必要がある人に大まかなコードスニペットを提供するため。気軽に改善してください。

u, s, v = np.linalg.svd(A)
rank = np.sum(s > 1e-10)
于 2010-07-28T18:24:14.433 に答える
7

ランク機能がない場合numpyは、自分で書いてみませんか?

ランクを計算する効率的な方法は、特異値分解を使用することです。行列のランクは、ゼロ以外の特異値の数に等しくなります。

def rank(A, eps=1e-12):
    u, s, vh = numpy.linalg.svd(A)
    return len([x for x in s if abs(x) > eps])

アプリケーションによって異なることに注意しepsてください。ほとんどの場合、1e-12はゼロに対応することに同意しますが、eps=1e-9の場合でも数値が不安定になる可能性があります。

あなたの例を使用すると、答えは3つです。2番目の行を[2, 6, 14](行1に線形従属)に変更すると、答えは2になります(「ゼロ」の固有値は4.9960E-16です)

于 2010-07-28T18:36:57.750 に答える
3

この答えは時代遅れです。

答えはノーです。現在、scipyの配列/マトリックスのマトリックスランクを計算するための専用の関数はありません。追加することは以前に議論されましたが、それが起こるとしたら、私はまだそれが行われていないと思います。

于 2010-03-19T00:21:28.833 に答える
1

特にNumpyについてはわかりませんが、それがマトリックスに組み込まれている操作である可能性は低いです。これには、かなり集中的な数値計算(および浮動小数点の丸め誤差などに関する関連する懸念)と、特定のコンテキストで適切な場合と適切でない場合があるしきい値の選択が含まれます。アルゴリズムの選択は、正確かつ迅速に計算するために重要です。

基本クラスに組み込まれているものは、最も複雑な行列の乗算など、独自の簡単な方法で実行できるものである傾向があります。

于 2010-03-18T23:22:58.197 に答える
1

線形代数関数は一般ににグループ化されnumpy.linalgます。(これらはscipy.linalg、より多くの機能を備えたからも利用できます。)これにより、ポリモーフィズムが可能になります。関数は、SciPyが処理する任意のタイプを受け入れることができます。

したがって、はい、関数numpy.linalg.lstsqあなたが求めていることを実行します。なぜそれが不十分なのですか?

于 2010-03-18T23:25:41.327 に答える
1

scipyランダムな方法を使用して行列/LinearOperatorのランクを推定するための効率的な補間方法が含まれるようになりました。これは、多くの場合、十分に正確である可能性があります。

>>> from numpy import matrix
>>> A = matrix([[1,3,7],[2,8,3],[7,8,1]], dtype=float)  # doesn't accept int

>>> import scipy.linalg.interpolative as sli
>>> sli.estimate_rank(A, eps=1e-10)
3
于 2018-02-19T14:01:58.517 に答える