gpt4 book ai didi

r 如何使用这些约束重新调整一系列数字?

转载 作者:行者123 更新时间:2023-12-04 12:31:14 25 4
gpt4 key购买 nike

我需要在某些约束条件下重新调整一系列数字。

假设我有这样一个向量:

x <- c(0.5, 0.3, 0.6, 0.4, 0.9, 0.1, 0.2, 0.3, 0.6)

  1. x 的总和必须是 6。现在 x 的总和 = 3.9。
  2. 数字不能小于0
  3. 数字不能大于1

我知道如何分别做 1 和 2+3,但不会一起做。我该如何重新缩放它?

编辑:正如 r2evans 所尝试的那样,最好保留数字的相对关系

最佳答案

我不知道这可以用一个简单的表达式来完成,但我们可以通过它优化我们的方式:

opt <- optimize(function(z) abs(6 - sum( z + (1-z) * (x - min(x)) / diff(range(x)) )),
lower=0, upper=1)
opt
# $minimum
# [1] 0.2380955
# $objective
# [1] 1.257898e-06
out <- ( opt$minimum + (1-opt$minimum) * (x - min(x)) / diff(range(x)) )
out
# [1] 0.6190477 0.4285716 0.7142858 0.5238097 1.0000000 0.2380955 0.3333335 0.4285716 0.7142858 1.0000000
sum(out)
# [1] 6.000001

因为那是 note perfectly 6,我们可以多做一步来保护它:

out <- out * 6/sum(out)
out
# [1] 0.6190476 0.4285715 0.7142857 0.5238096 0.9999998 0.2380954 0.3333335 0.4285715 0.7142857 0.9999998
sum(out)
# [1] 6

这个过程保留数字的相对关系。如果“低”数多于“高”数,缩放使总和为 6 将使较高的数大于 1。为了补偿这一点,我们将低端 (z 移至我的代码),这样所有的数字都会稍微向上移动一点(但较低的数字会按比例向上移动更多)。

结果应该始终是数字在 [opt$minimum,1] 中,总和将为 6。

关于r 如何使用这些约束重新调整一系列数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68912040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com