我试图在R中的某些分类代码中使用外部函数和预测。为了方便起见,我们将在这篇文章中假设我们有两个名为<的向量强> alpha 和 beta 每个只包含0和1.我正在寻找一种简单有效的方法来传递 alpha 和 beta的所有组合 预测。
我构造了下面的代码来模仿MASS库中的lda函数,所以我使用“分类器”而不是“lda”。值得注意的是,预测中的预测方法取决于( alpha , beta )对。
当然,我可以使用嵌套的for循环来做到这一点,但我试图避免这种方法。
以下是我想要理想的事情:
alpha <- seq(0, 1)
beta <- seq(0, 1)
classifier.out <- classifier(training.data, labels)
outer(X=alpha, Y=beta, FUN="predict", classifier.out, validation.data)
这是一个问题,因为 alpha 和 beta 不是预测中的前两个参数。
所以,为了解决这个问题,我将最后一行更改为
outer(X=alpha, Y=beta, FUN="predict", object=classifier.out, data=validation.data)
请注意,我的验证数据有40个观察值,还有4个可能的 alpha 和 beta 对。虽然说
但我收到了一个错误dims [product 4] do not match the length of object [40]
我尝试了一些其他的东西,其中一些有用,但远非简单。有什么建议吗?
答案 0 :(得分:3)
问题在于外部期望其函数被矢量化(即,它将使用它想要执行的所有参数的向量调用预测ONCE)。因此,当预测被调用一次,返回其结果(恰好是长度为4)时,外部抱怨因为它不等于预期的40。
解决此问题的一种方法是使用Vectorize
。未经测试的代码:
outer(X=alpha, Y=beta, FUN=Vectorize(predict, vectorize.args=c("alpha", "beta")), object=classifier.out, data=validation.data)
答案 1 :(得分:0)
我想出了一个体面的方法来做到这一点。这是:
pairs <- expand.grid(alpha, beta)
names(pairs) <- c("alpha", "beta")
mapply(predict, pairs$alpha, pairs$beta,
MoreArgs=list(object=classifier.out, data=validation.data))
任何人都有更简单,更有效的东西吗?我非常渴望知道,因为我在这个问题上花了太长时间。 :(