Julia 在《朱莉娅》中将上三角变换为Cholesky

Julia 在《朱莉娅》中将上三角变换为Cholesky,julia,Julia,有了数据集X,我尝试执行Cholesky分解,然后执行Cholesky更新。我的设置如下: data = readtable("PCA_transformed_data_gt1000.csv",header= true) data = delete!(data, :1) n,d = size(data) s = 6.6172 S0 = s*eye(d) kappa_0 = 0.001 nu_0 = d mu_0 = zeros(d) S0 = LinAlg.chol(S0+kappa_0*do

有了数据集X,我尝试执行Cholesky分解,然后执行Cholesky更新。我的设置如下:

data = readtable("PCA_transformed_data_gt1000.csv",header= true)
data = delete!(data, :1)
n,d = size(data)

s = 6.6172
S0 = s*eye(d)
kappa_0 = 0.001
nu_0 = d
mu_0 = zeros(d)
S0 = LinAlg.chol(S0+kappa_0*dot(mu_0,mu_0'))
S0的类型为

julia> typeof(S0)
UpperTriangular{Float64,Array{Float64,2}}
我正在尝试执行Cholesky更新作为

U = sqrt((1+1/kappa_0)) * LinAlg.lowrankdowndate!(S0, sqrt(kappa_0)*mu_0)
并得到以下错误

ERROR: MethodError: no method matching lowrankdowndate!(::UpperTriangular{Float64,Array{Float64,2}}, ::Array{Float64,1})
Closest candidates are:
  lowrankdowndate!(::Base.LinAlg.Cholesky{T,S<:AbstractArray{T,2}}, ::Union{Base.ReshapedArray{T,1,A<:DenseArray,MI<:Tuple{Vararg{Base.MultiplicativeInverses.SignedMultiplicativeInverse{Int64},N}}},DenseArray{T,1},SubArray{T,1,A<:Union{Base.ReshapedArray{T,N,A<:DenseArray,MI<:Tuple{Vararg{Base.MultiplicativeInverses.SignedMultiplicativeInverse{Int64},N}}},DenseArray},I<:Tuple{Vararg{Union{Base.AbstractCartesianIndex,Colon,Int64,Range{Int64}},N}},L}}) at linalg/cholesky.jl:502
但我得到了以下信息

ERROR: MethodError: First argument to `convert` must be a Type, got [2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.57239]

你知道如何执行这项任务吗?

实际上有两种Cholesky分解方法,似乎你需要另一种方法,它返回一个Cholesky变量。另一种方法是
cholfact
。通过使用
:U
索引,可以从Cholesky变量中提取上三角因子,如下所示:

C = LinAlg.cholfact(M)
U = C[:U]  # <--- this is upper triangular
更改是针对
产品(转置是不必要的,在0.6中会导致问题),并对
lowrankdowndate的结果进行索引[:U]
编码>得到上三角矩阵。此外,
S1
用于
cholfact
的结果,而不是覆盖
S0
以提高类型稳定性


希望这能有所帮助。

这很有帮助!解决了这个问题,谢谢!另一个问题是,如果我尝试做与
U=LinAlg.lowrankdowndate类似的事情!(S1,x)[:U]
我得到以下错误
错误:lowrankdowndate中的Base.LinAlg.PosDefException(1)!(::Base.LinAlg.Cholesky{Float64,Array{Float64,2},::Array{Float64,1})位于./LinAlg/Cholesky.jl:519
@LeonidasSouliotis
S1
出于某种原因可能不是半正定的。通常是数值不准确,有些0特征值变得稍微负。解决方案是为一些小λ添加
λ*眼(S1)
C = LinAlg.cholfact(M)
U = C[:U]  # <--- this is upper triangular
data = readtable("PCA_transformed_data_gt1000.csv",header= true)
data = delete!(data, :1)
n,d = size(data)
s = 6.6172
S0 = s*eye(d)
kappa_0 = 0.001
nu_0 = d
mu_0 = zeros(d)
S1 = LinAlg.cholfact(S0+kappa_0*dot(mu_0,mu_0))

U = sqrt((1+1/kappa_0)) * LinAlg.lowrankdowndate!(S1, sqrt(kappa_0)*mu_0)[:U]