如何创建最佳函数更好?
How to create a function for optimum is better?
我想为“最优更好”的关系创建一个函数,如下图所示
我可以为“越多越好”和“越少越好”创建函数,例如
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 中实现这一点?
此函数以输出始终介于 0 和 1 之间的方式对 value
进行归一化。它 returns 恰好为 1,前提是该值在最佳范围 [a,b] 内。它 returns 最小最大缩放 iff 值 < a(“越高越好”)并且 1 - 最小-最大缩放它大于 b(“越低越好”)
library(tidyverse)
normalize <- function(value, a = 6.5, b = 7.5) {
min_max_scaled <- (value - min(value)) / max(value)
case_when(
# before the range
value < a ~ min_max_scaled,
# within the range
value >= a & value <= b ~ 1,
# beyoned the range
value > b ~ 1 - min_max_scaled
)
}
实际上你可以只转换子集。
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)
我想为“最优更好”的关系创建一个函数,如下图所示
我可以为“越多越好”和“越少越好”创建函数,例如
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 中实现这一点?
此函数以输出始终介于 0 和 1 之间的方式对 value
进行归一化。它 returns 恰好为 1,前提是该值在最佳范围 [a,b] 内。它 returns 最小最大缩放 iff 值 < a(“越高越好”)并且 1 - 最小-最大缩放它大于 b(“越低越好”)
library(tidyverse)
normalize <- function(value, a = 6.5, b = 7.5) {
min_max_scaled <- (value - min(value)) / max(value)
case_when(
# before the range
value < a ~ min_max_scaled,
# within the range
value >= a & value <= b ~ 1,
# beyoned the range
value > b ~ 1 - min_max_scaled
)
}
实际上你可以只转换子集。
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)