Sorry for the “normal” normal . What I mean is that I need a Gaussian distribution with a slight change. I need to include a factor \xi, such as the density distribution below
I don’t need the best performance, just a simple example.
Sorry for the “normal” normal . What I mean is that I need a Gaussian distribution with a slight change. I need to include a factor \xi, such as the density distribution below
I don’t need the best performance, just a simple example.
You can define your own distribution w Distributions.jl.
For example here is how to define a slew-normal: Skew normal distribution? - #9 by Albert_Zevelev
The expression you posted looks like an ordinary three-dimensional (i.e. multivariate) normal distribution with zero mean and a diagonal (but not isotropic) covariance matrix.
This is easy with the Distributions package - see here.
using Distributions
rf = 1.2
xi = 0.3
sig = rf^2*[1/xi, 1/xi, xi^2] # diagonal of covariance matrix
d = MvNormal(sig) # get distribution object
rand(d,4) # draw samples
r = [2,3,4]
pdf(d,r) # evaluate probability density function (pdf)
student’s T is almost normal.
Heck by CLT sum(x)
if elements of x
are all drawn from iid distribution then it is almost normal.
With this diagonal of covariance matrix you got something new to my life.
At link of the documentation you’ve send, it says :
vector of type
Vector{T}
: indicating a diagonal covariance asdiagm(abs2(sig))
Maybe I’m overthinking, but if the MvNormal
function applies a abs2
, the input should be the square root. That is, sig = rf*[1/sqrt(xi), 1/sqrt(xi), xi]
. Or am I just confused ?
AFAICT, this looks like a mistake in the documentation. In the source code, sig
is taken as the covariance matrix \varSigma, or an abbreviated form thereof.
The parameter would probably better be named Sig
, to avoid confusion with the standard deviation \sigma. The two are related by \varSigma = \sigma^2 \boldsymbol{I} for an isotropic covariance matrix.
EDIT: This is wrong.
After some reading I believe that you’re talking about this line:
# constructor without mean vector
MvNormal(Σ::AbstractVecOrMat{<:Real}) = MvNormal(Zeros{eltype(Σ)}(size(Σ, 1)), Σ)
Indeed, the input should be the covariance matrix diagonal as you wrote before.
Actually, I was wrong in my previous post (I crossed it out). The meaning of sig
in MvNormal(sig)
depends on the type of sig
.
sig
is a scalar, it’s taken as the isotropic standard deviation \sigma.julia> using Distributions, LinearAlgebra
julia> mu = [1.,2.,3.]; sig = 2.; MvNormal(mu,sig)
IsoNormal(
dim: 3
μ: [1.0, 2.0, 3.0]
Σ: [4.0 0.0 0.0; 0.0 4.0 0.0; 0.0 0.0 4.0]
)
sig
is a 3-element vector, it’s the vector of standard deviations (\sigma_x,\sigma_y,\sigma_z)julia> mu = [1.,2.,3.]; sig = [2.,3.,4.]; MvNormal(mu,sig)
DiagNormal(
dim: 3
μ: [1.0, 2.0, 3.0]
Σ: [4.0 0.0 0.0; 0.0 9.0 0.0; 0.0 0.0 16.0]
)
sig
is a 3-by-3 matrix, it’s taken as the covariance matrix \varSigma (with the squares of the standard deviations on the diagonal).julia> mu = [1.,2.,3.]; sig = diagm([2.,3.,4.]); MvNormal(mu,sig)
FullNormal(
dim: 3
μ: [1.0, 2.0, 3.0]
Σ: [2.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 4.0]
)
One needs to be careful here, since for a vector sig
, MvNormal(sig)
and MvNormal(diagm(sig))
give different distributions. Not sure whether this subtle difference is by design or not.