Документация Engee

Многомерные распределения

Многомерные распределения — это распределения, которые имеют размерность Multivariate (то есть каждая выборка представляет собой вектор). Абстрактные типы для многомерных распределений:

const MultivariateDistribution{S<:ValueSupport} = Distribution{Multivariate,S}

const DiscreteMultivariateDistribution   = Distribution{Multivariate, Discrete}
const ContinuousMultivariateDistribution = Distribution{Multivariate, Continuous}

Общий интерфейс

Перечисленные ниже методы реализованы для каждого многомерного распределения, что обеспечивает единообразный интерфейс для работы с такими распределениями.

Вычисление статистики

# Base.lengthMethod

length(d::MultivariateDistribution) -> Int

Возвращает выборочное измерение распределения d.

# Base.sizeMethod

size(d::MultivariateDistribution)

Возвращает размер выборки распределения d, т. е. (length(d),).

# Base.eltypeMethod

eltype(::Type{Sampleable})

The default element type of a sample. This is the type of elements of the samples generated by the rand method. However, one can provide an array of different element types to store the samples using rand!.

# Statistics.meanMethod

mean(d::MultivariateDistribution)

Вычисляет вектор средних значений распределения d.

# Statistics.varMethod

var(d::MultivariateDistribution)

Вычисляет вектор поэлементных дисперсий для распределения d.

# Statistics.covMethod

cov(d::MultivariateDistribution)

Вычисляет ковариационную матрицу для распределения d. (cor предоставляется на основе cov).

# Statistics.corMethod

cor(d::MultivariateDistribution)

Вычисляет матрицу корреляции для распределения d.

# StatsBase.entropyMethod

entropy(d::MultivariateDistribution)

Вычисляет значение энтропии распределения d.

# StatsBase.entropyMethod

entropy(d::MultivariateDistribution, b::Real)

Вычисляет значение энтропии распределения относительно заданного основания.

Оценка вероятности

# Distributions.insupportMethod

insupport(d::MultivariateDistribution, x::AbstractArray)

Если  — вектор, возвращается значение, указывающее, находится ли x в пределах носителя . Если  — матрица, возвращается значение, указывающее, находится ли каждый столбец в в пределах носителя .

# StatsAPI.loglikelihoodMethod

loglikelihood(d::Distribution{ArrayLikeVariate{N}}, x) where {N}

The log-likelihood of distribution d with respect to all variate(s) contained in x.

Here, x can be any output of rand(d, dims...) and rand!(d, x). For instance, x can be

  • an array of dimension N with size(x) == size(d),

  • an array of dimension N + 1 with size(x)[1:N] == size(d), or

  • an array of arrays xi of dimension N with size(xi) == size(d).

Примечание. Для многомерных распределений значение функции плотности вероятности обычно очень мало или очень велико, поэтому ее вычисление напрямую может вызвать численные проблемы. Как правило, рекомендуется выполнять вероятностные вычисления в логарифмическом масштабе.

Выборка

# Base.randMethod

rand(::AbstractRNG, ::Sampleable)

Производит выборку из сэмплера и возвращает результат.

# Random.rand!Method

rand!(::AbstractRNG, ::Sampleable, ::AbstractArray)

Выполняет выборку на месте из сэмплера и сохраняет результат в указанном массиве.

Примечание. Помимо этих общих методов, у каждого многомерного распределения есть специальные методы, приведенные ниже.

Распределения

# Distributions.MultinomialType

Мультиномиальное распределение является обобщением биномиального распределения. Возьмем n независимых выборок из категориального распределения на конечном множестве размером k и допустим, что , где представляет количество раз, которое встречается элемент . Тогда распределение является мультиномиальным. Каждая выборка мультиномиального распределения является k-мерным целочисленным вектором, сумма элементов которого равна n.

Вероятностная функция массы имеет следующий вид:

Multinomial(n, p)   # Мультиномиальное распределение для n испытаний с вектором вероятностей p
Multinomial(n, k)   # Мультиномиальное распределение для n испытаний с равными вероятностями
                    # на множестве 1:k

# Distributions.AbstractMvNormalType

Многомерное нормальное распределение является многомерным обобщением нормального распределения. Функция плотности вероятности d-мерного нормального распределения с вектором средних значений и ковариационной матрицей имеет следующий вид:

Известно, что вектор средних значений и ковариация на практике часто имеют особую форму, что можно использовать для упрощения вычислений. Например, вектор средних значений иногда является просто нулевым, в то время как ковариационная матрица может быть диагональной или даже иметь форму . Для таких особых случаев введен параметрический тип MvNormal, определение которого приведено ниже. Он позволяет пользователям указывать особую структуру средних значений и ковариации.

struct MvNormal{T<:Real,Cov<:AbstractPDMat,Mean<:AbstractVector} <: AbstractMvNormal
    μ::Mean
    Σ::Cov
end

Здесь вектор средних значений может быть экземпляром любого AbstractVector. Ковариация может быть представлена любым подтипом типа AbstractPDMat. В частности, можно использовать PDMat для полной ковариации, PDiagMat для диагональной ковариации и ScalMat для изотропной ковариации — в форме . (Подробные сведения см. в документации к пакету Julia PDMats.)

Кроме того, определен набор псевдонимов для типов, использующих различные сочетания векторов средних значений и ковариации:

const IsoNormal  = MvNormal{Float64, ScalMat{Float64},                  Vector{Float64}}
const DiagNormal = MvNormal{Float64, PDiagMat{Float64,Vector{Float64}}, Vector{Float64}}
const FullNormal = MvNormal{Float64, PDMat{Float64,Matrix{Float64}},    Vector{Float64}}

const ZeroMeanIsoNormal{Axes}  = MvNormal{Float64, ScalMat{Float64},                  Zeros{Float64,1,Axes}}
const ZeroMeanDiagNormal{Axes} = MvNormal{Float64, PDiagMat{Float64,Vector{Float64}}, Zeros{Float64,1,Axes}}
const ZeroMeanFullNormal{Axes} = MvNormal{Float64, PDMat{Float64,Matrix{Float64}},    Zeros{Float64,1,Axes}}

Многомерные нормальные распределения поддерживают аффинные преобразования:

d = MvNormal(μ, Σ)
c + B * d    # == MvNormal(B * μ + c, B * Σ * B')
dot(b, d)    # == Normal(dot(b, μ), b' * Σ * b)

# Distributions.MvNormalType

MvNormal

Как правило, пользователям не нужно беспокоиться об этих внутренних механизмах.

Мы предоставляем общий конструктор MvNormal, который создает распределение соответствующего типа в зависимости от входных аргументов.

# Distributions.MvNormalCanonType

MvNormalCanon

Многомерное нормальное распределение относится к экспоненциальному семейству и имеет два канонических параметра: вектор потенциалов и матрицу точности . Эти параметры и стандартное представление (то есть использующее среднее значение и ковариацию ) связаны следующим образом:

Каноническая параметризация широко применяется в байесовском анализе. Мы предоставляем тип MvNormalCanon, который также является подтипом AbstractMvNormal, для представления многомерного нормального распределения посредством канонических параметров. В частности, тип MvNormalCanon определен следующим образом:

struct MvNormalCanon{T<:Real,P<:AbstractPDMat,V<:AbstractVector} <: AbstractMvNormal
    μ::V    # вектор средних значений
    h::V    # вектор потенциалов, то есть inv(Σ) * μ
    J::P    # матрица точности, то есть inv(Σ)
end

Кроме того, определены псевдонимы для общих специализаций этого параметрического типа:

const FullNormalCanon = MvNormalCanon{Float64, PDMat{Float64,Matrix{Float64}},    Vector{Float64}}
const DiagNormalCanon = MvNormalCanon{Float64, PDiagMat{Float64,Vector{Float64}}, Vector{Float64}}
const IsoNormalCanon  = MvNormalCanon{Float64, ScalMat{Float64},                  Vector{Float64}}

const ZeroMeanFullNormalCanon{Axes} = MvNormalCanon{Float64, PDMat{Float64,Matrix{Float64}},    Zeros{Float64,1,Axes}}
const ZeroMeanDiagNormalCanon{Axes} = MvNormalCanon{Float64, PDiagMat{Float64,Vector{Float64}}, Zeros{Float64,1,Axes}}
const ZeroMeanIsoNormalCanon{Axes}  = MvNormalCanon{Float64, ScalMat{Float64},                  Zeros{Float64,1,Axes}}

Примечание. MvNormalCanon имеет тот же набор методов, что и MvNormal.

# Distributions.MvLogitNormalType

MvLogitNormal{<:AbstractMvNormal}

Многомерное логистически нормальное распределение является многомерным обобщением LogitNormal с поддержкой корреляций между величинами.

Если  — это вектор длиной , то

является вектором вероятностей длиной .

MvLogitNormal(μ, Σ)                 # MvLogitNormal с y ~ MvNormal(μ, Σ)
MvLogitNormal(MvNormal(μ, Σ))       # то же, что и выше
MvLogitNormal(MvNormalCanon(μ, J))  # MvLogitNormal с y ~ MvNormalCanon(μ, J)

Поля

  • normal::AbstractMvNormal: содержит -мерное распределение

# Distributions.MvLogNormalType

MvLogNormal(d::MvNormal)

Многомерное логнормальное распределение является многомерным обобщением логнормального распределения.

Если имеет многомерное нормальное распределение, то имеет многомерное логнормальное распределение.

Вектор средних значений и ковариационная матрица базового нормального распределения называются параметрами местоположения и масштаба соответствующего логнормального распределения.

# Distributions.DirichletType

Dirichlet

Распределение Дирихле часто используется в качестве сопряжения перед категориальным или мультиномиальным распределением. Функция плотности вероятности распределения Дирихле с параметром имеет следующий вид:

# Допустим, что alpha — это вектор
Dirichlet(alpha)         # Распределение Дирихле с вектором параметров alpha

# Допустим, что a — это положительное скалярное значение
Dirichlet(k, a)          # Распределение Дирихле с параметром a * ones(k)

# Distributions.ProductType

Product <: MultivariateDistribution

N-мерное распределение MultivariateDistribution, построенное на основе вектора N независимых распределений UnivariateDistribution.

Product(Uniform.(rand(10), 1)) # 10-мерное распределение Product из 10 независимых распределений `Uniform`.

Методы сложения

AbstractMvNormal

Помимо описанных выше методов общего интерфейса, для всех многомерных распределений, относящихся к базовому типу AbstractMvNormal, также доступны следующие методы:

# Distributions.invcovMethod

invcov(d::AbstractMvNormal)

Возвращает обратную ковариационную матрицу d.

# Distributions.logdetcovMethod

logdetcov(d::AbstractMvNormal)

Возвращает значение логарифма определителя ковариационной матрицы.

# Distributions.sqmahalMethod

sqmahal(d, x)

Возвращает возведенное в квадрат расстояние Махаланобиса от x до центра d относительно ковариации. Если x — это вектор, возвращается скалярное значение. Если x — это матрица, возвращается вектор длиной size(x,2).

sqmahal!(r, d, x) записывает результаты в предварительно размещенный в памяти массив r.

# Base.randMethod

rand(::AbstractRNG, ::Distributions.AbstractMvNormal)

Выполняет выборку случайного вектора из указанного многомерного нормального распределения.

# Base.minimumMethod

minimum(d::Distribution)

Возвращает минимум носителя d.

# Base.maximumMethod

maximum(d::Distribution)

Возвращает максимум носителя d.

# Base.extremaMethod

extrema(d::Distribution)

Возвращает минимум и максимум носителя d в виде двухэлементного кортежа.

MvLogNormal

Помимо описанных выше методов общего интерфейса, также доступны следующие методы:

# Distributions.locationMethod

location(d::MvLogNormal)

Возвращает вектор местоположения распределения (среднее значение базового нормального распределения).

# Distributions.scaleMethod

scale(d::MvLogNormal)

Возвращает матрицу масштаба распределения (ковариационную матрицу базового нормального распределения).

# Statistics.medianMethod

median(d::MvLogNormal)

Возвращает медианный вектор логнормального распределения, который строго меньше среднего значения.

# StatsBase.modeMethod

mode(d::MvLogNormal)

Возвращает вектор режима логнормального распределения, который строго меньше среднего значения и медианы.

Может потребоваться вычислить параметры логнормального распределения (вектор местоположений и матрицу масштаба) на основе заданной ковариации и среднего значения, медианы или режима. С этой целью доступны представленные ниже функции.

# Distributions.locationMethod

location{D<:AbstractMvLogNormal}(::Type{D},s::Symbol,m::AbstractVector,S::AbstractMatrix)

Вычисляет вектор местоположения (среднее значение базового нормального распределения).

  • Если s == :meancov, то m принимается в качестве среднего значения, а S — в качестве ковариационной матрицы логнормального распределения.

  • Если s == :mean | :median | :mode, то m принимается в качестве соответственно среднего значения, медианы или режима логнормального распределения, а S интерпретируется как матрица масштаба (ковариация базового нормального распределения).

Вектор местоположения невозможно получить путем аналитических расчетов на основе, например, медианы и ковариации или режима и ковариации.

# Distributions.location!Method

location!{D<:AbstractMvLogNormal}(::Type{D},s::Symbol,m::AbstractVector,S::AbstractMatrix,μ::AbstractVector)

Вычисляет вектор местоположения (как и выше) и сохраняет результат в .

# Distributions.scaleMethod

scale{D<:AbstractMvLogNormal}(::Type{D},s::Symbol,m::AbstractVector,S::AbstractMatrix)

Вычисляет параметр масштаба согласно приведенному выше определению для параметра местоположения.

# Distributions.scale!Method

scale!{D<:AbstractMvLogNormal}(::Type{D},s::Symbol,m::AbstractVector,S::AbstractMatrix,Σ::AbstractMatrix)

Вычисляет параметр масштаба согласно приведенному выше определению для параметра местоположения и сохраняет результат в Σ.

# StatsAPI.paramsMethod

params{D<:AbstractMvLogNormal}(::Type{D},m::AbstractVector,S::AbstractMatrix)

Возвращает (масштаб, местоположение) для данных среднего значения и ковариации.

Распределения произведений

# Distributions.product_distributionFunction

product_distribution(dists::AbstractArray{<:Distribution{<:ArrayLikeVariate{M}},N})

Создает распределение M + N-мерных массивов как произведение независимых M-мерных распределений путем их наложения.

В качестве резервного варианта эта функция создает распределение ProductDistribution, но можно определить специализированные методы.

product_distribution(dists::AbstractVector{<:Normal})

Создает многомерное нормальное распределение путем наложения одномерных нормальных распределений.

Итоговое распределение типа MvNormal имеет диагональную ковариационную матрицу.

Для построения распределений произведений рекомендуется использовать функцию product_distribution. Для некоторых распределений она создает особый многомерный тип.