一个热编码功能
one hot encoding function
我需要创建一个接受两个整数 x
和 N
的函数,其中 N > x
和 returns 是维度为 N
的向量除了组件 x
之外的所有零,其中它有一个 1
.
我设法通过以下方式做到了,
Function=function(x,N){
vec=rep(0,N)
r=as.integer(x)
vec[r]=1
return(vec)
}
但是当我需要迭代过程并将其应用于大量实现时,它的速度非常慢。另一方面,我的一个朋友能够用 python(我认为 "OneHotEncoder")的单个函数来做同样的事情,而且速度非常快。
我想知道 R 中是否有适合此目的的函数。
尝试
one_hot_encoder <- function(x, N) {
vec <- integer(N)
vec[x] <- 1L
return(vec)
}
按照@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
@cryo111 回答的更详细的变体:
one_hot_vec <- function(x) {
nc <- max(x)
nr <- length(x)
m <- integer(nr * nc)
i <- (seq_len(nr) - 1) * nc + x
m[i] <- 1L
matrix(m, nrow = nr, ncol = nc, byrow = TRUE)
}
我需要创建一个接受两个整数 x
和 N
的函数,其中 N > x
和 returns 是维度为 N
的向量除了组件 x
之外的所有零,其中它有一个 1
.
我设法通过以下方式做到了,
Function=function(x,N){
vec=rep(0,N)
r=as.integer(x)
vec[r]=1
return(vec)
}
但是当我需要迭代过程并将其应用于大量实现时,它的速度非常慢。另一方面,我的一个朋友能够用 python(我认为 "OneHotEncoder")的单个函数来做同样的事情,而且速度非常快。
我想知道 R 中是否有适合此目的的函数。
尝试
one_hot_encoder <- function(x, N) {
vec <- integer(N)
vec[x] <- 1L
return(vec)
}
按照@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
@cryo111 回答的更详细的变体:
one_hot_vec <- function(x) {
nc <- max(x)
nr <- length(x)
m <- integer(nr * nc)
i <- (seq_len(nr) - 1) * nc + x
m[i] <- 1L
matrix(m, nrow = nr, ncol = nc, byrow = TRUE)
}