2014.2.14 - 贷款预测第三天

Posted on 2014-02-18 16:58  SnakeHunt2012  阅读(160)  评论(0)    收藏  举报

早上来图书馆发现昨天的数据有问题,就是正规化之后的数据有一列一直是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");

如果没有进一步问题的话,下午就开始写训练部分的代码了。还没想好用什么算法。