标准化 R 中的向量,使值向边界移动
Standardizing a vector in R so that values shift towards boundaries
我有如下矢量 -
a <- c(0.211, 0.028, 0.321, 0.072, -0.606, -0.364, -0.066, 0.172,
-0.917, 0.062, 0.117, -0.136, -0.296, 0.022, 0.046, -0.19, 0.057,
-0.625, -0.01, 0.158, 0.407, -0.328, -0.347, -0.512, -0.101,
0.008, -0.406, -0.014, 0.517, 0.085, -0.525, -0.635, -0.603,
-0.105, 0.643, -0.094, -0.26, 0.348, -0.106, 0.608, 0.146, -0.343,
-0.537, -0.661, 0.166, -0.037, -0.224, -0.269, -0.221, -0.623,
-0.025, 0.382, 0.201, -0.281, -0.699, -0.373, -0.146, -0.273,
-0.354, -0.138, -0.098, 0.312, 0.467, 0.156, 0.264, -0.108, -0.707,
-1, -0.423, -0.708, -0.235, -0.219, -0.645, 0.081, 0.704, -0.639,
0.368, -0.578, 0.158, -0.04, -0.071, -0.125, 0.006, 0.423, 0.112,
1, 0.373, -0.554, -0.092, 0.509, -0.535, -0.619, -0.31, -0.082,
-0.367, -0.574, 0.029, 0.391, 0.062, -0.476)
这个向量的范围是从-1到1,看起来像-
> plot(a)
有没有办法标准化向量 a
以便所有值都从零移动并向 1 或 -1 移动? (靠近红线)。
如果我能控制这些值向 1 或 -1 移动的程度,那就太好了。
您可以使用最小-最大标准化。通常最小最大标准。用于缩放 0 到 1 之间的值。但是,您可以使用以下等式将值缩放到任何范围 [a, b]:
X_Scaled = a + (x - min(x)) * (b-a) / (max(x) - min(x))
因此,对于您的情况,我们将其分解为两个步骤。
首先:您希望正值以 0.75
为中心,负值以 -0.75
为中心。所以我们可以只过滤您数据中的值。
data <- runif(100, -1, 1)
positive_vals <- data[data > 0]
negative_vals <- data[data < 0]
第二步:你想控制他们向 0.75
这个值移动多少。所以你可以定义一个范围和一个中心。比如说,0.05
的范围和 0.75
的中心给我们 a = 0.7
和 b=0.8
,对吗?我们可以对负中心做同样的事情。
range <- 0.05
upper_center <- 0.75
lower_center <- -0.75
b1 <- upper_center + range
a1 <- upper_center - range
b2 <- lower_center + range
a2 <- lower_center - range
最后,我们对这两种情况应用最小-最大方程,注意保留原始数组中正值和负值的原始位置。
# normalize them using, say, min-max
positive_vals <- a1 + ((positive_vals - min(positive_vals)) * (b1 - a1)) / (max(positive_vals) - min(positive_vals))
negative_vals <- a2 + ((negative_vals - min(negative_vals)) * (b2 - a2)) / (max(negative_vals) - min(negative_vals))
new_data <- data
new_data[data > 0] <- positive_vals
new_data[data < 0] <- negative_vals
# Plot the results!
plot(data)
points(new_data, col = "red")
如果您不满意移动如此接近 0.75
的值,只需增加 range
。您还可以通过定义不同的值来移动 centers
。
使用您提供的数据:
我有如下矢量 -
a <- c(0.211, 0.028, 0.321, 0.072, -0.606, -0.364, -0.066, 0.172,
-0.917, 0.062, 0.117, -0.136, -0.296, 0.022, 0.046, -0.19, 0.057,
-0.625, -0.01, 0.158, 0.407, -0.328, -0.347, -0.512, -0.101,
0.008, -0.406, -0.014, 0.517, 0.085, -0.525, -0.635, -0.603,
-0.105, 0.643, -0.094, -0.26, 0.348, -0.106, 0.608, 0.146, -0.343,
-0.537, -0.661, 0.166, -0.037, -0.224, -0.269, -0.221, -0.623,
-0.025, 0.382, 0.201, -0.281, -0.699, -0.373, -0.146, -0.273,
-0.354, -0.138, -0.098, 0.312, 0.467, 0.156, 0.264, -0.108, -0.707,
-1, -0.423, -0.708, -0.235, -0.219, -0.645, 0.081, 0.704, -0.639,
0.368, -0.578, 0.158, -0.04, -0.071, -0.125, 0.006, 0.423, 0.112,
1, 0.373, -0.554, -0.092, 0.509, -0.535, -0.619, -0.31, -0.082,
-0.367, -0.574, 0.029, 0.391, 0.062, -0.476)
这个向量的范围是从-1到1,看起来像-
> plot(a)
a
以便所有值都从零移动并向 1 或 -1 移动? (靠近红线)。
如果我能控制这些值向 1 或 -1 移动的程度,那就太好了。
您可以使用最小-最大标准化。通常最小最大标准。用于缩放 0 到 1 之间的值。但是,您可以使用以下等式将值缩放到任何范围 [a, b]:
X_Scaled = a + (x - min(x)) * (b-a) / (max(x) - min(x))
因此,对于您的情况,我们将其分解为两个步骤。
首先:您希望正值以 0.75
为中心,负值以 -0.75
为中心。所以我们可以只过滤您数据中的值。
data <- runif(100, -1, 1)
positive_vals <- data[data > 0]
negative_vals <- data[data < 0]
第二步:你想控制他们向 0.75
这个值移动多少。所以你可以定义一个范围和一个中心。比如说,0.05
的范围和 0.75
的中心给我们 a = 0.7
和 b=0.8
,对吗?我们可以对负中心做同样的事情。
range <- 0.05
upper_center <- 0.75
lower_center <- -0.75
b1 <- upper_center + range
a1 <- upper_center - range
b2 <- lower_center + range
a2 <- lower_center - range
最后,我们对这两种情况应用最小-最大方程,注意保留原始数组中正值和负值的原始位置。
# normalize them using, say, min-max
positive_vals <- a1 + ((positive_vals - min(positive_vals)) * (b1 - a1)) / (max(positive_vals) - min(positive_vals))
negative_vals <- a2 + ((negative_vals - min(negative_vals)) * (b2 - a2)) / (max(negative_vals) - min(negative_vals))
new_data <- data
new_data[data > 0] <- positive_vals
new_data[data < 0] <- negative_vals
# Plot the results!
plot(data)
points(new_data, col = "red")
如果您不满意移动如此接近 0.75
的值,只需增加 range
。您还可以通过定义不同的值来移动 centers
。
使用您提供的数据: