多维度数据的归一化代码
在神经网络分析时,需要对多维度的信息进行归一化,下面的python代码实现了此功能,并且实现了反向归一化。过程中使用了numpy库。此归一化仅仅将数据全部压缩在(0,1)区间之内。使用者可以根据实际情况修改
import numpy as np
def normalize(array:np.ndarray,ax:int = 0):
""" normalize the matrix to (0,1), r.s.t A axis (Default=0)
return normalized matrix and a record matrix for normalize back
"""
arraySize=array.shape
remianDimHors=int(np.prod(arraySize)/arraySize[ax])
indexTranspose=list(range(len(arraySize)))
indexTranspose[0],indexTranspose[ax]=indexTranspose[ax],indexTranspose[0]
arrayTranspose=array.transpose(tuple(indexTranspose))
sizeTranspose=arrayTranspose.shape
arrayReshape=arrayTranspose.reshape(arraySize[ax],remianDimHors)
normalizeFactor=np.zeros((2,remianDimHors))
for i in range(remianDimHors):
adjustData=arrayReshape[:,i]
minValue=min(adjustData)
maxValue=max(adjustData)
arrayReshape[:,i]=(adjustData-minValue)/(maxValue-minValue)
normalizeFactor[0,i]=minValue
normalizeFactor[1,i]=maxValue
arrayReshapeBack=arrayReshape.reshape(sizeTranspose)
normalizeBackShape=list(sizeTranspose);normalizeBackShape[0]=2
normalizeFactor=normalizeFactor.reshape(normalizeBackShape)
arrayFinal=arrayReshapeBack.transpose(indexTranspose)
normalizeFactor=normalizeFactor.transpose(indexTranspose)
return arrayFinal,normalizeFactor
def normalizeBack(arrayNormalized:np.ndarray,normalizeFactor:np.ndarray):
""" normalize back the normalizedArray to what original is it
input: arrayNormalized, recordMaxtrix
"""
sizeArrayNormalized=arrayNormalized.shape
sizeNormalizeFactor=normalizeFactor.shape
normalizeAx=0
for i in range(len(sizeNormalizeFactor)):
if sizeNormalizeFactor[i] != sizeArrayNormalized[i]:
normalizeAx=i
remianDimHors=int(np.prod(sizeArrayNormalized)/sizeArrayNormalized[normalizeAx])
indexTranspose=list(range(len(sizeArrayNormalized)))
indexTranspose[0],indexTranspose[normalizeAx]=indexTranspose[normalizeAx],indexTranspose[0]
arrayTranspose=arrayNormalized.transpose(tuple(indexTranspose))
normalizeFactorTranspose=normalizeFactor.transpose(tuple(indexTranspose))
sizeTranspose=arrayTranspose.shape
arrayReshape=arrayTranspose.reshape(sizeArrayNormalized[normalizeAx],remianDimHors)
normalizeFactorReshape=normalizeFactorTranspose.reshape(sizeNormalizeFactor[normalizeAx],remianDimHors)
for i in range(remianDimHors):
adjustData=arrayReshape[:,i]
maxValue=normalizeFactorReshape[1,i]
minValue=normalizeFactorReshape[0,i]
arrayReshape[:,i]=adjustData*(maxValue-minValue)+minValue
arrayReshapeBack=arrayReshape.reshape(sizeTranspose)
arrayFinal=arrayReshapeBack.transpose(indexTranspose)
return arrayFinal
# testArray=np.linspace(1,20,5)
# testArray=np.expand_dims(testArray,1).repeat(3,axis=1)
# testArray[:,1] = np.sqrt(testArray[:,1])
# testArray[:,2] = np.sqrt(testArray[:,2])+5
# testArray=np.expand_dims(testArray,2).repeat(3,axis=2)
# testArray[:,:,1] = np.sqrt(testArray[:,:,1])
# testArray[:,:,2] = np.sqrt(testArray[:,:,2])+5
# print(testArray[1,:,:])
# print("----------------")
# (array,factor)=normalize(testArray,2)
# print(array[1,:,:])
# print("----------------")
# print(factor[1,:,:])
# print("----------------")
# print("Bacccccccck!")
# or_array=normalizeBack(array,factor)
# print(or_array[1,:,:])
代码为本人原创,转载需要注明出处