在进行fisher线性分类面学习时 设计一个很简单的操作 即对两类样本求类内平均值。方法很简单 用一个min向量存储每个元素的和再除以元素个数即可。但即使这么简单的操作 却出现了问题
dataset_negative np.array([35, 21.5, 39, 21.7, 34, 16, 37, 17]) dataset_negative dataset_negative.reshape(4, 2) mean_negative np.array([0,0]) for i in range(0, len(dataset_negative)): mean_negative[0] mean_negative[0] dataset_negative[i][0] mean_negative[1] mean_negative[1] dataset_negative[i][1] mean_negative mean_negative / len(dataset_negative) print(mean_negative)
结果 [36.25 18.75]
跟手算的结果不一样 应该是36.25 19.05.
对过程进行单步调试发现 mean_negative在遇到小数时计算出错 只要了计算结果中的整数部分。
这是由于 mean_negative向量初始化时设成了整数 而int32在与float做计算时会自动“吃掉”小数部分 造成运算结果的错误。可以发现在下面这个例子当中 运算结果均丢掉了小数部分。
a np.array([3, 3, 3, 3, 3, 3]) for i in range(0, 3): a[i] 0.8 for i in range(3, len(a)): a[i] 1.2 print(a)
结果 [3 3 3 4 4 4]
解决方法很简单 将mean-negative初始化为0.0 0.0即可。或者在np.array的括号当中加入dtype ‘float64’.
mean_negative np.array([0, 0], dtype float64 )
结果 [36.25 19.05] 结果正确。



