【发布时间】:2018-05-15 02:30:38
【问题描述】:
嗨,我有以下功能:
kde.cv = function(X,s) {
l = length(X)
log.fhat.vector = c()
for (i in 1:l) {
current.log.fhat = log ( kde(X[i],X[-i],s) )
log.fhat.vector[i] = current.log.fhat
}
CV.score = sum(log.fhat.vector)
return(CV.score)
}
我想在不使用任何 for 循环或 apply 语句的情况下对其进行矢量化,但似乎无法绕过这样做。帮助将不胜感激。谢谢。
编辑:鉴于回答,这是我对所提出问题的回答。
鉴于要求澄清,我将详细说明函数输入和给定函数内的用户定义函数。所以这里的 X 是一个向量形式的数据集,具体来说,是我用作该函数输入的数据集中长度为 7 的向量。我使用这个函数的 X 是 c(-1.1653, -0.7538, -1.3218, -2.3394, -1.9766, -1.8718, -1.5041)。 s 是设置为 0.2 的单个标量点,用于使用此函数。 kde 是我写的一个用户定义的函数。这是实现:
kde = function(x,X,s){
l = length(x)
b = matrix(X,l,length(X),byrow = TRUE)
c = x - b
phi.matrix = dnorm(c,0,s)
d = rowMeans(phi.matrix)
return(d)
}
在此函数中,X 与 kde.cv 中使用的数据点向量相同。 s 也是 kde.cv 中使用的相同标量值 0.2。 x 是函数的评估点向量,我使用了 seq(-2.5, -0.5, by = 0.1)。
【问题讨论】:
-
请提供更完整的可重现示例。包括 X 和 s 的值,以便我们可以使用它来测试您的功能。此外,有关您尝试实现的目标的文档也将对社区有所帮助。
-
@Juan Zamora 我已经编辑了我的原始帖子以提供更多详细信息。就我对这段代码所做的事情而言:kde 是一个函数,通过使用评估点 x 和带宽 s 的向量在 X 给定的数据集上通过正常内核拟合非参数密度。 kde.cv 是一个进行交叉验证以选择最佳带宽 s 的函数。
标签: r