R中的矢量化核函数

时间:2014-05-28 13:07:37

标签: r vectorization

很容易构建高斯核函数,以便它可以处理矢量输入:

K_gaussian <- function(x){return(1/sqrt(2*pi)*(exp(-0.5*x*x)))}
K_gaussian(seq(-1,1,0.5))
# [1] 0.2419707 0.3520653 0.3989423 0.3520653 0.2419707

但是当我尝试编写代码时,我遇到了麻烦,例如,Epanechnikov内核:

K_ep <- function(x){if(abs(x)>1){return(0)} else{return(3/4*(1-x*x))}}

因为if语句搞砸了。例如,以下未提供向量输出

K_ep(seq(-2,2,0.25))
# [1] 0

Warning message:
In if (abs(x) > 1) { :
the condition has length > 1 and only the first element will be used

如何解决此问题?

3 个答案:

答案 0 :(得分:2)

您可以使用两种方法来矢量化您的功能。 由于您只有一个参数,因此最简单的选择是使用sapply

K_ep(seq(-2,2,0.25))
sapply(seq(-2, 2, 0.25), K_ep)
##  [1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.32812 0.56250
##  [8] 0.70312 0.75000 0.70312 0.56250 0.32812 0.00000 0.00000
## [15] 0.00000 0.00000 0.00000

但是,有时您想要对许多参数进行矢量化,sapply不再适用。您需要mapplyVectorize(包装)

K_epvect <- Vectorize(K_ep, vectorize.args = "x")
K_epvect(seq(-2,2,0.25))
##  [1] 0.00000 0.00000 0.00000 0.00000 0.00000 0.32812 0.56250
##  [8] 0.70312 0.75000 0.70312 0.56250 0.32812 0.00000 0.00000
## [15] 0.00000 0.00000 0.00000

答案 1 :(得分:1)

使用ifelse

K_ep2 <- function(x){ifelse(abs(x)>1, 0, 3/4*(1-x*x))}
K_ep2(seq(-2,2,0.25))
 [1] 0.000000 0.000000 0.000000 0.000000 0.000000 0.328125 0.562500 0.703125 0.750000 0.703125 0.562500 0.328125 0.000000 0.000000 0.000000
[16] 0.000000 0.000000

答案 2 :(得分:1)

在条件为true / false时要返回0的特定情况下,您还可以使用以下内容简化函数:

K_ep <- function(x){return((abs(x)>1)*3/4*(1-x*x))}}

(这个功能不必简化,但在某些情况下可以提供帮助)