使用带有predict()的outer()

时间:2010-01-13 06:01:27

标签: r

我试图在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]

我尝试了一些其他的东西,其中一些有用,但远非简单。有什么建议吗?

2 个答案:

答案 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))

任何人都有更简单,更有效的东西吗?我非常渴望知道,因为我在这个问题上花了太长时间。 :(