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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:09:03