2017-08-16 120 views
2

我用玩具例如打认识PCA VS keras的自动编码keras自动编码器VS PCA

我已经理解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]]) 

我已经做了一些阅读和玩码包括this one

但是,参考代码对我的理解程度来说感觉太高了。

是否有人有一个简短的自动编码器代码,可以告诉我

(1)如何从自动编码器来拉头3个组件

(2)如何理解量方差的自动编码器捕获

(3)自动编码器组件如何与之比较的PCA分量

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25/47847014#47847014有什么建议吗? –

回答

2

首先,自动编码器的目的是要学习的表示(编码)为一组数据,典型地一毛钱的目的不变性减少。所以,autoencoder的目标输出是自动编码器输入本身。

如[1]所示,如果存在一个线性隐层并且使用均方误差准则来训练网络,那么隐藏单元学习将投入投影在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]) 

它产生在\ mathbb {R}一$ Y \^{3} $(就像你通过decomposition.PCA(n_components=3)得到什么)。例如,在这里你看到层y的输出为数字5例如在数据集:

class y_1 y_2  y_3  
    5  87.38 0.00 20.79 

正如你在上面的代码中看到,当我们层y连接到softmax致密层:

mid = Model(input_img, y) 
reduced_representation =mid.predict(X_test) 

新模型mid给我们提供了一个很好的关于95%的分类精度。因此,可以说y是数据集的高效提取特征向量。


参考文献:

[1]:Bourlard,埃尔韦,和Yves坎普。 “通过多层感知器和奇异值分解进行自动关联”。生物控制论59.4(1988):291-294。

[2]:Japkowicz,Nathalie,Stephen Jose Hanson和Mark A.Gluck。 “非线性自动关联不等同于PCA。”神经计算12.3(2000):531-545。

+0

https://stackoverflow.com/questions/47842931/valueerror-error-when-checking-target-expected-model-2-to-have-shape-none-25/47847014#47847014有什么建议吗? –