降维总是会丢失一些信息吗?

机器算法验证 主成分分析 信息论
2022-02-27 02:04:35

就像标题说的那样,降维总是会丢失一些信息吗?以 PCA 为例。如果我拥有的数据非常稀疏,我会假设可以找到“更好的编码”(这是否与数据的等级有关?),并且不会丢失任何内容。

3个回答

降维并不总是会丢失信息。在某些情况下,可以在低维空间中重新表示数据而不丢弃任何信息。

假设您有一些数据,其中每个测量值都与两个有序协变量相关联。例如,假设您在相对于某个发射器(由颜色白色 = 好,黑色 = 坏) 。在这种情况下,您的数据可能类似于左侧图 [*1]:Qxy

径向平均演示

至少从表面上看,它是一个二维数据:但是,我们可能知道先验(基于基础物理学)或假设它仅取决于与原点的距离: r =(即使潜在的现象还没有被很好地理解,一些探索性分析也可能会导致你得出这个结论)。然后我们可以将我们的数据重写为而不是,这将有效地将维度降低到一个维度。显然,只有在数据是径向对称的情况下,这才是无损的,但对于许多物理现象来说,这是一个合理的假设。Q(x,y)x2+y2Q(r)Q(x,y)

这个变换是非线性的(有一个平方根和两个平方!),所以它与 PCA 执行的降维有点不同,但我认为这是一个很好的有时如何在不丢失任何信息的情况下删除维度的示例。Q(x,y)Q(r)

再举一个例子,假设您对某些数据执行奇异值分解(SVD 是主成分分析的近亲——通常是主成分分析的基本内容)。SVD 将您的数据矩阵分解为三个矩阵,使得U 和 V 的列分别是左奇异向量和右奇异向量,它们形成的一组正交基。的对角线元素(即是奇异值,它们实际上是的对应列的其余部分)MM=USVTMSSi,i)iUVS是零)。就其本身而言,这不会给您任何降维(事实上,现在有 3 个矩阵,而不是您开始使用的单个但是,有时的某些对角元素为零。这意味着不需要中的相应碱基,因此可以删除它们。例如,假设NxNNxNSUVMQ(x,y)上面的矩阵包含 10,000 个元素(即,它是 100x100)。当我们对其执行 SVD 时,我们发现只有一对奇异向量具有非零值 [*2],因此我们可以将原始矩阵重新表示为两个 100 个元素向量的乘积(200 个系数,但你实际上可以做得更好[*3])。

对于某些应用程序,我们知道(或至少假设)有用信息是由具有高奇异值 (SVD) 或载荷 (PCA) 的主成分捕获的。在这些情况下,我们可能会丢弃负载较小的奇异向量/基数/主成分,即使它们不为零,理论上它们包含烦人的噪声而不是有用的信号。我偶尔会看到人们根据其形状(例如,它类似于已知的加性噪声​​源)拒绝特定组件,而不管负载如何。我不确定您是否会认为这是信息丢失。

关于 PCA 的信息论最优性有一些很好的结果。如果您的信号是高斯信号并且被加性高斯噪声破坏,那么 PCA 可以最大化信号与其降维版本之间的互信息(假设噪声具有类似身份的协方差结构)。


脚注:

  1. 这是一个俗气且完全非物理的模型。对不起!
  2. 由于浮点不精确,其中一些值将不完全为零。
  3. 进一步检查,在这种特殊情况下,两个奇异向量相同且关于它们的中心对称,因此我们实际上可以仅用 50 个系数表示整个矩阵。请注意,第一步会自动退出 SVD 过程;第二个需要一些检查/信念的飞跃。(如果您想根据 PCA 分数来考虑这一点,那么分数矩阵就是;关于零的类似论点根本不适用)。US

我认为你的问题背后的问题是“什么是信息?”。这是一个很好的问题。

语法技术:

PCA 是否总是丢失信息?没有。有时会丢失信息吗?完全正确。您可以从组件重建原始数据。如果它总是丢失信息,那么这是不可能的。

它很有用,因为当您使用它来减少数据的维度时,它通常不会丢失重要信息。当您丢失数据时,通常是频率较高的数据,而且通常不那么重要。在与较大特征值相关的组件中捕获了大规模的总体趋势。

矩阵的一个或多个维度是其他维度的函数,则适当的降维技术不会丢失任何信息。n×p

在最直接的情况下,如果一个维度是其他维度的线性组合,则可以在不丢失任何信息的情况下将维度减少一维 - 因为如果需要,可以从剩下的维度重新创建删除的维度。

考虑这个三维情况,其中 x3 是 x1 和 x2 的精确线性组合。目测原始数据并不明显,尽管很明显 x3 与其他两个相关:

在此处输入图像描述

但是如果我们看一下主成分,第三个是零(在数值误差范围内)。

在此处输入图像描述

前两个主成分的图与 x1 对 x2 的图相同,只是旋转了(好吧,不是我的意思那么明显,我稍后会尝试更好地解释)

在此处输入图像描述

通过任何合理的定义,我们将维度减少了一维,但保留了所有信息。

这也超出了线性降维范围,尽管说明起来自然会变得更加复杂。关键是总体答案是否定的,而不是当某些维度是其他维度组合的函数时。

代码:

library(GGally)


n <- 10^3
dat <- data.frame(x1=runif(n, 0, 3), x2=rnorm(n))
dat$x3 <- with(dat, x1 + x2)

ggpairs(dat)

pc <- princomp(dat)
plot(pc)

par(mfrow=c(1,2))
with(dat, plot(dat$x1, dat$x2, col="red", main="Original data", bty="l"))
with(pc, plot(scores[,1], scores[,2], col="blue", main="Scores from principal components(\n(rotated)", bty="l"))