获取我应该在缩放中使用的指数以使向量中的所有数字> = 1

Posted

技术标签:

【中文标题】获取我应该在缩放中使用的指数以使向量中的所有数字> = 1【英文标题】:Obtain the exponent which I should use in scaling to make all numbers in vector >= 1 【发布时间】:2022-01-04 16:36:39 【问题描述】:

假设我有一个包含一些数字的向量,它可以是

> x = abs(rnorm(30))
> x
 [1] 0.32590946 0.05018667 1.54354863 0.28925652 0.61712682 0.09444528
 [7] 0.87951971 1.46243702 0.87099892 1.28553745 0.70360649 0.58973942
[13] 1.20054389 0.94429737 0.64038139 1.04173338 0.24249771 1.67273503
[19] 0.77546385 0.33547348 1.73480609 0.20757933 1.94491872 1.10547259
[25] 1.28570768 1.37621399 0.99389595 2.14107987 2.31719369 1.24458788

当我记录整个向量时,我得到负值:

> log(x)
 [1] -1.121135658 -2.992005742  0.434084070 -1.240441366 -0.482680726
 [6] -2.359734671 -0.128379302  0.380104238 -0.138114546  0.251176883
[11] -0.351536037 -0.528074505  0.182774695 -0.057314153 -0.445691353
[16]  0.040886038 -1.416763021  0.514460030 -0.254293908 -1.092212359
[21]  0.550895644 -1.572241722  0.665220187  0.100272928  0.251309290
[26]  0.319336240 -0.006122756  0.761310314  0.840356837  0.218804452

现在这个向量的最小值是:

> min(x)
[1] 0.05018667

我的问题是这样的。我想通过10^x2^x(取决于日志)缩放数据,因此在这个缩放集上执行的日志将只产生正数(或非负数)。我怎样才能得到最低的指数呢?

【问题讨论】:

【参考方案1】:

也许这符合您的需求。该函数对值进行缩放,使得最小值被分配为 1,并以列表的形式返回指数和缩放后的向量:

set.seed(123)

scale_log <- function(x, base = 2) 
  y <- -log(min(x)) / log(base)

  list(exp = y, scaled = base^y * x)


x <- abs(rnorm(5))

scale_log(x, 2)
#> $exp
#> [1] 3.826061
#> 
#> $scaled
#> [1]  7.949063  3.264540 22.106706  1.000000  1.833650

log2(scale_log(x, 2)$scaled)
#> [1] 2.990785e+00 1.706880e+00 4.466412e+00 3.203427e-16 8.747185e-01

scale_log(x, 10)
#> $exp
#> [1] 1.151759
#> 
#> $scaled
#> [1]  7.949063  3.264540 22.106706  1.000000  1.833650

log10(scale_log(x, 10)$scaled)
#> [1] 9.003159e-01 5.138220e-01 1.344524e+00 9.643275e-17 2.633165e-01

【讨论】:

以上是关于获取我应该在缩放中使用的指数以使向量中的所有数字> = 1的主要内容,如果未能解决你的问题,请参考以下文章

获取R向量中的所有最大值索引

使用 SSE 缩放复杂向量

softmax 的输出不应该是零,对吧?

如何获取决策树中的所有基尼指数?

在openmp中使用不同线程组装矢量时缩放不良

如何获取具有任何数字的所有行