早上来图书馆发现昨天的数据有问题,就是正规化之后的数据有一列一直是NaN,然后查找原因。
我从网上找了个去掉带NaN的行的函数,把含有NaN的行全部去掉:
function [X] = removeNaNRows(X)
X(any(isnan(X),2),:) = [];
end
然后将norm_1载入进来,在剔除带NaN的行,果然全都美没有了,说明确实有一列全都是NaN。
接
着我把train_1载入进来,whos一下一共20000行数据,然后在进行踢出NaN的行,然后再whos发现一点都没有边,还是20000行,说明
数据中并没有NaN。在原始数据中是有NULL的,这很奇怪,也许是Matlab在输入的时候将NULL替换成固定值或者均值了,具体还要在查查,反正
train_1是没有NaN的,而norm_1是从train_1正规化得来的,所以出现的NaN应该是正规化的时候出的问题。然后我就将mu和
sigma查看了一下,看有没有NaN:
octave> find(isnan(mu))
octave> find(isnan(sigma))
都没有NaN的值,然后我就怀疑可能是因为除以零带来的NaN。结果果然是类似的问题,我将NaN的位置跟mu,和sigma的位置进行了对比:
octave> find(isnan(norm_1(1, :)))
ans =
31 32 33 35 36 669 691 692 693 727 755
octave> find(mu == 0)
ans =
31 32 33 35 36 669 691 692 693
octave> find(sigma == 0)
ans =
31 32 33 35 36 669 691 692 693 727 755
然
后就明白了,原来是因为在正规化的时候,当分子分母同时为零的时候结果就是NaN,于是31 32 33 35 36
669 691 692 693这几列数据值都是0,所以均值/方差就是0/0, 而剩下的727
755这两列是所有数据都是某个非零常值,然后均值/方差还是0/0,就得到了NaN。这样来看,理想中这部分数据应该置零,然后我就直接把以前带NaN
的正规化结果中的所有NaN都置零了:
octave> clear all; load("norm_1.mat"); norm_1(isnan(norm_1)) = 0; save("norm_1.mat", "norm_1");
octave> clear all; load("norm_2.mat"); norm_2(isnan(norm_2)) = 0; save("norm_2.mat", "norm_2");
octave> clear all; load("norm_3.mat"); norm_3(isnan(norm_3)) = 0; save("norm_3.mat", "norm_3");
octave> clear all; load("norm_4.mat"); norm_4(isnan(norm_4)) = 0; save("norm_4.mat", "norm_4");
octave> clear all; load("norm_5.mat"); norm_5(isnan(norm_5)) = 0; save("norm_5.mat", "norm_5");
octave> clear all; load("norm_6.mat"); norm_6(isnan(norm_6)) = 0; save("norm_6.mat", "norm_6");
如果没有进一步问题的话,下午就开始写训练部分的代码了。还没想好用什么算法。
浙公网安备 33010602011771号