4

我正在尝试估计 Python 中 log(det(AA T )+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) ):

一些随机 As 的 det(AA^T) 可以简单地为 0。然后该函数将失败,因为计算 log(0) 无效。

请注意,理论上 det(AA^T) 不能为负,因为 AA^T 是半正定矩阵(这意味着所有特征值都是非负的,并且意味着 det >= 0)。

对于代码中的公式( logdet(1+AA^T) )

您可能应该使用numpy.linalg.slogdet()和计算slogdet(1+A.dot(A.T))

从其文档中

“计算数组行列式的符号和(自然)对数。

如果数组具有非常小或非常大的行列式,则对 det 的调用可能会上溢或下溢。该例程对此类问题更加稳健,因为它计算的是行列式的对数,而不是行列式本身。”

于 2016-03-06T10:51:04.027 回答