由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行归一化处理。
那就是将该样本(样本集中第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. ]]