代码之家  ›  专栏  ›  技术社区  ›  Simd

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

  •  4
  • Simd  · 技术社区  · 10 年前

    我试图估计log(det(AA)的平均值 T )+1) 在Python中。我的简单代码工作得很好,直到我得到1717个矩阵,这时它给了我一个数学错误。下面是代码:

    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 回复  |  直到 10 年前
        1
  •  2
  •   Tomer Levinboim    10 年前

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

    一些随机As的det(AA^T)可以简单地为0。 该函数将失败,因为计算日志(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的调用可能会溢出或下溢。 这个例程对此类问题更为稳健,因为它计算的是行列式的对数,而不是行列式本身。”