【问题标题】:how to project new sets of data onto a pca space in matplotlib?如何将新的数据集投影到 matplotlib 中的 pca 空间?
【发布时间】:2014-08-19 03:41:56
【问题描述】:

我有一个 68 维 * 100 个观察值的数据集,可以在 python 中使用 matplotlib 创建一个 pca 空间。

现在我得到了另一组 6 维 * 100 个观测值的数据 (x)。是否可以将这些数据投影到之前创建的 pca 空间上?

我尝试使用pca_space.project(x)进行投影,但是pca空间的维度与新的数据集不匹配,不起作用。

【问题讨论】:

  • 我认为这没有任何意义。 PCA 转换从原始数据空间映射到 PCA 空间。如果原始数据空间为 68 维,则变换的域为 68 维空间。您打算如何将 6 维空间与此相关联?
  • 我想展示新数据集中的每个变量如何与每个主成分相关,并将它们映射到 2D 图上(PC1 与 PC2)。如果我对 x 中的每个变量和每台 PC 上的数据进行点积,例如x * 上第一个变量的所有观察结果。 PC1 上的所有观察结果,返回值是否适合将该变量映射到 PC1 上?
  • 我认为为了做到这一点,您需要一些关于如何将新维度映射到现有 PCA 空间的额外信息。我不太明白你对那个点产品的想法是什么意思。您只能点两个相同维度的向量。新数据中的维数 (6) 是否与 PCA 维数相同?
  • 新数据为 6*100,PCA 的结果(PC 的原始数据矩阵)为 68*100。如果我从新数据(1*100 向量)和 PC1 的结果(1*100 向量)中取一个变量,然后做两个的点积。这会给我一个值,但这个值是否以 PC1 而言?
  • 我认为这没有什么意义,因为这两个向量横切了数据点(即,您的 1*100“向量”实际上包含来自 100 个不同向量中的每一个的一个元素)。我想你在Cross ValidatedData Science SE 上询问这个问题可能会更好,因为这里真正的问题似乎是如何使用 PCA 的概念问题,而不是如何对其进行编程。

标签: python matplotlib projection pca


【解决方案1】:

给定 2 个随机多元高斯:

mu_vec1 = np.array([0,0,0])
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T
assert class1_sample.shape == (3,20), "The matrix has not the dimensions 3x20"

mu_vec2 = np.array([1,1,1])
cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20).T
assert class1_sample.shape == (3,20), "The matrix has not the dimensions 3x20"

使用 matplotlib 将 3D 空间减少到 2D 特征子空间的一个示例是

from matplotlib.mlab import PCA as mlabPCA

mlab_pca = mlabPCA(all_samples.T)

print('PC axes in terms of the measurement axes'\
        ' scaled by the standard deviations:\n',\
          mlab_pca.Wt)

plt.plot(mlab_pca.Y[0:20,0],mlab_pca.Y[0:20,1], 'o', markersize=7,\
        color='blue', alpha=0.5, label='class1')
plt.plot(mlab_pca.Y[20:40,0], mlab_pca.Y[20:40,1], '^', markersize=7,\
        color='red', alpha=0.5, label='class2')

plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-4,4])
plt.ylim([-4,4])
plt.legend()
plt.title('Transformed samples with class labels from matplotlib.mlab.PCA()')

plt.show()

但请注意,mlabPCA 将变量缩放为单位方差(标准化)。这可能是也可能不是您想要的。如果你想要更多的控制,我建议使用 sckit-learn 包:

from sklearn.decomposition import PCA as sklearnPCA

sklearn_pca = sklearnPCA(n_components=2)
sklearn_transf = sklearn_pca.fit_transform(all_samples.T)

plt.plot(sklearn_transf[0:20,0],sklearn_transf[0:20,1],\
     'o', markersize=7, color='blue', alpha=0.5, label='class1')
plt.plot(sklearn_transf[20:40,0], sklearn_transf[20:40,1],\
     '^', markersize=7, color='red', alpha=0.5, label='class2')

plt.xlabel('x_values')
plt.ylabel('y_values')
plt.xlim([-4,4])
plt.ylim([-4,4])
plt.legend()
plt.title('Transformed samples with class labels from matplotlib.mlab.PCA()')

plt.show()

【讨论】:

    猜你喜欢
    • 2021-01-11
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2019-06-08
    • 2022-11-04
    相关资源
    最近更新 更多