【发布时间】:2015-08-19 09:01:07
【问题描述】:
我正在尝试使用 R 的本地数据集(来自 MASS 的间歇泉)使用 optim() 在 R 中为高斯混合实现 MLE。我的代码如下。问题是 optim 工作正常,但是返回我传递给它的原始参数,并且还说它已经收敛。如果您能指出我偏离轨道的地方,我将不胜感激。我的期望是它至少会产生不同的结果 如果不是完全不同的话。
library(ggplot2)
library(MASS)
data("geyser")
externaldata=geyser$waiting
x.vector=externaldata
MLE.x= function(combined.vector)
{ combined.vector=bigvec
x.vector = externaldata
K = k #capital K inside this MLE function, small K defined in the global environment
prob.vector = combined.vector[1:K]
mu.vector =combined.vector[(K+1):((2*K))]
sd.vector=combined.vector[(2*K+1):(3*K)]
prob=matrix(rep(prob.vector,length(x.vector)),byrow=TRUE,nrow = length(x.vector))
mu.sigma=cbind(mu.vector,sd.vector)
x.by.K=matrix(nrow = length(x.vector), ncol = k)
for (i in 1:K){
x.by.K[,i]=dnorm(x.vector,mu.sigma[i,1],mu.sigma[i,2])
}
prob.mat=x.by.K*prob
density=apply(prob.mat,1,sum)
log.density=sum(-log(density))
return(log.density)
}
## k=2 set ##
meanvec=c(50,80)
sigmavec=c(5,5)
k=2
probvec=c(1/3,2/3)
bigvec=c(probvec,meanvec,sigmavec)
est.k2.MLE=MLE.x(bigvec)
z=optim(bigvec,
fn=MLE.x,
method = "L-BFGS-B")
z
#### k=3 set #####
meanvec=c(50,70,80)
sigmavec=c(5,5,5)
k=3
probvec=rep(1/3,3)
bigvec=c(probvec,meanvec,sigmavec)
est.k3.MLE=MLE.x(bigvec)
z=optim(bigvec,
fn=MLE.x,
method = "BFGS")
z
【问题讨论】:
-
有什么理由不使用传递给 MLE.x 的参数? (MLE.x 的第一行)
-
@antoine-sac 不,先生,只是业余编码
-
此外,使用
=进行赋值被认为是错误的形式,尽管the pros and cons are really not that clear。 IMO 可以使用=,但我只是确保这是您的选择。 -
@antoine-sac。您会推荐
<-以供将来使用吗? -
MLE.x没有return参数
标签: r