如何在 R 中实现矩阵方程?
How Implement matrix equation in R?
我正在学习 'Latent Aspect Rating Analysis' 并且
我正在尝试在 r 中实现该方法。
但是我不知道如何在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)
我正在学习 'Latent Aspect Rating Analysis' 并且 我正在尝试在 r 中实现该方法。 但是我不知道如何在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)