numpy Cholesky with floats 128(Python)

bgibtngc  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(81)

我尝试使用浮动128来提高非常“粗糙”的模拟的准确性。然而,我在NumPy的Cholesky分解中遇到了一个瓶颈,它接受的浮点数不超过64。

**问题:**1)有没有办法用np.float128做Cholesky?(我可以使用另一个图书馆。

请参阅下面的一些代码来重现问题:

import numpy as np

def get_fractional_std_matrix(t: np.ndarray, H: float):
    s = t[np.newaxis, 1:]
    u = t[1:, np.newaxis]
    H2 = 2 * H
    cov_matrix = ((s ** H2) + (u ** H2) - (np.abs(s - u) ** H2)) / 2

    N = len(t)
    std_matrix = np.zeros(shape=(N, N), dtype=t.dtype)
    std_matrix[1:, 1:] = np.linalg.cholesky(cov_matrix.astype(t.dtype))
    return std_matrix

H = 0.1
t = np.linspace(start=0, stop=1, num=100).astype(np.longdouble)
get_fractional_std_matrix(t=t, H=H)  # TypeError: array type float128 is unsupported in linalg

有趣的是,在Repliky中添加.astype(dtype)给了我几乎相同的错误,在64位的机器上:

# TypeError: array type float64 is unsupported in linalg
lo8azlld

lo8azlld1#

所以我是“手工”完成的,它似乎可以很好地处理包括np.float128在内的非复杂类型。

def cholesky(matrix):
    decomposition = np.zeros_like(matrix)
    for i in range(len(matrix)):
        temp_sum = matrix[i:, i] - np.einsum("jk, k -> j", decomposition[i:, :i], decomposition[i, :i])
        decomposition[i, i] = np.sqrt(temp_sum[0])
        decomposition[i+1:, i] = temp_sum[1:] / decomposition[i, i]
    return decomposition

相关问题