运行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
相关产品推荐
相关产品推荐

