求解公式c=(a^x)/(a^x+b^x)中最小化逐行误差的未知指数x
求解方法
你这个公式可以直接做代数变形得到x的解析解,根本不需要用迭代优化,逐行算就行,结果能让所有行的预测误差为0,自然满足误差总和最小的要求。
原公式:c = (a^x) / (a^x + b^x)
变形过程:
- 两边乘分母展开:
c*a^x + c*b^x = a^x - 把含a^x的项移到同一边合并:
c*b^x = a^x*(1-c) - 两边取自然对数去掉指数:
log(c) + x*log(b) = log(1-c) + x*log(a) - 把含x的项单独整理到一侧,最终得到:
x = (log(c) - log(1 - c)) / (log(a) - log(b))
代码实现
# 示例数据,加随机种子方便复现结果 set.seed(123) dat <- data.frame(a = runif(5, 1, 100), b = runif(5, 10, 20), c = runif(5, 0, 1)) # 直接逐行计算x dat$x <- with(dat, (log(c) - log(1 - c)) / (log(a) - log(b))) # 回算验证误差 dat$c_pred <- with(dat, (a^x)/(a^x + b^x)) dat$residual <- dat$c_pred - dat$c
运行后查看residual列,所有值都为0(受计算机浮点计算精度影响可能出现1e-16级别的极微小误差,属于正常情况),已经达到理论最小误差。
边界情况处理
如果你的数据里存在c=0或者c=1的样本,直接代入公式会算出无穷大,这种情况先把c做极小截断即可,比如把0替换成1e-6,1替换成1-1e-6再计算。
内容的提问来源于stack exchange,提问作者Arduan
相关产品推荐
相关产品推荐

