机器学习中训练集和测试集归一化(matlab版)

转载自   https://blog.csdn.net/lkj345/article/details/50352385

背景介绍

  1. 归一化后加快了梯度下降求最优解的速度,归一化有可能提高精度。
  2. 训练集和测试集归一化方法相同。
  3. 数据集不小,81*132337,81行表示包含81维属性,132337列表示包含132337条训练数据。
  4. 数据中包含NaN数据。
  5. 使用matlab中的mapminmax函数,归一化到默认的范围[-1 +1]。

  为了方便演示,我们以一个简单的矩阵来说明归一化。

                                          
 这是3*4的矩阵,表示有4条训练数据,每条数据有3个属性。数据归一化应该针对属性,而不是针对每条数据,针对每条数据是完全没有意义的,因为只是等比例缩放,对之后的分类没有任何作用。

 针对属性进行归一化的代码

inst = [1 2 3 4; 2 3 4 5; 3 4 5 6];
inst_norm = mapminmax(inst);

 得到的归一化矩阵如下

                         


 针对数据进行归一化的代码

inst = [1 2 3 4; 2 3 4 5; 3 4 5 6];
inst_norm = mapminmax(inst')';

 得到的归一化矩阵如下

                                            
 我们应该采用第一种归一化方法,即对属性进行归一化。
 训练集和测试集归一化的方法应该相同。
 网上有一些说法,觉得训练集和测试集应该放到一起进行归一化,我觉得这种做法有所不妥,这样会让测试集受到训练集的影响,导致训练集和测试集不相互独立。
 正确的做法是记录下训练集的归一化方法,用该方法对测试集单独进行归一化,matlab中的mapminmax函数提供了相应的机制。

 对于一条新的数据,应该先按照训练集的归一化方法进行归一化,再进行分类,比如对于如下一条新数据,

                                       
 通过如下代码

inst = [1 2 3 4; 2 3 4 5; 3 4 5 6];
[inst_norm, settings] = mapminmax(inst);
test = [1 3 5]';
test_norm = mapminmax('apply', test, settings);

其中settings记录了训练集的归一化方法,得到以下归一化结果,可以参考矩阵(2)

                                    

mapminmax会跳过NaN数据,最好的方法是归一化之后,将NaN赋值成0。

inst_norm(find(isnan(inst_norm))) = 0;

猜你喜欢

转载自blog.csdn.net/weixin_42296976/article/details/81116299