如何在 R 中实现矩阵方程?

How Implement matrix equation in R?

我正在学习 'Latent Aspect Rating Analysis' 并且 我正在尝试在 r 中实现该方法。 但是我不知道如何在r编程中解决这些问题。

公式如下:

这是目前的 代码:

-(t( alpha ) %*% Sd - rd) / delta) * Sd - sigma %*% (alpha - mu) 

我必须计算出使这个方程为零的 alpha。 Delta 和 rd 是常数,alpha、Sd 和 mu 是矩阵 ( k x 1 )。 sigma 是一个矩阵 (k x k )。在这种情况下,k = 3.

定义一个函数 f 如下,它计算你的方程

f <- function(alpha) {
    y <- numeric(length(alpha))

    z <- matrix(alpha,nrow=k)
    # or as.numeric((t(z) %*% sd - rd))
    y <- - ((t(z) %*% sd - rd)[1,1]/delta^2) * matrix(sd,nrow=k) - solve(sigma) %*% (z - mu)
    y
}

注意:您在R中给出的表述至少有一处错误; delta 应该是 delta^2.

创建一些假数据:

# some fake data
set.seed(401)
k <- 3
sd <- runif(k)
rd <- runif(k)
delta <- 1
rd <- .04
mu <- 1

sigma <- matrix(runif(k*k,1,4),nrow=k,ncol=3)
sigma
alpha <- rep(1,k)

显示此变量星座f的值

f(alpha)

使用非线性方程求解器求解 alpha 如下

library(nleqslv)
nleqslv(alpha,f)

如果您要多次计算 f,建议事先计算一次 solve(sigma)sigma 的倒数)。

我们想要

((alpha'*s - r)*s)/(d*d) + inv(Sigma)*(alpha - mu)

注意到

alpha'*s = s'*alpha

我们可以重新排列为

(s*s')*alpha/(d*d) -r*s/(d*d) + inv(Sigma)*alpha - inv(Sigma)*mu

然后到

(inv(Sigma) + (s*s')/(d*d))*alpha = (r/(d*d))*s + inv(Sigma)*mu

所以

alpha = inv( (inv(Sigma) + (s*s')/(d*d)))* ( (r/(d*d))*s + inv(Sigma)*mu)