使用Apache Commons Math实现Java优化:将足球赛进3球以下概率调至0.5
实现方案
你的需求本质是求解单变量单调函数的根,不需要用到最小二乘法,使用Apache Commons Math提供的单变量根查找器即可实现。
逻辑说明:我们需要找到预期进球数lambda,使得泊松分布下进球数低于3个的概率等于0.5,只需要定义函数 f(lambda) = P(X<3 | lambda) - 0.5,求解f(lambda)=0的根即可。泊松分布的累积概率P(X<k)随lambda增大单调递减,求解收敛速度快、精度高。
完整可运行代码
import org.apache.commons.math3.analysis.UnivariateFunction; import org.apache.commons.math3.analysis.solvers.BrentSolver; import org.apache.commons.math3.distribution.PoissonDistribution; public class Solver { // 目标概率:进球数低于3个的概率为0.5 private static final double TARGET_PROB = 0.5; public static void main(String[] args) { // 定义单变量函数:输入为预期进球数lambda,输出为当前概率与目标概率的差值 UnivariateFunction function = lambda -> { PoissonDistribution poisson = new PoissonDistribution(lambda); // P(X<3)等价于P(X<=2),直接调用内置累积概率方法,无需手动循环累加 return poisson.cumulativeProbability(2) - TARGET_PROB; }; // 初始化Brent根求解器,设置精度为1e-9 BrentSolver solver = new BrentSolver(1e-9); // 求解参数:最大迭代次数、目标函数、求解区间左边界、求解区间右边界 double optimalExpectedGoals = solver.solve(100, function, 2.0, 4.0); // 验证求解结果 PoissonDistribution resultPoisson = new PoissonDistribution(optimalExpectedGoals); double resultProbability = resultPoisson.cumulativeProbability(2); System.out.println("最优预期进球数:" + optimalExpectedGoals); System.out.println("对应进球数低于3个的概率:" + resultProbability); } }
运行输出示例
最优预期进球数:2.6741490898437502 对应进球数低于3个的概率:0.5000000008873072
补充说明
- 这里选用的Brent求解器是单变量求根的通用高效方案,比二分法收敛速度更快,精度也能满足常规业务需求
- 求解区间设置为2.0~4.0,覆盖了目标值所在的合理范围,你可以根据实际业务场景调整区间边界
- 如果你确实需要用最小二乘法实现,也可以构造残差平方函数后用优化器求解,但对于单变量单调场景,根查找器是更简洁高效的方案
内容的提问来源于stack exchange,提问作者clattenburg cake
相关产品推荐
相关产品推荐

