8

谁能给我指出一个库/代码,允许我在 python(numpy)中对 Cholesky 分解执行低等级更新?Matlab 将此功能作为一个名为“cholupdate”的函数提供。LINPACK 也具有此功能,但它(据我所知)尚未移植到 LAPACK,因此在 scipy 中不可用。

我发现 scikits.sparse 提供了一个基于 CHOLMOD 的类似函数,但我的矩阵很密集。

是否有任何代码可用于具有与 numpy 兼容的“cholupdate”功能的 python?

谢谢!

4

3 回答 3

5

这是一个 Python 包,它使用 Cython 对 Cholesky 因子的更新和降级排名第一: https ://github.com/jcrudy/choldate

例子:

from choldate import cholupdate, choldowndate
import numpy

#Create a random positive definite matrix, V
numpy.random.seed(1)
X = numpy.random.normal(size=(100,10))
V = numpy.dot(X.transpose(),X)

#Calculate the upper Cholesky factor, R
R = numpy.linalg.cholesky(V).transpose()

#Create a random update vector, u
u = numpy.random.normal(size=R.shape[0])

#Calculate the updated positive definite matrix, V1, and its Cholesky factor, R1
V1 = V + numpy.outer(u,u)
R1 = numpy.linalg.cholesky(V1).transpose()

#The following is equivalent to the above
R1_ = R.copy()
cholupdate(R1_,u.copy())
assert(numpy.all((R1 - R1_)**2 < 1e-16))

#And downdating is the inverse of updating
R_ = R1.copy()
choldowndate(R_,u.copy())
assert(numpy.all((R - R_)**2 < 1e-16))
于 2013-02-17T21:48:17.867 回答
3

这应该在 numpy 数组 R 和 x 上执行 rank-1 更新或降级,符号“+”或“-”对应于更新或降级。(从维基百科页面上的 MATLAB cholupdate 移植:http ://en.wikipedia.org/wiki/Cholesky_decomposition ):

def cholupdate(R,x,sign):
    import numpy as np
      p = np.size(x)
      x = x.T
      for k in range(p):
        if sign == '+':
          r = np.sqrt(R[k,k]**2 + x[k]**2)
        elif sign == '-':
          r = np.sqrt(R[k,k]**2 - x[k]**2)
        c = r/R[k,k]
        s = x[k]/R[k,k]
        R[k,k] = r
        if sign == '+':
          R[k,k+1:p] = (R[k,k+1:p] + s*x[k+1:p])/c
        elif sign == '-':
          R[k,k+1:p] = (R[k,k+1:p] - s*x[k+1:p])/c
        x[k+1:p]= c*x[k+1:p] - s*R[k, k+1:p]
      return R
于 2013-04-23T04:22:18.353 回答
1

这家伙正在使用 scikits 和 numpy/scipy 做类似的事情。

于 2012-01-03T18:12:13.543 回答