我有一个对数似然函数我想优化和理解我可以optim()
在 R 中这样做。我的函数需要的参数是概率向量(长度N
)以及大小对称矩阵N*N
(其中只有 N-choose由于对称性,-2(现在 N=5)值很重要)。
当我尝试使用时,optim()
我收到以下错误:
optim(params, L) 中的错误:(列表)对象不能被强制输入“double”
为什么我会收到这个错误,我怎样才能使它工作?(如果在 Matlab 或 Python 中有更好的解决方案,也欢迎对这些语言的函数提供参考或建议)这里是代码:
numerator <- function(P, Gamma, y, U, N) {
expr = 1
for (i in 1:N-1) {
for ( j in i+1:N) {
if ((y[i] == y[j]) & (y[i] == 1)) {
expr = expr*P[i]*P[j]*exp(Gamma[i,j])
}
if ((y[i] != y[j]) & (y[i] == 1)) {
expr = expr*P[i]*(1 - P[j])
}
if ((y[i] != y[j]) & (y[i] == 0)) {
expr = expr*(1 - P[i])*P[j]
}
if ((y[i] == y[j]) & (y[i] == 0)) {
expr = expr*(1 - P[i]*P[j]*exp(Gamma[i,j]) - P[i]*(1 - P[j]) - (1 - P[i])*P[j])
}
}
}
return(expr)
}
denominator <- function(params, y, U, N) {
P <- params$probs
val <- 1
for (i in 1:N-1) {
val <- val*(y[i]*P[i]^(N-3) + (1-y[i])*(1 - P[i])^(N-3))
}
val <- val * y%*%P + (1 - y)%*%(1 - P)
return(val)
}
L <- function(params, y, U, N) {
P <- params$probs
Gamma <- params[,2:(N+1)]
n <- log(numerator(P, Gamma, y, U, N))
d <- log(denominator(P, y, U, N))
l <- n-d
return(l)
}
y <- readRDS(file="purchase_records_df.rds")
N <- ncol(y)
params <- data.frame('probs'=rep(0.001, N), 'gamma'=matrix(0,nrow=N,ncol=N))
optim(params, L)
简而言之,设置是 y 是购买向量,但在这里我们要获取购买数据并找到潜在的概率。
非常感谢!