4

Pythonで log(det(AAT )+1) の平均値を推定しようとしています。私の単純なコードは、17×17 行列に到達するまで問題なく動作し、その時点で数学エラーが発生します。コードは次のとおりです。

iter = 10000
for n in xrange(1,20):
    h = n
    dets = []
    for _ in xrange(iter):
        A = (np.random.randint(2, size=(h,n)))*2-1
        detA_Atranspose = np.linalg.det(np.dot(A, A.transpose()))
        try:
            logdetA_Atranspose = math.log(detA_Atranspose+1,2)
        except ValueError:
            print "Ooops!", n,detA_Atranspose
        dets.append(logdetA_Atranspose)
    print np.mean(dets)

A は、要素が -1 または 1 の行列であると想定されています。

私は何を間違っていますか?どうすれば修正できますか? 17の特徴は?

4

1 に答える 1

2

タイトルの式 (以前は logdet(AA^T) ) の場合:

det(AA^T) は、いくつかのランダムな As に対して単純に 0 になる可能性があります。log(0) の計算が無効であるため、関数は失敗します。

AA^T は正の半正定行列であるため、理論的には det(AA^T) を負にすることはできないことに注意してください(これは、すべての固有値が非負であり、det >= 0 であることを意味します)。

コード内の式 ( logdet(1+AA^T) )

おそらく使用numpy.linalg.slogdet()して計算する必要がありますslogdet(1+A.dot(A.T))

そのドキュメントから:

「配列の行列式の符号と (自然) 対数を計算します。

配列の行列式が非常に小さいか非常に大きい場合、det の呼び出しはオーバーフローまたはアンダーフローする可能性があります。このルーチンは、行列式自体ではなく行列式の対数を計算するため、このような問題に対してより堅牢です。」

于 2016-03-06T10:51:04.027 に答える