LDA的倒数不一定有意义,因为它会丢失很多信息。
为了进行比较,请考虑PCA。在这里,我们得到一个系数矩阵,用于转换数据。我们可以通过从矩阵中剥离行来进行降维。为了获得逆变换,我们 首先对整个
矩阵求逆,然后删除与删除的行相对应的列。
LDA没有提供完整的矩阵。我们只能得到一个不能直接求逆的简化矩阵。可以采用伪逆,但是这比我们拥有完整矩阵时要低得多。
考虑一个简单的例子:
C = np.ones((3, 3)) + np.eye(3) # full transform matrixU = C[:2, :] # dimensionality reduction matrixV1 = np.linalg.inv(C)[:, :2] # PCA-style reconstruction matrixprint(V1)#array([[ 0.75, -0.25],# [-0.25, 0.75],# [-0.25, -0.25]])V2 = np.linalg.pinv(U) # LDA-style reconstruction matrixprint(V2)#array([[ 0.63636364, -0.36363636],# [-0.36363636, 0.63636364],# [ 0.09090909, 0.09090909]])
如果我们有完整的矩阵,则得到的逆变换(
V1)与简单地变换()的逆变换不同
V2。 这是因为在第二种情况下,我们丢失了有关废弃组件的所有信息。
你被警告了。如果您仍然想进行逆LDA转换,请使用以下函数:
import matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.decomposition import PCAfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.utils.validation import check_is_fittedfrom sklearn.utils import check_array, check_X_yimport numpy as npdef inverse_transform(lda, x): if lda.solver == 'lsqr': raise NotImplementedError("(inverse) transform not implemented for 'lsqr' " "solver (use 'svd' or 'eigen').") check_is_fitted(lda, ['xbar_', 'scalings_'], all_or_any=any) inv = np.linalg.pinv(lda.scalings_) x = check_array(x) if lda.solver == 'svd': x_back = np.dot(x, inv) + lda.xbar_ elif lda.solver == 'eigen': x_back = np.dot(x, inv) return x_backiris = datasets.load_iris()X = iris.datay = iris.targettarget_names = iris.target_nameslda = LinearDiscriminantAnalysis()Z = lda.fit(X, y).transform(X)Xr = inverse_transform(lda, Z)# plot first two dimensions of original and reconstructed dataplt.plot(X[:, 0], X[:, 1], '.', label='original')plt.plot(Xr[:, 0], Xr[:, 1], '.', label='reconstructed')plt.legend()您会看到,逆变换的结果与原始数据没有多大关系(嗯,有可能猜测投影的方向)。变体的相当一部分永久消失了。



