Distributions.jl不接受my(非正定)协方差函数(而numpy接受)

Distributions.jl不接受my(非正定)协方差函数(而numpy接受),numpy,julia,linear-algebra,normal-distribution,Numpy,Julia,Linear Algebra,Normal Distribution,我正试图在下面实现高斯过程(GPs) numpy实现的工作方式很有魅力: 将numpy导入为np def内核(X1,X2,l=1.0,sigma_f=1.0): ''各向同性平方指数核。从X1和X2中的点计算协方差矩阵。Args:X1:m个点的数组(m x d)。X2:n个点的数组(n x d)。返回:协方差矩阵(m x n)。'' sqdist=np.sum(X1**2,1)。重塑(-1,1)+np.sum(X2**2,1)-2*np.dot(X1,X2.T) 返回西格玛函数**2*np.ex

我正试图在下面实现高斯过程(GPs)

numpy实现的工作方式很有魅力:

将numpy导入为np
def内核(X1,X2,l=1.0,sigma_f=1.0):
''各向同性平方指数核。从X1和X2中的点计算协方差矩阵。Args:X1:m个点的数组(m x d)。X2:n个点的数组(n x d)。返回:协方差矩阵(m x n)。''
sqdist=np.sum(X1**2,1)。重塑(-1,1)+np.sum(X2**2,1)-2*np.dot(X1,X2.T)
返回西格玛函数**2*np.exp(-0.5/l**2*sqdist)
X=np.arange(-1,1,0.1)。重塑(-1,1)
mu=np.零(X.形)
cov=内核(X,X)
样本=np.随机.多元正态(mu.ravel(),cov,3)
而我在使用Distributions.jl创建多元正态分布时有一个错误

以下是我尝试过的:

using LinearAlgebra
using Distributions

function kernel(x₁, x₂; l=1.0, σ=1.0)
    t₁ = sum(x₁.^2, dims=2)
    t₂ = sum(x₂.^2, dims=2)
    t₃ = 2*x₁*x₂'
    t = (t₁ .+ t₂') - t₃
    return σ^2 * exp.(-0.5/l^2 * t)
end

x = -1:0.1:0.9
μ = zeros(length(x))
σ = kernel(x, x)
D = MvNormal(μ, σ)

问题似乎是我的协方差不是正(半)定的

朱莉娅:

σ
20×20 Array{Float64,2}:
 1.0       0.995012  0.980199  0.955997  …  0.235746  0.197899  0.164474
 0.995012  1.0       0.995012  0.980199     0.278037  0.235746  0.197899
 0.980199  0.995012  1.0       0.995012     0.324652  0.278037  0.235746
 0.955997  0.980199  0.995012  1.0          0.375311  0.324652  0.278037
 0.923116  0.955997  0.980199  0.995012     0.429557  0.375311  0.324652
 0.882497  0.923116  0.955997  0.980199  …  0.486752  0.429557  0.375311
 0.83527   0.882497  0.923116  0.955997     0.546074  0.486752  0.429557
 0.782705  0.83527   0.882497  0.923116     0.606531  0.546074  0.486752
 0.726149  0.782705  0.83527   0.882497     0.666977  0.606531  0.546074
 0.666977  0.726149  0.782705  0.83527      0.726149  0.666977  0.606531
 0.606531  0.666977  0.726149  0.782705  …  0.782705  0.726149  0.666977
 0.546074  0.606531  0.666977  0.726149     0.83527   0.782705  0.726149
 0.486752  0.546074  0.606531  0.666977     0.882497  0.83527   0.782705
 0.429557  0.486752  0.546074  0.606531     0.923116  0.882497  0.83527 
 0.375311  0.429557  0.486752  0.546074     0.955997  0.923116  0.882497
 0.324652  0.375311  0.429557  0.486752  …  0.980199  0.955997  0.923116
 0.278037  0.324652  0.375311  0.429557     0.995012  0.980199  0.955997
 0.235746  0.278037  0.324652  0.375311     1.0       0.995012  0.980199
 0.197899  0.235746  0.278037  0.324652     0.995012  1.0       0.995012
 0.164474  0.197899  0.235746  0.278037     0.980199  0.995012  1.0 
python:

>>cov
阵列([[1,0.99501248,0.98019867,0.95599748,0.92311635,
0.8824969 , 0.83527021, 0.78270454, 0.72614904, 0.66697681,
0.60653066, 0.54607443, 0.48675226, 0.42955736, 0.3753111 ,
0.32465247, 0.2780373 , 0.23574608, 0.1978987 , 0.16447446],
[0.99501248, 1.        , 0.99501248, 0.98019867, 0.95599748,
0.92311635, 0.8824969 , 0.83527021, 0.78270454, 0.72614904,
0.66697681, 0.60653066, 0.54607443, 0.48675226, 0.42955736,
0.3753111 , 0.32465247, 0.2780373 , 0.23574608, 0.1978987 ],
[0.98019867, 0.99501248, 1.        , 0.99501248, 0.98019867,
0.95599748, 0.92311635, 0.8824969 , 0.83527021, 0.78270454,
0.72614904, 0.66697681, 0.60653066, 0.54607443, 0.48675226,
0.42955736, 0.3753111 , 0.32465247, 0.2780373 , 0.23574608],
[0.95599748, 0.98019867, 0.99501248, 1.        , 0.99501248,
0.98019867, 0.95599748, 0.92311635, 0.8824969 , 0.83527021,
0.78270454, 0.72614904, 0.66697681, 0.60653066, 0.54607443,
0.48675226, 0.42955736, 0.3753111 , 0.32465247, 0.2780373 ],
[0.92311635, 0.95599748, 0.98019867, 0.99501248, 1.        ,
0.99501248, 0.98019867, 0.95599748, 0.92311635, 0.8824969 ,
0.83527021, 0.78270454, 0.72614904, 0.66697681, 0.60653066,
0.54607443, 0.48675226, 0.42955736, 0.3753111 , 0.32465247],
[0.8824969 , 0.92311635, 0.95599748, 0.98019867, 0.99501248,
1.        , 0.99501248, 0.98019867, 0.95599748, 0.92311635,
0.8824969 , 0.83527021, 0.78270454, 0.72614904, 0.66697681,
0.60653066, 0.54607443, 0.48675226, 0.42955736, 0.3753111 ],
[0.83527021, 0.8824969 , 0.92311635, 0.95599748, 0.98019867,
0.99501248, 1.        , 0.99501248, 0.98019867, 0.95599748,
0.92311635, 0.8824969 , 0.83527021, 0.78270454, 0.72614904,
0.66697681, 0.60653066, 0.54607443, 0.48675226, 0.42955736],
[0.78270454, 0.83527021, 0.8824969 , 0.92311635, 0.95599748,
0.98019867, 0.99501248, 1.        , 0.99501248, 0.98019867,
0.95599748, 0.92311635, 0.8824969 , 0.83527021, 0.78270454,
0.72614904, 0.66697681, 0.60653066, 0.54607443, 0.48675226],
[0.72614904, 0.78270454, 0.83527021, 0.8824969 , 0.92311635,
0.95599748, 0.98019867, 0.99501248, 1.        , 0.99501248,
0.98019867, 0.95599748, 0.92311635, 0.8824969 , 0.83527021,
0.78270454, 0.72614904, 0.66697681, 0.60653066, 0.54607443],
[0.66697681, 0.72614904, 0.78270454, 0.83527021, 0.8824969 ,
0.92311635, 0.95599748, 0.98019867, 0.99501248, 1.        ,
0.99501248, 0.98019867, 0.95599748, 0.92311635, 0.8824969 ,
0.83527021, 0.78270454, 0.72614904, 0.66697681, 0.60653066],
[0.60653066, 0.66697681, 0.72614904, 0.78270454, 0.83527021,
0.8824969 , 0.92311635, 0.95599748, 0.98019867, 0.99501248,
1.        , 0.99501248, 0.98019867, 0.95599748, 0.92311635,
0.8824969 , 0.83527021, 0.78270454, 0.72614904, 0.66697681],
[0.54607443, 0.60653066, 0.66697681, 0.72614904, 0.78270454,
0.83527021, 0.8824969 , 0.92311635, 0.95599748, 0.98019867,
0.99501248, 1.        , 0.99501248, 0.98019867, 0.95599748,
0.92311635, 0.8824969 , 0.83527021, 0.78270454, 0.72614904],
[0.48675226, 0.54607443, 0.60653066, 0.66697681, 0.72614904,
0.78270454, 0.83527021, 0.8824969 , 0.92311635, 0.95599748,
0.98019867, 0.99501248, 1.        , 0.99501248, 0.98019867,
0.95599748, 0.92311635, 0.8824969 , 0.83527021, 0.78270454],
[0.42955736, 0.48675226, 0.54607443, 0.60653066, 0.66697681,
0.72614904, 0.78270454, 0.83527021, 0.8824969 , 0.92311635,
0.95599748, 0.98019867, 0.99501248, 1.        , 0.99501248,
0.98019867, 0.95599748, 0.92311635, 0.8824969 , 0.83527021],
[0.3753111 , 0.42955736, 0.48675226, 0.54607443, 0.60653066,
0.66697681, 0.72614904, 0.78270454, 0.83527021, 0.8824969 ,
0.92311635, 0.95599748, 0.98019867, 0.99501248, 1.        ,
0.99501248, 0.98019867, 0.95599748, 0.92311635, 0.8824969 ],
[0.32465247, 0.3753111 , 0.42955736, 0.48675226, 0.54607443,
0.60653066, 0.66697681, 0.72614904, 0.78270454, 0.83527021,
0.8824969 , 0.92311635, 0.95599748, 0.98019867, 0.99501248,
1.        , 0.99501248, 0.98019867, 0.95599748, 0.92311635],
[0.2780373 , 0.32465247, 0.3753111 , 0.42955736, 0.48675226,
0.54607443, 0.60653066, 0.66697681, 0.72614904, 0.78270454,
0.83527021, 0.8824969 , 0.92311635, 0.95599748, 0.98019867,
0.99501248, 1.        , 0.99501248, 0.98019867, 0.95599748],
[0.23574608, 0.2780373 , 0.32465247, 0.3753111 , 0.42955736,
0.48675226, 0.54607443, 0.60653066, 0.66697681, 0.72614904,
0.78270454, 0.83527021, 0.8824969 , 0.92311635, 0.95599748,
0.98019867, 0.99501248, 1.        , 0.99501248, 0.98019867],
[0.1978987 , 0.23574608, 0.2780373 , 0.32465247, 0
PosDefException: matrix is not Hermitian; Cholesky factorization failed.
PosDefException: matrix is not positive definite; Cholesky factorization failed.
σ = σ + maximum([0.0, -minimum(eigvals(σ))])*I
D = MvNormal(μ, σ)
σ = Symmetric(σ)
D = MvNormal(σ.data)
D = MvNormal(Matrix(Hermitian(σ)))
σ = σ + 0.00000000001*I
D = MvNormal(σ)