如何基于Math.NET的多元回归计算指定百分位数的预测值?
多元回归中计算指定百分位数的预测值
要在现有多元回归逻辑基础上得到指定百分位数的预测值,核心思路是通过残差的百分位数调整回归的均值预测值,具体步骤和修改后的代码如下:
关键逻辑说明
- 计算回归拟合残差:先对训练数据集的每个样本用回归模型计算预测值,再用实际y值减去预测值得到残差——残差反映了模型预测与实际值的偏差分布。
- 统计残差的百分位数:用Math.NET的
Percentile.Quantile方法计算残差的25%、75%分位数,这些分位数代表偏差分布的对应位置。 - 生成百分位预测值:对新输入计算回归的均值预测值后,加上对应残差的百分位数,即可得到该百分位对应的预测结果。
修改后的完整代码
using MathNet.Numerics; using MathNet.Numerics.Statistics; using System.Collections.Generic; using System.Linq; namespace Project { public class Program { public static void Main(string[] args) { // 训练数据集 var xPoints = new List<List<double>> { new List<double> {2000, 100}, new List<double> {2002, 60}, new List<double> {2004, 50}, new List<double> {2006, 30}, }; var yPoints = new List<double> { 50, 60, 70, 80 }; // 执行多元线性回归 var xArray = xPoints.Select(item => item.ToArray()).ToArray(); var multiFit = Fit.MultiDim(xArray, yPoints.ToArray(), intercept: true); // -------------------------- 新增逻辑:计算残差与百分位数 -------------------------- // 计算每个训练样本的预测y值 var predictedYList = xArray.Select(x => multiFit[0] + x[0] * multiFit[1] + x[1] * multiFit[2]).ToList(); // 计算残差(实际值 - 预测值) var residuals = yPoints.Zip(predictedYList, (actual, predicted) => actual - predicted).ToArray(); // 计算残差的25%和75%百分位数 var residual25Percentile = Percentile.Quantile(residuals, 0.25); var residual75Percentile = Percentile.Quantile(residuals, 0.75); // -------------------------- 计算新输入的百分位预测值 -------------------------- var inputDimension1 = 2003; var inputDimension2 = 55; // 基础均值预测值 var meanPredictedY = multiFit[0] + inputDimension1 * multiFit[1] + inputDimension2 * multiFit[2]; // 25%分位数对应的预测值 var predictedY25 = meanPredictedY + residual25Percentile; // 75%分位数对应的预测值 var predictedY75 = meanPredictedY + residual75Percentile; } } }
补充说明
- 这里采用非参数方法,直接基于训练数据的残差分布计算百分位,无需假设残差服从特定分布(比如正态分布),适合小样本场景。
- 若数据集较大,也可假设残差服从正态分布,通过残差标准差结合正态分布分位数(如25%对应-0.674σ、75%对应0.674σ)调整预测值,但非参数方法更直观且无需额外假设。
内容的提问来源于stack exchange,提问作者Marin Petkov
相关产品推荐
相关产品推荐

