首页 > 解决方案 > 如何创建最佳功能更好?

问题描述

我想为“最佳更好”关系创建一个函数,如下图所示 在此处输入图像描述

我可以为“越多越好”和“越少越好”创建一个功能,例如

normalize <- function(x, na.rm=na.rm, relation=relation) {
  if (relation == "More is better") {
    normalize <- ((x - min(x, na.rm=na.rm))/
                    (max(x, na.rm=na.rm) - min(x, na.rm=na.rm)))
  } else {
    normalize <- 1 - ((x - min(x, na.rm=na.rm))/
                        (max(x, na.rm=na.rm) - min(x, na.rm=na.rm)))
  }
  return(normalize)
}

这是一个小数据

set.seed(123)
value <- runif(50, min=3, max=8.5)

“最佳值更好”应该将“越多越好”到一个范围或点(例如,当前数据为 6.5-7.5),在最佳范围内,归一化值应该是 1 和超出范围或点,它应该计算为“越少越好”。我怎样才能在 R 中实现这一点?

标签: rfunctionnormalization

解决方案


实际上,您可以只转换子集。

FUN <- function(x, lower, upper, ...) {
  normalize <- function(x, ...) (x - min(x, ...))/(max(x, ...) - min(x, ...))
  x[x < lower] <- normalize(x[x < lower], ...)
  x[x > upper] <- 1 - normalize(x[x > upper], ...)
  x[x >= lower & x <= upper] <- 1 
  return(x)
}

lower <- 6.5; upper <- 7.5
value.star <- FUN(value, lower, upper, na.rm=TRUE)

plot(value, value.star, pch=20)
abline(v=c(lower, upper), lty=2)

在此处输入图像描述


数据

set.seed(123)
value <- runif(2.5e2, min=3, max=8.5)

推荐阅读