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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:18:11