向虚拟变量添加噪声

Adding noise to dummy variables

我正在尝试 运行 knn 回归,但是,我有很多虚拟变量,因此有很多关系。为了解决这个问题,我想给假人添加噪音。所以我想给特定变量上带有 1 的行一个 1 到 0.99 之间的随机值。我想对值为零的行执行相同的操作,然后给它们一个 0 到 0.01 之间的随机数。有人可以帮我提供一种有效的方法来转换我的虚拟变量吗?

要仅添加噪音,您可以执行以下操作:

x  <- rep(1, 1000)
noisy_x  <- x + rnorm(n = 1000, mean = 0, sd = 0.000001)
noisy_x
#  [1] 1.0000010 1.0000004 1.0000014 0.9999998 0.9999998 1.0000007 0.9999990 1.0000006 1.0000006 0.9999989 1.0000007 0.9999998 0.9999992 1.0000002 0.9999989 0.9999994
#   [17] 0.9999987 0.9999997 1.0000000 0.9999993 1.0000000 0.9999997 1.0000013 0.9999991 0.9999987 0.9999994 0.9999983 0.9999992 0.9999982 1.0000004 1.0000000 1.0000009

但是,我会质疑这是否是正确的方法。虚拟变量通常不需要添加噪声。你是什​​么意思你得到领带?一般来说,如果你有一个变量代表一个因子的 n 个水平,你将只需要 n-1 个虚拟变量。您指的是这个吗?

在 base R 中有一个很棒的函数,叫做 jitter

jitter(x = c(rep(0, 10), rep(1, 10)), factor = 0.01)

您可以使用 ifelse 语句来转换您的虚拟变量:

set.seed(4)
df <- data.frame(letter=letters[1:10],dummy=sample(0:1,10,replace = T))
df$newdummy <- ifelse(df$dummy==1,runif(1,0.99,1),runif(1,0,0.01))

这里我添加了一个新列,但您可以通过将 ifelse 语句分配给旧虚拟变量来替换现有列。 但是,我同意@SamR 关于虚拟变量的回答。不太清楚你想用虚拟变量做什么