线性判别分析反变换

2024-10-01 15:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用scikit学习库中的Linear Discriminant Analysis,以便对具有200多个特征的数据执行维度缩减。但是我在LDA类中找不到inverse_transform函数。在

我只想问,如何从LDA域中的一个点重建原始数据?在

根据@bogatron和@kazemakase编辑答案:

我认为术语“原始数据”是错误的,我应该使用“原始坐标”或“原始空间”。我知道如果没有所有的PCA,我们就无法重建原始数据,但是在构建形状空间时,我们借助PCA将数据向下投影到低维。PCA试图用2到3个分量来解释数据,这些分量可以捕获数据的大部分方差,如果我们在它们的基础上重建数据,它应该向我们显示导致这种分离的形状部分。在

我再次检查了scikitlearnlda的源代码,发现特征向量存储在scalings_变量中。当我们使用svd解算器时,不可能求出特征向量(scalings_)矩阵,但当我尝试矩阵的伪逆时,我可以重建形状。在

这里,有两幅分别从[4.28,0.52]和[0,0]点重建的图像:

from [ 4.28, 0.52] from [0, 0]

我认为如果有人能深入解释LDA逆变换的数学局限性,那就太好了。在


Tags: 数据原始数据空间矩阵analysis特征scikit分量
2条回答

LDA的逆运算不一定有意义,因为它丢失了大量的信息。在

作为比较,考虑PCA。这里我们得到了一个用于转换数据的系数矩阵。我们可以通过从矩阵中剥离行来进行降维。为了得到逆变换,我们首先对整个矩阵进行逆运算,然后移除与移除行相对应的列。在

LDA没有给我们一个完整的矩阵。我们只得到一个不能直接求逆的约化矩阵。可以使用伪逆,但这比我们有完整的矩阵来处理效率要低得多。在

考虑一个简单的例子:

C = np.ones((3, 3)) + np.eye(3)  # full transform matrix
U = C[:2, :]  # dimensionality reduction matrix
V1 = np.linalg.inv(C)[:, :2]  # PCA-style reconstruction matrix
print(V1)
#array([[ 0.75, -0.25],
#       [-0.25,  0.75],
#       [-0.25, -0.25]])

V2 = np.linalg.pinv(U)  # LDA-style reconstruction matrix
print(V2)
#array([[ 0.63636364, -0.36363636],
#       [-0.36363636,  0.63636364],
#       [ 0.09090909,  0.09090909]])

如果我们有完整的矩阵,我们得到一个不同的逆变换(V1),而不是简单的逆变换(V2)。这是因为在第二种情况下,我们丢失了有关废弃部件的所有信息。

你已经被警告过了。如果仍要执行LDA逆变换,这里有一个函数:

^{pr2}$

enter image description here

你看,反变换的结果和原始数据没有太大关系(嗯,可以猜测投影的方向)。相当一部分的变化已经一去不返了。在

不存在反变换,因为通常情况下,无法从低维特征空间返回到原始坐标空间。在

把它想象成你在墙上投影的二维阴影。你不能从一个阴影回到你的三维几何体,因为信息在投影过程中丢失了。在

要回答您关于PCA的意见,请考虑一个由10个随机三维向量组成的数据集:

In [1]: import numpy as np

In [2]: from sklearn.decomposition import PCA

In [3]: X = np.random.rand(30).reshape(10, 3)

现在,如果我们应用主成分变换(PCT)并通过只保留前2个(3个中的)pc应用降维,然后应用逆变换,会发生什么?在

^{pr2}$

显然,反变换并没有重建原始数据。原因是,我们丢掉了最低的电脑,失去了信息。接下来,让我们看看如果我们保留所有pc会发生什么(即,我们不应用任何维度缩减):

In [12]: pca2 = PCA(n_components=3)

In [13]: pca2.fit(X)
Out[13]: 
PCA(copy=True, iterated_power='auto', n_components=3, random_state=None,
  svd_solver='auto', tol=0.0, whiten=False)

In [14]: Y = pca2.transform(X)

In [15]: XX = pca2.inverse_transform(Y)

In [16]: X[0]
Out[16]: array([ 0.95780971,  0.23739785,  0.06678655])

In [17]: XX[0]
Out[17]: array([ 0.95780971,  0.23739785,  0.06678655])

在这种情况下,我们能够重建原始数据,因为我们没有丢弃任何信息(因为我们保留了所有的PC)。在

LDA的情况更糟,因为可以保留的组件的最大数量不是200(您输入数据的特性的数量);相反,您可以保留的组件的最大数量是n_classes - 1。因此,例如,如果您正在处理一个二进制分类问题(2个类),那么LDA转换将从200个输入维度降到仅一个维度。在

相关问题 更多 >

    热门问题