白化:是一个比PCA稍微高级一点的算法。白化的目的就是去除输入数据中的冗余信息,假设训练数据是图像,由于图像中相邻的像素之间有很强的相关性,所以用于训练时输入是冗余的,白化的目的就是降低输入的冗余性。
其实从高光谱遥感影像的角度上,可能是可以一试的预处理。
输入数据集X,经过白化之后:
1.特征之间相关性较低。
2.所有特征具有相同的方差。
PCA作为降维算法,一般通过求出原数据的特征向量,再把原数据映射到特征向量空间内,实现了特征之间的低相关性。实现白化的第一步就是PCA,求出新特征空间中的X的坐标,在对新坐标进行方差归一化操作。
举个例子:
白化之后:
代码:
import matplotlib.pyplot as plt
import glob
from PIL import Image
from keras.preprocessing import image
import numpy as np
path = 'train/'
gen_path = 'result/'
def print_result(path):
name_list = glob.glob(path)
fig = plt.figure()
for i in range(9):
img = Image.open(name_list[i])
# add_subplot(331) 参数一:子图总行数,参数二:子图总列数,参数三:子图位置
sub_img = fig.add_subplot(331 + i)
sub_img.imshow(img)
plt.show()
return fig
datagen = image.ImageDataGenerator(zca_whitening=True)
gen = image.ImageDataGenerator()
data = gen.flow_from_directory(path, batch_size=1, class_mode=None, shuffle=True, target_size=(36, 36))
np_data = np.concatenate([data.next() for i in range(1)])
datagen.fit(np_data)
gen_data = datagen.flow_from_directory(path, batch_size=1, shuffle=False, save_to_dir=gen_path + '3', save_prefix='gen',
target_size=(36, 36))
for i in range(9):
gen_data.next()
fig = print_result(gen_path + '3/*')
fig.savefig(gen_path + '3/zcawhtening.png', dpi=200)