You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中同时最小化三个变量以找到最优数据点?

问题:寻找三维空间中最接近原点的数据点

我有一个按规则生成的R语言数据集BLH,包含V、q_A、v_h三个变量,需要找到三维坐标系里最接近原点的数据点。此前用which.min(BLH$V^2+BLH$q_A^2+BLH$v_h^2)得到的结果,和car::scatter3d(BLH$V, BLH$v_h, BLH$q_A, surface = F)可视化的最接近原点的点不符,求正确实现方法。

真实数据集生成代码:

B0 <- 1:4999
L0 <- 1:4999
H0 <- 1:4999

BL <- matrix(numeric(), ncol = 2, nrow = 0)
for (L in L0) {
  keep <- B0*L >= 420 & B0*L < 5000
  if (any(keep))
    BL <- rbind(BL, cbind(B0[keep], L))
}

BLH <- matrix(numeric(), ncol = 3, nrow = 0)
for (H in H0) {
  keep <- BL[, 1]*H >= 14 & BL[,1]*BL[,2]*H < 5000
  if (any(keep))
    BLH <- rbind(BLH, cbind(BL[keep, , drop=FALSE], H))
}

rm(BL,B0,H,H0,keep,L,L0) # 删除无用变量

BLH <- as.data.frame(BLH) %>% dplyr::rename(B = 1) %>%
  dplyr::mutate(V = B*L*H, q_A = 2520/(L*B), v_h = 0.7/(H*B)) 

问题原因

三个变量的数值量级差异极大:V是体积,数值范围可达几百甚至上千;而q_A、v_h是小数值(比如零点几)。直接计算欧氏距离平方时,V的权重会远高于另外两个变量,导致最终找到的点只是V最小的点,并非三维空间中真正靠近原点的点。


解决方案:先标准化变量,再计算距离

必须先将三个变量缩放到同一量级,消除数值差异的影响,再计算欧氏距离。常用的标准化方法有两种:

方法1:Z-Score标准化(基于均值和标准差)

将变量转换为均值为0、标准差为1的分布,适合数据近似正态分布的场景:

library(dplyr)

# 对目标变量做Z-Score标准化
BLH_std <- BLH %>%
  mutate(
    V_std = (V - mean(V)) / sd(V),
    q_A_std = (q_A - mean(q_A)) / sd(q_A),
    v_h_std = (v_h - mean(v_h)) / sd(v_h)
  ) %>%
  # 计算标准化后的欧氏距离平方(开根号不影响最小值判断,可省略)
  mutate(dist_sq = V_std^2 + q_A_std^2 + v_h_std^2)

# 找到最接近原点的点
closest_point <- BLH_std %>% slice(which.min(dist_sq))

# 查看结果
print(closest_point)

方法2:最小-最大标准化(缩放到0-1区间)

将变量值映射到[0,1]区间,适合需要固定取值范围的场景:

library(dplyr)

BLH_minmax <- BLH %>%
  mutate(
    V_minmax = (V - min(V)) / (max(V) - min(V)),
    q_A_minmax = (q_A - min(q_A)) / (max(q_A) - min(q_A)),
    v_h_minmax = (v_h - min(v_h)) / (max(v_h) - min(v_h))
  ) %>%
  mutate(dist_sq = V_minmax^2 + q_A_minmax^2 + v_h_minmax^2)

closest_point_minmax <- BLH_minmax %>% slice(which.min(dist_sq))

结果验证

用标准化后的变量可视化,标记找到的点,确认其位置:

library(car)

# 绘制标准化后的三维散点图
scatter3d(BLH_std$V_std, BLH_std$v_h_std, BLH_std$q_A_std, surface = F)
# 标记最接近原点的点(红色实心点)
points(closest_point$V_std, closest_point$v_h_std, closest_point$q_A_std, col = "red", pch = 19, cex = 2)

内容的提问来源于stack exchange,提问作者FlameAA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:25:25