私は2つの整数を取る関数作成する必要があるx
とN
、N > x
寸法のベクトル戻りN
成分を除いてすべてゼロとしx
、それが持っているが、1
。
私はそれを次のように行うことができました、
Function=function(x,N){
vec=rep(0,N)
r=as.integer(x)
vec[r]=1
return(vec)
}
しかし、プロセスを繰り返して多数の実現に適用する必要がある場合は、非常に遅くなります。一方、私の友人はpythonの単一の関数(「OneHotEncoder」だと思います)で同じことを行うことができ、それは超高速です。
この目的に適した関数がRにあるかどうか疑問に思いました。
@Axemanが言ったことに沿って、ベクトル化された方法でワンホットエンコーディングを見つけることができるかどうかを考える必要があります。
set.seed(1234)
x=sample.int(5,size=10,replace=TRUE)
x
# [1] 1 4 4 4 5 4 1 2 4 3
nC=max(x) #could be also larger (user-defined)
nR=length(x)
matrix(`[<-`(integer(nR*nC),(seq.int(nR)-1)*nC+x,1),
nR,nC,byrow=TRUE)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 0 0 0 0
# [2,] 0 0 0 1 0
# [3,] 0 0 0 1 0
# [4,] 0 0 0 1 0
# [5,] 0 0 0 0 1
# [6,] 0 0 0 1 0
# [7,] 1 0 0 0 0
# [8,] 0 1 0 0 0
# [9,] 0 0 0 1 0
# [10,] 0 0 1 0 0
model.matrix
上記のアプローチとアプローチを比較します。
#longer input vector
x=sample.int(5,size=1e4,replace=TRUE)
oneHotMtx=function(x) {
nC=max(x) #could be also larger (user-defined)
nR=length(x)
matrix(`[<-`(integer(nR*nC),(seq.int(nR)-1)*nC+x,1),
nR,nC,byrow=TRUE)
}
oneHotMdl=function(x) {
xf = factor(x)
model.matrix(~xf+0)
}
oneHotMdl2=function(x) {
#version without factor conversion
model.matrix(~x+0)
}
xf=factor(x)
library(microbenchmark)
microbenchmark(oneHotMtx(x),
oneHotMdl(x),
oneHotMdl2(xf),times=1e3)
#Unit: microseconds
# expr min lq mean median uq max neval cld
# oneHotMtx(x) 386.621 412.510 678.2977 416.4625 435.382 5394.265 1000 a
# oneHotMdl(x) 7363.481 7528.230 8823.8435 7629.8850 7851.019 261808.302 1000 c
#oneHotMdl2(xf) 4253.366 4377.784 5059.0979 4471.5315 4638.637 257106.400 1000 b
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加