多変量正規密度があるとします。二次(部分)微分wrtを取得したい。行列の微分をどのように取るかわからない。
ウィキによると、マトリックス内の要素ごとに派生要素を取得します。
ラプラス近似で作業してい モードはです。θ = μ
Iは、与えられたこれどのようにして生じたのですか?
私がしたこと:
だから、私はへの微分wrtをとります。まず、転置があり、次に行列です。だから、私は立ち往生しています。
注:私の教授がこれに遭遇した場合、私は講義に言及しています。
多変量正規密度があるとします。二次(部分)微分wrtを取得したい。行列の微分をどのように取るかわからない。
ウィキによると、マトリックス内の要素ごとに派生要素を取得します。
ラプラス近似で作業してい モードはです。θ = μ
Iは、与えられたこれどのようにして生じたのですか?
私がしたこと:
だから、私はへの微分wrtをとります。まず、転置があり、次に行列です。だから、私は立ち往生しています。
注:私の教授がこれに遭遇した場合、私は講義に言及しています。
回答:
Matrix Cookbookの第2章には、多変量ガウス尤度を区別するためのルールを含む、確率と統計を行う際に遭遇する問題に役立つ多くの有用なアイデンティティを提供するマトリックス計算の素晴らしいレビューがあります。
平均ベクトルおよび共分散行列多変量正規のランダムベクトルがある場合、行列クックブックで方程式(86)を使用して、に関する対数尤度はμ Σ L μ
これを再度区別し、になる答えを見つけるためにあなたに任せます。
「余分なクレジット」として、式(57)および(61)を使用して、に関する勾配が
多くの手順を省略しましたが、マトリックスクックブックにあるIDのみを使用してこの派生を行ったので、ギャップを埋めるためにそれをあなたに任せます。
私はこれらのスコア方程式を最尤推定に使用しているので、正しいことはわかっています:)
で繰り返される要素を適切に処理することを確認する必要があります。そうしないと、導関数が正しくなくなります。たとえば、(141)Matrix Cookbookは対称に次の導関数を与えますΣ
ここで、はHadmard製品を示し、便宜上、を定義しています。X:= Y - μ
特に、これは対称性が課されていない場合と同じではないことに注意してください。その結果、
ここで、は、およびの、および導関数を示し0xはyのμの Dのログを| 2個のπ |
これは保証の要素に対応。∂ L ∂L
@Macroの答えを計算で検証しようとしましたが、共分散ソリューションの小さなエラーと思われるものが見つかりました。彼が得 ただし、正しい解は実際には 次のRスクリプトは、各要素について有限差分が計算される簡単な例を提供します。これは、ことを示しているB=2A-DIAG(A)ΣAB
library(mvtnorm)
set.seed(1)
# Generate some parameters
p <- 4
mu <- rnorm(p)
Sigma <- rWishart(1, p, diag(p))[, , 1]
# Generate an observation from the distribution as a reference point
x <- rmvnorm(1, mu, Sigma)[1, ]
# Calculate the density at x
f <- dmvnorm(x, mu, Sigma)
# Choose a sufficiently small step-size
h <- .00001
# Calculate the density at x at each shifted Sigma_ij
f.shift <- matrix(NA, p, p)
for(i in 1:p) {
for(j in 1:p) {
zero.one.mat <- matrix(0, p, p)
zero.one.mat[i, j] <- 1
zero.one.mat[j, i] <- 1
Sigma.shift <- Sigma + h * zero.one.mat
f.shift[i, j] <- dmvnorm(x, mu, Sigma.shift)
}
}
# Caluclate the finite difference at each shifted Sigma_ij
fin.diff <- (f.shift - f) / h
# Calculate the solution proposed by @Macro and the true solution
A <- -1/2 * (solve(Sigma) - solve(Sigma) %*% (x - mu) %*% t(x - mu) %*% solve(Sigma))
B <- 2 * A - diag(diag(A))
# Verify that the true solution is approximately equal to the finite difference
fin.diff
A * f
B * f