如何用R语言量化评估三次曲线的相似性(含镜像关系)
用R语言量化三次函数曲线的相似性(含镜像反转场景)
方法1:基于采样点的相关性分析
先在缓冲距离的有效范围内生成一批采样点,算出每个模型的预测值,然后同时计算原始曲线和镜像反转曲线(预测值乘-1)的相关系数,取最大值作为相似性指标——相关系数越接近1,曲线(或其镜像)的趋势越一致。
# 假设已经有三个拟合好的三次模型:model1、model2、model3 # 生成缓冲距离采样序列,这里取0到10之间的100个点 buffer_seq <- seq(0, 10, length.out = 100) # 得到每个模型的预测值 pred1 <- predict(model1, newdata = data.frame(buffer = buffer_seq)) pred2 <- predict(model2, newdata = data.frame(buffer = buffer_seq)) pred3 <- predict(model3, newdata = data.frame(buffer = buffer_seq)) # 自定义计算相似性的函数:取原始和镜像的最大相关系数 calc_similarity <- function(x, y) { corr_original <- cor(x, y) corr_mirror <- cor(x, -y) max(corr_original, corr_mirror) } # 计算两两模型的相似性 sim_12 <- calc_similarity(pred1, pred2) sim_13 <- calc_similarity(pred1, pred3) sim_23 <- calc_similarity(pred2, pred3) # 输出结果 cat("模型1与2的相似性:", sim_12, "\n") cat("模型1与3的相似性:", sim_13, "\n") cat("模型2与3的相似性:", sim_23, "\n")
方法2:基于归一化系数的余弦相似度
三次函数的形式是y = a*x³ + b*x² + c*x + d,先对系数做归一化(除以系数的L2范数),再计算原始系数或镜像系数(所有系数乘-1)的余弦相似度,取最大值。这种方法直接从函数本质出发,适合评估曲线的形态一致性。
# 提取模型系数(假设用lm拟合,公式为lm(y ~ poly(buffer, 3, raw=TRUE))) coef1 <- coef(model1) coef2 <- coef(model2) coef3 <- coef(model3) # 归一化函数:将系数向量缩放到单位长度 normalize <- function(vec) { vec / sqrt(sum(vec^2)) } # 计算余弦相似度,同时考虑镜像情况 cos_sim <- function(coef_a, coef_b) { norm_a <- normalize(coef_a) norm_b <- normalize(coef_b) sim_original <- sum(norm_a * norm_b) sim_mirror <- sum(norm_a * (-norm_b)) max(sim_original, sim_mirror) } # 计算两两模型的系数相似性 sim_coef_12 <- cos_sim(coef1, coef2) sim_coef_13 <- cos_sim(coef1, coef3) sim_coef_23 <- cos_sim(coef2, coef3) # 输出结果 cat("系数层面模型1与2的相似性:", sim_coef_12, "\n") cat("系数层面模型1与3的相似性:", sim_coef_13, "\n") cat("系数层面模型2与3的相似性:", sim_coef_23, "\n")
注:如果常数项d不影响曲线趋势,可以去掉后再计算,根据你的业务需求调整。
方法3:动态时间规整(DTW)
如果曲线存在轻微的偏移或采样不均,DTW能自动对齐序列并计算相似性,同样支持镜像反转的场景。返回的相似性值越接近1,曲线(或镜像)的形态越相似。
# 先安装并加载dtw包 # install.packages("dtw") library(dtw) # 自定义DTW相似性计算函数:取原始和镜像的最小距离,再归一化 dtw_similarity <- function(x, y) { dtw_original <- dtw(x, y)$distance dtw_mirror <- dtw(x, -y)$distance # 距离越小越相似,用1/(1+最小距离)将结果映射到0-1区间 1 / (1 + min(dtw_original, dtw_mirror)) } # 计算两两模型的DTW相似性 sim_dtw_12 <- dtw_similarity(pred1, pred2) sim_dtw_13 <- dtw_similarity(pred1, pred3) sim_dtw_23 <- dtw_similarity(pred2, pred3) # 输出结果 cat("DTW模型1与2的相似性:", sim_dtw_12, "\n") cat("DTW模型1与3的相似性:", sim_dtw_13, "\n") cat("DTW模型2与3的相似性:", sim_dtw_23, "\n")
内容的提问来源于stack exchange,提问作者Wei Liao
相关产品推荐
相关产品推荐

