代码出处:
GitHub - wangsen1312/joints2smpl: fit smpl parameters model using 3D joints
RuntimeWarning: invalid value encountered in sqrt
你可以通过以下几种方式解决这个问题:
1. 检查负值或零行列式
确保协方差矩阵是正半定的,这意味着其行列式应该是非负的。负或零行列式表示矩阵可能是退化的或者条件不良。
你可以在计算平方根之前进行检查,避免无效值:
python
for idx, c in enumerate(gmm['covars']):det = np.linalg.det(c)if det <= 0:print(f"行列式无效,索引 {idx}: {det}")if 0:sqrdets = np.array([np.sqrt(np.linalg.det(c)) if np.linalg.det(c) > 0 else 0for c in gmm['covars']])epsilon = 1e-6 # 小的常数,用于数值稳定性sqrdets = np.array([np.sqrt(np.linalg.det(c + epsilon * np.eye(c.shape[0]))) # 对角线添加小常数for c in gmm['covars']])
sqrdets = np.array([ np.sqrt(np.linalg.det(c))
if np.linalg.det(c) > 0 else 0
for c in gmm['covars'] ])
这样就确保只有行列式为正的矩阵才会进行平方根计算,若行列式非正,则用0替代。
2. 保证数值稳定性
有时候,由于数值问题,协方差矩阵的行列式可能会非常接近零或略微为负。你可以通过给协方差矩阵的对角线添加一个小的常数来“正则化”矩阵,确保其行列式为正:
epsilon = 1e-6 # 小的常数,用于数值稳定性
sqrdets = np.array([ np.sqrt(np.linalg.det(c + epsilon * np.eye(c.shape[0]))) # 对角线添加小常数
for c in gmm['covars'] ])
3. 调试输出
如果不确定是哪一个协方差矩阵导致的问题,你可以打印出行列式的值,查看哪些矩阵有问题:
python
for idx, c in enumerate(gmm['covars']):det = np.linalg.det(c)if det <= 0:print(f"行列式无效,索引 {idx}: {det}")
