数据预处理-归一化
归一化是指一种简化计算的方式,将数据经过处理之后限定到一定范围之内,如数据较大,可通过归一化计算后,将数据限定在[0,1]内。数据归一化可加速算法的快速收敛,而且在后续数据处理上更加方便。
数学公式为y=(x-minValue)/(maxValue-minValue),maxValue、minValue、x、y分别代表每一个字段的最大值、最小值、字段值和最终归一化结果,例:[3,4,5,6,7],归一化后的结果为[0,1/4,1/2,3/4,1]。
def uniformData(dataMat): ''' :param dataMat:原始数据 :return: dataMat处理后的数据 ''' col=0 for i in dataMat[0]:#取矩阵第一行,求出列数 col+=1 rol=len(dataMat) #矩阵的行数 maxNum=[0]*col #设定最大值均为0 minNum=[9999999999]*col #设定最小值均为9999999999 for i in dataMat:#求每列的最大值 for j in range(0,col): if i[j]>maxNum[j]: maxNum[j]=i[j] for i in dataMat:#求每列的最小值 for j in range(0,col): if i[j]<minNum[j]: minNum[j]=i[j] #section=list(map(lambda x:x[0]-x[1],zip(maxNum,minNum))) 不好理解,用换成下面写法 section=list(map(lambda x,y:x-y,maxNum,minNum))#最大最小值差 sample=[] for i in dataMat: sample.append(list(map(lambda x,y,z:(x-y)/z,i,minNum,section))) #利用公式计算最终的值 return sample #测试数据 data=[[63,145,233,150,2.3,0],\ [67,160,286,108,1.5,3],\ [67,120,229,129,2.6,2],\ [37,130,250,187,3.5,0],\ [41,130,204,172,1.4,0],\ [56,120,236,178,0.8,0],\ [62,140,268,160,3.6,2],\ [57,120,354,163,0.6,0],\ [63,130,254,147,1.4,1]] for i in uniformData(data): print(i)
测试结果:
E:\Anaconda3\python.exe E:/归一化.py [0.8666666666666667, 0.625, 0.19333333333333333, 0.5316455696202531, 0.5666666666666665, 0.0] [1.0, 1.0, 0.5466666666666666, 0.0, 0.3, 1.0] [1.0, 0.0, 0.16666666666666666, 0.26582278481012656, 0.6666666666666666, 0.6666666666666666] [0.0, 0.25, 0.30666666666666664, 1.0, 0.9666666666666667, 0.0] [0.13333333333333333, 0.25, 0.0, 0.810126582278481, 0.26666666666666666, 0.0] [0.6333333333333333, 0.0, 0.21333333333333335, 0.8860759493670886, 0.0666666666666667, 0.0] [0.8333333333333334, 0.5, 0.4266666666666667, 0.6582278481012658, 1.0, 0.6666666666666666] [0.6666666666666666, 0.0, 1.0, 0.6962025316455697, 0.0, 0.0] [0.8666666666666667, 0.25, 0.3333333333333333, 0.4936708860759494, 0.26666666666666666, 0.3333333333333333] 进程已结束,退出代码 0