如何在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
相关产品推荐
相关产品推荐

