如何基于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
相关产品推荐
相关产品推荐

