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

运行FRNN-OWA集成标签预测代码时触发RuntimeWarning: true_divide存在无效值的技术求助

解决RuntimeWarning: invalid value encountered in true_divide的方案

这个警告的根源很明确:你在计算distances时的除法运算中出现了分母为0的情况,具体来说就是np.linalg.norm(X, axis=1)(测试数据向量的范数)或者self.X_T_norm(训练数据向量的范数)里存在0值——全零向量的L2范数就是0,直接用来做除法就会触发这个警告,甚至可能导致后续计算出现NaN或无穷大值。

下面给你两个直接可行的解决思路,按优先级推荐:

1. 从数据源头处理:过滤/修正全零向量

这是最根本的解决方案,先检查你的训练和测试数据里有没有全零向量,毕竟正常的Word2Vec向量(你用的是Vector_d2v)不应该出现全零的情况,大概率是数据预处理环节出了问题。

你可以在调用test_ensemble_labels之前,先清理数据:

import numpy as np

# 处理训练数据:过滤掉范数接近0的向量(考虑浮点误差,不用严格等于0)
train_norms = np.linalg.norm(data, axis=1)
# 用1e-10作为阈值,避免浮点精度导致的误判
valid_train_mask = train_norms > 1e-10
clean_train_data = data[valid_train_mask]
clean_y = data['Label'][valid_train_mask]

# 处理测试数据:如果有全零向量,要么过滤,要么替换为极小值向量
test_norms = np.linalg.norm(test_data, axis=1)
valid_test_mask = test_norms > 1e-10
clean_test_data = test_data.copy()
# 对全零测试向量,替换为每个维度都是1e-10的向量,避免后续除法出错
clean_test_data[~valid_test_mask] = 1e-10

# 用清理后的数据调用函数
predicted_labels = test_ensemble_labels(clean_train_data, clean_y, clean_test_data, ["Vector_d2v"], [19], additive(), additive())

2. 在计算逻辑中添加保护:避免除以零

如果暂时无法修改数据流程,也可以直接在_query函数的计算里给分母加一个极小的正数(比如1e-10),这样即使范数为0,也不会触发除以零的错误:

def _query(self, X, m_int: int):
    # 给范数添加极小值,避免零分母
    X_norm = np.linalg.norm(X, axis=1)[:, None] + 1e-10
    self_X_T_norm = self.X_T_norm + 1e-10
    distances = 1 - 0.5 * X @ self.X_T / X_norm / self_X_T_norm
    return least_indices_and_values(distances, m_int, axis=-1)

这里的1e-10足够小,几乎不会影响距离计算的结果,但能彻底解决除以零的警告。

额外提醒

建议你先排查下为什么会出现全零向量:比如是不是Word2Vec训练时出现了未登录词,导致生成了全零向量?或者数据预处理时误将某些样本的特征置为0了?从源头解决问题能避免后续更多潜在的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:54:05