在进行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],结果正确。