数据预处理:归一化

由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行归一化处理。

那就是将该样本(样本集中第i行数据)归一到范围(0,1)之间。

一种简单而快速的标准归一化处理算法是线性转换算法,最为常见的是如下形式:

假设x为样本,y归一化后数据,则有
y=(x-min)/(max-min)

因此如果一个样本集S=[x1,x2,…,xi,…,xn],i=(1,2,…,n)。
即该样本集共有n个样本,其中每个样本都是这样的数据:
xi=[x(i,1), x(i,2), …, x(i,j), …, x(i,m)],j=(1,2,…,m)。
即每个样本都由m个数据构成。

因此对于该样本集的归一化处理应该是这样的:
遍历该样本集, yi = ( xi -min(xi) )/( max(xi) -min(xi))
由于数组的加和乘运算符均为拼接符号,因此需要将其转换为矩阵数组,利用矩阵的基本运算。
即:numpy.array()

代码如下:

import numpy as np;
a=np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7]]);

def MNMX(arr):
    arr=np.array(arr); #将输入样本集转换为矩阵,以便做矩阵基本运算
    mnmx=[];
    for i in range(len(arr)):
        maxi,mini=max(arr[i]),min(arr[i]);  #得到第i行数据(即第i个样本)的最大值和最小值
        temp=(arr[i]-mini)/(maxi-mini);  #将该样本数据进行归一化处理
        mnmx.append(temp.tolist());  #预处理后数据增添到新数组中
    mnmx=np.array(mnmx);
    return mnmx;

print(MNMX(a));

结果如下:

#a=
[[1 2 3 4]
 [2 3 4 5]
 [3 4 5 6]
 [4 5 6 7]]

#print
[[0.         0.33333333 0.66666667 1.        ]
 [0.         0.33333333 0.66666667 1.        ]
 [0.         0.33333333 0.66666667 1.        ]
 [0.         0.33333333 0.66666667 1.        ]]

你可能感兴趣的:(分类器,机器学习)