def read_and_normalize_train_data():
train_data, train_label = load_train()
print('Convert to numpy...')
train_data = np.array(train_data, dtype=np.uint8) # now np.amax(train_data)=255
print('Convert to float...')
train_data = train_data.astype('float32')
train_data = train_data / 255
train_target = np_utils.to_categorical(train_target, N_CLASSES)
print('Train shape:', train_data.shape)
print(train_data.shape[0], 'train samples')
return train_data, train_label
将特征缩放至特定区间 将特征缩放到给定的最小值和最大值之间,或者也可以将每个特征的最大绝对值转换至单位大小。这种方法是对原始数据的线性变换,将数据归一到[0,1]中间。转换函数为:
x = x − min max − min x = \frac{x-\min}{\max-\min} x=max−minx−min
这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。对于outlier非常敏感,因为outlier影响了max或min值,所以这种方法只适用于数据在一个范围内分布的情况。
无法消除量纲对方差、协方差的影响。
def minmaxscaler(data):
min = np.amin(data)
max = np.amax(data)
return (data - min)/(max-min)
在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。
def feature_normalize(data):
mu = np.mean(data,axis=0)
std = np.std(data,axis=0)
return (data - mu)/std
pytorch框架下的函数 :
import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose(
[transforms.ToTensor(), # 函数接受PIL Image或numpy.ndarray,将其先由HWC转置为CHW格式,再转为float后每个像素除以255.
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
# get some random training images
dataiter = iter(trainloader)
images, labels = dataiter.next()
上例均值和标准差都是0.5
注意:torchvision.transforms.ToTensor() 函数接受PIL Image或numpy.ndarray,将其先由HWC转置为CHW格式,再转为float后每个像素除以255.
def unnormalized_show(img):
img = img * std + mu # unnormalize
npimg = img.numpy()
plt.figure()
plt.imshow(np.transpose(npimg, (1, 2, 0)))