python中的数学错误计算日志(det(AA ^ T)+1)

时间:2016-03-06 10:12:31

标签: python math determinants

我试图在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有什么特别之处?

1 个答案:

答案 0 :(得分:2)

对于标题中的公式(以前的logdet(AA ^ T)):

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

请注意,理论上det(AA ^ T)不能为负,因为AA ^ T是positive semi-definite matrix(这意味着所有特征值都是非负的并暗示det> = 0)。

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

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

来自documentation

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

如果一个数组具有一个非常小或非常大的行列式,那么对det的调用可能会溢出或下溢。这个例程对这些问题更加健壮,因为它计算了行列式的对数而不是而不是决定因素本身。"