【问题标题】:Difference in PCA implementation between numpy only vs sklearn仅 numpy 与 sklearn 之间的 PCA 实现差异
【发布时间】:2019-03-05 14:27:00
【问题描述】:
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('data/MNIST/', one_hot=True)

numpy 实现

# Entire Data set
Data=np.array(mnist.train.images)
#centering the data
mu_D=np.mean(Data, axis=0)
Data-=mu_D


COV_MA = np.cov(Data, rowvar=False)
eigenvalues, eigenvec=scipy.linalg.eigh(COV_MA, eigvals_only=False)
together = zip(eigenvalues, eigenvec)
together = sorted(together, key=lambda t: t[0], reverse=True)
eigenvalues[:], eigenvec[:] = zip(*together)


n=3
pca_components=eigenvec[:,:n]
print(pca_components.shape)
data_reduced = Data.dot(pca_components)
print(data_reduced.shape)
data_original = np.dot(data_reduced, pca_components.T) # inverse_transform
print(data_original.shape)


plt.imshow(data_original[10].reshape(28,28),cmap='Greys',interpolation='nearest')

sklearn 实施

from sklearn.decomposition import PCA

pca = PCA(n_components=3)
pca.fit(Data)

data_reduced = np.dot(Data, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # inverse_transform
plt.imshow(data_original[10].reshape(28,28),cmap='Greys',interpolation='nearest')

我想通过使用 numpy 来实现 PCA 算法。但是我不知道如何从中重建图像,我什至不知道这段代码是否正确。

其实我用sklearn.decomposition.PCA的时候,结果和numpy的实现是不一样的。

你能解释一下不同之处吗?

【问题讨论】:

  • only_2 来自哪里?
  • 对不起,我在 Mnist 中只使用了 2,但您可以将其视为数据。没关系。
  • @N EMO:我想知道only_2的原因是想了解你是否对它进行了扩展,如果是,你是如何做到的?
  • 另一个最近的 PCA 问题:stackoverflow.com/questions/52565675/…
  • 为了清楚起见,我编辑了我的问题,也许你们可以比以前更好地理解它。

标签: python numpy pca


【解决方案1】:

我已经发现了一些不同之处。

对于一个:

n=300
projections = only_2.dot(eigenvec[:,:n])
Xhat = np.dot(projections, eigenvec[:,:n].T)
Xhat += mu_D
plt.imshow(Xhat[5].reshape(28,28),cmap='Greys',interpolation='nearest')

我想说的是,如果我的理解是正确的n = 300,那么您正在尝试拟合 300 个特征值从高到低的特征向量。

但是在sklearn

from sklearn.decomposition import PCA

pca = PCA(n_components=1)
pca.fit(only_2)

data_reduced = np.dot(only_2, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # invers

在我看来,您只拟合了 FIRST 组件(使方差最大化的组件),而您并没有使用全部 300 个组件。

更多:

我可以清楚地说,您似乎了解 PCA 中正在发生的事情,但您在实施它时遇到了麻烦。如果我错了,请纠正我:

data_reduced = np.dot(only_2, pca.components_.T) # transform
data_original = np.dot(data_reduced, pca.components_) # inverse_transform

在这一部分中,您尝试将特征向量投影到数据中,这是您应该在 PCA 中做的事情,但在 sklearn 中,您应该做的是:

 import numpy as np
 from sklearn.decomposition import PCA

 pca = PCA(n_components=300)
 pca.fit_transform(only_2) 

如果你能告诉我你是如何创建only_2 的,我明天可以给你一个更具体的答案。

这是sklearn 对 PCA 的fit_transform 所说的话:http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA.fit_transform

fit_transform(X, y=None)
Fit the model with X and apply the dimensionality reduction on X.

Parameters: 
X : array-like, shape (n_samples, n_features)
Training data, where n_samples is the number of samples and n_features is the number of features.

y : Ignored
Returns:    
X_new : array-like, shape (n_samples, n_components)

【讨论】:

  • 对不起,我的错误,您不必关注 only_2 和 n_components 的数量,这只是一个错误。因为我实际上已经用相同的 n_components 和相同的“数据”集编写了算法,我只是想知道我的 numpy 代码是否不正确。感谢您了解我有关 pca.fit_transform 的信息。顺便问一下,data_reduced 和 pca.fit_transform 有什么区别?以及如何在numpy中实现重构算法?
  • 我认为 pca.components_ 是 sklearn 中的特征向量。这些有什么不同吗?
  • @N EMO:你是对的。而你的计算只有懂PCA的人才能看懂。您对data_reduced 的重构是正确的。但是为什么不使用内置方法呢?
  • 哈哈哈只是练习。我更清楚地编辑了我的问题。我希望你能比以前更准确地了解我的实现。
  • @NEMO 请给我几个小时。我会完成这件事并展示给你看。我有一个作业要提交
猜你喜欢
  • 2018-05-01
  • 2021-02-02
  • 1970-01-01
  • 2020-02-28
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2013-09-02
相关资源
最近更新 更多