5维向量误差百分比计算方法的数学正确性确认
代码问题与数学合理性分析
首先说你的代码逻辑bug
你写的函数里有个致命问题:循环里的difs每次都被新的单个样本的相对误差覆盖了,根本没累加所有样本的误差。最后算出来的acc只是最后一个样本的相对误差除以样本数,完全不是你想要的平均误差。
改法很简单,把循环里的赋值改成累加:
difs += abs(np.linalg.norm(y_true[i])-np.linalg.norm(y_pred[i]))/(np.linalg.norm(y_true[i]))
另外最好加个判断,避免真实向量模长为0时除以0的情况。
再讲数学上的合理性
假设修正代码后,你算的是每个向量模长相对误差的平均值,这个方法对不对要看你想衡量什么:
- 如果你的目标就是看预测向量的长度准不准,那这个方法没问题,能直接反映长度的平均偏差比例。
- 但如果你想衡量整个向量(包括方向)的预测准确性,那这个方法就不靠谱了:
- 比如真实向量是
[1,0,0,0,0],预测向量是[-1,0,0,0,0],两者模长一样,按你的方法误差为0,但实际上向量方向完全相反,预测根本不对。 - 这种情况更适合用余弦相似度(测方向一致度)、向量欧氏距离的相对误差,或者每个维度的相对误差平均值来衡量。
- 比如真实向量是
给你个修正后的参考代码:
import numpy as np def accuracy_fn(y_true, y_pred): total_rel_error = 0.0 sample_count = len(y_true) for true_vec, pred_vec in zip(y_true, y_pred): true_norm = np.linalg.norm(true_vec) # 跳过模长为0的真实向量,避免除以0 if true_norm == 0: sample_count -= 1 continue rel_error = abs(true_norm - np.linalg.norm(pred_vec)) / true_norm total_rel_error += rel_error # 返回平均相对误差(乘以100就是百分比形式) return total_rel_error / sample_count * 100 if sample_count > 0 else 0.0
内容的提问来源于stack exchange,提问作者Holy_Radiation
相关产品推荐
相关产品推荐

