Zan*_*nam 4 pca python-2.7 autoencoder keras
我正在玩一个玩具示例来理解 PCA 与 keras 自动编码器
我有以下用于理解 PCA 的代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
pca = decomposition.PCA(n_components=3)
pca.fit(X)
pca.explained_variance_ratio_
array([ 0.92461621, 0.05301557, 0.01718514])
pca.components_
array([[ 0.36158968, -0.08226889, 0.85657211, 0.35884393],
[ 0.65653988, 0.72971237, -0.1757674 , -0.07470647],
[-0.58099728, 0.59641809, 0.07252408, 0.54906091]])
Run Code Online (Sandbox Code Playgroud)
我已经用 keras 进行了一些阅读和播放代码,包括这个。
但是,参考代码感觉对我的理解水平飞跃太高了。
有人有一个简短的自动编码器代码可以告诉我吗
(1) 如何从自动编码器中提取前 3 个组件
(2) 如何理解自编码器捕获的方差量
(3) 自动编码器组件与 PCA 组件的比较
首先,自动编码器的目标是学习一组数据的表示(编码),通常用于降维。因此,自编码器的目标输出是自编码器输入本身。
在[1]中表明,如果有一个线性隐藏层并且使用均方误差准则来训练网络,那么k隐藏单元学习first k principal components在数据的跨度内投影输入。在 [2] 中,您可以看到,如果隐藏层是非线性的,则自编码器的行为与 PCA 不同,能够捕获输入分布的多模态方面。
自编码器是特定于数据的,这意味着它们只能压缩与训练过的数据类似的数据。因此,隐藏层学习的特征的有用性可用于评估该方法的有效性。
出于这个原因,评估自动编码器在降维方面的功效的一种方法是削减中间隐藏层的输出,并通过这种减少的数据而不是使用原始数据来比较所需算法的准确性/性能。通常,PCA 是一种线性方法,而自编码器通常是非线性的。从数学上讲,很难将它们进行比较,但从直觉上讲,我提供了一个使用 Autoencoder 对 MNIST 数据集进行降维的示例,以便您更好地理解。代码在这里:
from keras.datasets import mnist
from keras.models import Model
from keras.layers import Input, Dense
from keras.utils import np_utils
import numpy as np
num_train = 60000
num_test = 10000
height, width, depth = 28, 28, 1 # MNIST images are 28x28
num_classes = 10 # there are 10 classes (1 per digit)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(num_train, height * width)
X_test = X_test.reshape(num_test, height * width)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255 # Normalise data to [0, 1] range
X_test /= 255 # Normalise data to [0, 1] range
Y_train = np_utils.to_categorical(y_train, num_classes) # One-hot encode the labels
Y_test = np_utils.to_categorical(y_test, num_classes) # One-hot encode the labels
input_img = Input(shape=(height * width,))
x = Dense(height * width, activation='relu')(input_img)
encoded = Dense(height * width//2, activation='relu')(x)
encoded = Dense(height * width//8, activation='relu')(encoded)
y = Dense(height * width//256, activation='relu')(x)
decoded = Dense(height * width//8, activation='relu')(y)
decoded = Dense(height * width//2, activation='relu')(decoded)
z = Dense(height * width, activation='sigmoid')(decoded)
model = Model(input_img, z)
model.compile(optimizer='adadelta', loss='mse') # reporting the accuracy
model.fit(X_train, X_train,
epochs=10,
batch_size=128,
shuffle=True,
validation_data=(X_test, X_test))
mid = Model(input_img, y)
reduced_representation =mid.predict(X_test)
out = Dense(num_classes, activation='softmax')(y)
reduced = Model(input_img, out)
reduced.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
reduced.fit(X_train, Y_train,
epochs=10,
batch_size=128,
shuffle=True,
validation_data=(X_test, Y_test))
scores = reduced.evaluate(X_test, Y_test, verbose=1)
print("Accuracy: ", scores[1])
Run Code Online (Sandbox Code Playgroud)
它产生一个 $y\in \mathbb{R}^{3}$ (几乎就像你得到的一样decomposition.PCA(n_components=3))。例如,在这里您可以看到数据集中y数字5实例的图层输出:
class y_1 y_2 y_3
5 87.38 0.00 20.79
Run Code Online (Sandbox Code Playgroud)
正如你在上面的代码中看到的,当我们将层连接y到一个softmax密集层时:
mid = Model(input_img, y)
reduced_representation =mid.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
新模型mid给了我们一个很好的分类准确率95%。因此,可以合理地说y,是数据集的有效提取的特征向量。
参考:
[1]:布尔拉德、埃尔韦和伊夫·坎普。“多层感知器的自动关联和奇异值分解。” 生物控制论 59.4 (1988): 291-294。
[2]:Japkowicz、Nathalie、Stephen Jose Hanson 和 Mark A. Gluck。“非线性自动关联不等同于 PCA。” 神经计算 12.3 (2000):531-545。
| 归档时间: |
|
| 查看次数: |
6067 次 |
| 最近记录: |