Многомерные распределения
Многомерные распределения — это распределения, которые имеют размерность Multivariate
(то есть каждая выборка представляет собой вектор). Абстрактные типы для многомерных распределений:
const MultivariateDistribution{S<:ValueSupport} = Distribution{Multivariate,S}
const DiscreteMultivariateDistribution = Distribution{Multivariate, Discrete}
const ContinuousMultivariateDistribution = Distribution{Multivariate, Continuous}
Общий интерфейс
Перечисленные ниже методы реализованы для каждого многомерного распределения, что обеспечивает единообразный интерфейс для работы с такими распределениями.
Вычисление статистики
#
Base.length
— Method
length(d::MultivariateDistribution) -> Int
Возвращает выборочное измерение распределения d
.
#
Base.size
— Method
size(d::MultivariateDistribution)
Возвращает размер выборки распределения d
, т. е. (length(d),)
.
#
Base.eltype
— Method
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.mean
— Method
mean(d::MultivariateDistribution)
Вычисляет вектор средних значений распределения d
.
#
Statistics.var
— Method
var(d::MultivariateDistribution)
Вычисляет вектор поэлементных дисперсий для распределения d
.
#
Statistics.cov
— Method
cov(d::MultivariateDistribution)
Вычисляет ковариационную матрицу для распределения d
. (cor
предоставляется на основе cov
).
#
Statistics.cor
— Method
cor(d::MultivariateDistribution)
Вычисляет матрицу корреляции для распределения d
.
#
StatsBase.entropy
— Method
entropy(d::MultivariateDistribution)
Вычисляет значение энтропии распределения d
.
#
StatsBase.entropy
— Method
entropy(d::MultivariateDistribution, b::Real)
Вычисляет значение энтропии распределения относительно заданного основания.
Оценка вероятности
#
Distributions.insupport
— Method
insupport(d::MultivariateDistribution, x::AbstractArray)
Если — вектор, возвращается значение, указывающее, находится ли x в пределах носителя . Если — матрица, возвращается значение, указывающее, находится ли каждый столбец в в пределах носителя .
#
StatsAPI.loglikelihood
— Method
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
withsize(x) == size(d)
, -
an array of dimension
N + 1
withsize(x)[1:N] == size(d)
, or -
an array of arrays
xi
of dimensionN
withsize(xi) == size(d)
.
Примечание. Для многомерных распределений значение функции плотности вероятности обычно очень мало или очень велико, поэтому ее вычисление напрямую может вызвать численные проблемы. Как правило, рекомендуется выполнять вероятностные вычисления в логарифмическом масштабе.
Выборка
#
Base.rand
— Method
rand(::AbstractRNG, ::Sampleable)
Производит выборку из сэмплера и возвращает результат.
#
Random.rand!
— Method
rand!(::AbstractRNG, ::Sampleable, ::AbstractArray)
Выполняет выборку на месте из сэмплера и сохраняет результат в указанном массиве.
Примечание. Помимо этих общих методов, у каждого многомерного распределения есть специальные методы, приведенные ниже.
Распределения
#
Distributions.Multinomial
— Type
Мультиномиальное распределение является обобщением биномиального распределения. Возьмем n независимых выборок из категориального распределения на конечном множестве размером k и допустим, что , где представляет количество раз, которое встречается элемент . Тогда распределение является мультиномиальным. Каждая выборка мультиномиального распределения является k-мерным целочисленным вектором, сумма элементов которого равна n.
Вероятностная функция массы имеет следующий вид:
Multinomial(n, p) # Мультиномиальное распределение для n испытаний с вектором вероятностей p
Multinomial(n, k) # Мультиномиальное распределение для n испытаний с равными вероятностями
# на множестве 1:k
#
Distributions.AbstractMvNormal
— Type
Многомерное нормальное распределение является многомерным обобщением нормального распределения. Функция плотности вероятности 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.MvNormal
— Type
MvNormal
Как правило, пользователям не нужно беспокоиться об этих внутренних механизмах.
Мы предоставляем общий конструктор MvNormal
, который создает распределение соответствующего типа в зависимости от входных аргументов.
#
Distributions.MvNormalCanon
— Type
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.MvLogitNormal
— Type
MvLogitNormal{<:AbstractMvNormal}
Многомерное логистически нормальное распределение является многомерным обобщением LogitNormal
с поддержкой корреляций между величинами.
Если — это вектор длиной , то
является вектором вероятностей длиной .
MvLogitNormal(μ, Σ) # MvLogitNormal с y ~ MvNormal(μ, Σ)
MvLogitNormal(MvNormal(μ, Σ)) # то же, что и выше
MvLogitNormal(MvNormalCanon(μ, J)) # MvLogitNormal с y ~ MvNormalCanon(μ, J)
Поля
-
normal::AbstractMvNormal
: содержит -мерное распределение
#
Distributions.MvLogNormal
— Type
MvLogNormal(d::MvNormal)
Многомерное логнормальное распределение является многомерным обобщением логнормального распределения.
Если имеет многомерное нормальное распределение, то имеет многомерное логнормальное распределение.
Вектор средних значений и ковариационная матрица базового нормального распределения называются параметрами местоположения и масштаба соответствующего логнормального распределения.
#
Distributions.Dirichlet
— Type
Dirichlet
Распределение Дирихле часто используется в качестве сопряжения перед категориальным или мультиномиальным распределением. Функция плотности вероятности распределения Дирихле с параметром имеет следующий вид:
# Допустим, что alpha — это вектор
Dirichlet(alpha) # Распределение Дирихле с вектором параметров alpha
# Допустим, что a — это положительное скалярное значение
Dirichlet(k, a) # Распределение Дирихле с параметром a * ones(k)
#
Distributions.Product
— Type
Product <: MultivariateDistribution
N-мерное распределение MultivariateDistribution
, построенное на основе вектора N независимых распределений UnivariateDistribution
.
Product(Uniform.(rand(10), 1)) # 10-мерное распределение Product из 10 независимых распределений `Uniform`.
Методы сложения
AbstractMvNormal
Помимо описанных выше методов общего интерфейса, для всех многомерных распределений, относящихся к базовому типу AbstractMvNormal
, также доступны следующие методы:
#
Distributions.invcov
— Method
invcov(d::AbstractMvNormal)
Возвращает обратную ковариационную матрицу d.
#
Distributions.logdetcov
— Method
logdetcov(d::AbstractMvNormal)
Возвращает значение логарифма определителя ковариационной матрицы.
#
Distributions.sqmahal
— Method
sqmahal(d, x)
Возвращает возведенное в квадрат расстояние Махаланобиса от x до центра d относительно ковариации. Если x — это вектор, возвращается скалярное значение. Если x — это матрица, возвращается вектор длиной size(x,2).
sqmahal!(r, d, x)
записывает результаты в предварительно размещенный в памяти массив r
.
#
Base.rand
— Method
rand(::AbstractRNG, ::Distributions.AbstractMvNormal)
Выполняет выборку случайного вектора из указанного многомерного нормального распределения.
#
Base.extrema
— Method
extrema(d::Distribution)
Возвращает минимум и максимум носителя d
в виде двухэлементного кортежа.
MvLogNormal
Помимо описанных выше методов общего интерфейса, также доступны следующие методы:
#
Distributions.location
— Method
location(d::MvLogNormal)
Возвращает вектор местоположения распределения (среднее значение базового нормального распределения).
#
Distributions.scale
— Method
scale(d::MvLogNormal)
Возвращает матрицу масштаба распределения (ковариационную матрицу базового нормального распределения).
#
Statistics.median
— Method
median(d::MvLogNormal)
Возвращает медианный вектор логнормального распределения, который строго меньше среднего значения.
#
StatsBase.mode
— Method
mode(d::MvLogNormal)
Возвращает вектор режима логнормального распределения, который строго меньше среднего значения и медианы.
Может потребоваться вычислить параметры логнормального распределения (вектор местоположений и матрицу масштаба) на основе заданной ковариации и среднего значения, медианы или режима. С этой целью доступны представленные ниже функции.
#
Distributions.location
— Method
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.scale
— Method
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.params
— Method
params{D<:AbstractMvLogNormal}(::Type{D},m::AbstractVector,S::AbstractMatrix)
Возвращает (масштаб, местоположение) для данных среднего значения и ковариации.
Распределения произведений
#
Distributions.product_distribution
— Function
product_distribution(dists::AbstractArray{<:Distribution{<:ArrayLikeVariate{M}},N})
Создает распределение M + N
-мерных массивов как произведение независимых M
-мерных распределений путем их наложения.
В качестве резервного варианта эта функция создает распределение ProductDistribution
, но можно определить специализированные методы.
product_distribution(dists::AbstractVector{<:Normal})
Создает многомерное нормальное распределение путем наложения одномерных нормальных распределений.
Итоговое распределение типа MvNormal
имеет диагональную ковариационную матрицу.
Для построения распределений произведений рекомендуется использовать функцию product_distribution
. Для некоторых распределений она создает особый многомерный тип.