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

如何基于TensorFlow构建威布尔分布模型的损失函数?

威布尔分布负对数似然损失函数的TensorFlow实现

首先明确威布尔分布的概率密度函数(PDF):

对于正实数样本 $y$,形状参数 $k>0$、尺度参数 $\lambda>0$ 的威布尔分布PDF为:
$f(y; k, \lambda) = \frac{k}{\lambda} \left( \frac{y}{\lambda} \right)^{k-1} e{-(y/\lambda)k}$

基于PDF推导负对数似然(NLL):
对PDF取自然对数后取负,得到单个样本的负对数似然表达式:
$nll = -\log k + k \cdot \log \lambda - (k-1) \cdot \log y + \left( \frac{y}{\lambda} \right)^k$

TensorFlow实现代码

考虑到实际数据中可能存在$y=0$的情况(会导致$\log y$无意义),需要添加一个极小值$\epsilon$(比如$1e-8$)来避免数值错误:

import tensorflow as tf

def weibull_nll(y_true, k, lam):
    # 避免log(0)的情况,给y_true加极小值
    y_safe = tf.maximum(y_true, 1e-8)
    # 计算各项
    term1 = -tf.math.log(k)
    term2 = k * tf.math.log(lam)
    term3 = -(k - 1) * tf.math.log(y_safe)
    term4 = tf.pow(y_safe / lam, k)
    # 负对数似然
    nll = term1 + term2 + term3 + term4
    # 返回样本的平均损失(也可以返回总和,根据需求调整)
    return tf.reduce_mean(nll)

关键注意点

  • 模型输出需约束参数为正:可以在输出层后用tf.math.exp()转换为正数,或用tf.nn.softplus()(数值稳定性更好,避免指数溢出)。
  • 若模型输出的是参数的对数形式,计算时需先转换为原始参数(例如k = tf.math.exp(model_k_output))。

内容的提问来源于stack exchange,提问作者Uri Kauffmann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:27:16