matlab没有算出来数显示inf,计算对数似然(MATLAB)时避免使用-inf

本文探讨了在MATLAB中计算Log似然性时遇到的数值稳定性问题,特别是当标准平方误差较大时导致exp()结果为零的情况。提供了一种数学技巧来解决这一问题,并详细解释了解决方案的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

When using MATLAB to calculate

Log_likelihood=log((1/1e8)*exp(-0.5*SSR)),

if SSR (i.e. standard squared error) is large (e.g. SSR=1e4) then the exp() becomes zero and the Log_likelihood becomes -inf.

Is there any numerical/mathematical trick that can handle this problem?

Thank You

解决方案

Assuming your log is a natural logarithm:

log(a*exp(b)) = log(a) + log(exp(b)) = log(a) + b.

Where a=(1/1e8), b = -0.5*SSR

Moreover, log(1/1e8) = log(1) - log(1e8), so the above turns to be -log(1e8) + b, while the first term is a constant and can be precalculated.

### MATLAB使用值评估非线性维纳模型拟合效果 在MATLAB中,为了评估非线性维纳模型的拟合效果,可以通过计算最大估计(MLE)来进行。这种方法不仅能够提供参的最佳估计值,还能用于比较不同模型之间的优劣。 #### 计算值的基础理论 对于给定的据集 \( \{y_t\}_{t=1}^{T} \),如果已知该据遵循某个概率分布,则可以定义其对应的对数: \[ L(\theta | y_1, ..., y_T) = \sum_{t=1}^{T}\log p(y_t|\theta), \] 其中 \( \theta \) 表示待估参向量,\( p(y_t|\theta) \) 是条件密度函[^2]。 针对非线性维纳过程而言,由于涉及到了复杂的动态特性以及噪声项的存在,通常会采用扩展卡尔曼滤波(EKF)或其他近技术来求解状态方程,并在此基础上构建相应的对数表达式。 #### 实现步骤概述 下面给出一段简单的MATLAB代码片段作为示范,展示如何利用优化工具箱中的`fmincon()` 函最小化负对数目标函从而获得最优参估计,并进一步得到最终的值评价指标。 ```matlab function logLikelihoodValue = evaluateWienerModelFit(data) % 定义初始猜测值和边界约束 initialParams = [0.5; 0.5]; % 初始参设置 lb = zeros(size(initialParams)); ub = ones(size(initialParams)) * Inf; options = optimoptions('fmincon','Display','off'); % 调用 fmincon 进行最大化操作 (注意这里是最小化 -L 即可达到目的) [~,~,exitflag,output,paramsOptimized] = ... fmincon(@(params)-computeLogLikelihood(params,data),... initialParams,[],[],[],[],lb,ub,[],options); if exitflag > 0 disp(['Optimization successful with ' num2str(output.iterations) ' iterations']); % 输出最佳参组合下的对数logLikelihoodValue = computeLogLikelihood(paramsOptimized, data); else error('Failed to converge during optimization.'); end end % 对数的具体形式取决于所选的概率分布假设 function ll = computeLogLikelihood(params, observations) mu = params(1); sigma_sq = exp(params(2)); nObs = length(observations); residuals = observations - wienerProcessPrediction(mu, sigma_sq, nObs); ll = sum(-0.5*log(sigma_sq) - 0.5*(residuals.^2)/sigma_sq); end % 假设有一个预测函可以根据当前参生成期望路径 function pred = wienerProcessPrediction(mu, sigma_sq, steps) dt = 1/steps; dW = sqrt(dt)*randn(steps, 1); W = cumsum([0;dW]); pred = mu .* (0:dt:(steps*dt))' + sqrt(sigma_sq).*W; end ``` 这段代码展示了如何设定一个基础框架,在此之上可根据具体应用场景调整细节部分,比如改变残差结构或是引入更复杂的过程描述方式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值