跳转至

P4-18.2 可视化与信息损失

Section ID: P4-18.2 Version: v2026.07.24

在 P4-18.1 里,我们看到了降维(dimensionality reduction)是在把大量特征重新表达成更少的轴。接下来要问的是:这个图到底能信到什么程度。

如果通过降维,图已经变得容易看了,那么这个图到底可以信到哪里?

通过降维得到的二维或三维图,对观察结构非常有用,但它并不会把原来高维数据中的所有关系完整保留下来。

可视化是非常强的工具,但它也可能制造非常强的错觉。

这一节不会长篇重复降维的基本定义。把很多特征重新表达成更少的轴这一核心直觉,会通过 P4-18.1 和概念词汇表重新连回来;这里则只集中处理:这种图会带来哪些信息损失,以及哪些解释风险。

本节范围

这一节回答下面这些问题。

  • 为什么降维结果虽然容易看,但并不是完整副本?
  • 什么信息相对保留得较好,什么信息可能会消失?
  • 为什么二维图里看起来接近的点,并不一定在原空间里也接近?
  • 在探索性分析(exploratory analysis)里,应该怎样更安全地使用降维结果?
  • 在解释 t-SNE、UMAP、reconstruction error、trustworthiness 时,最少要理解什么?

这一节集中在入门层面抓住这个图到底能信到哪里该怎样读信息损失。因此,这一节会直接处理 t-SNE 和 UMAP 更想保留什么结构,以及 reconstruction error 和 trustworthiness 应该怎样作为最低限度的检查标准来读。相对地,实现优化、细致调参以及更扩展的指标比较,这里不会长篇展开。

用可视化与信息损失留下的判断标准

  • 能说明降维可视化是一种结构探索工具。
  • 能说明只要降维,就会伴随某些信息损失。
  • 能理解二维图上的距离和原始高维空间里的距离可能不同。
  • 能保持一种态度:把可视化结果当成后续审查的起点,而不是最终结论。

阅读这一节的顺序

这一节里,可视化解释、方法比较、质量指标会一起出现,所以第一次读时,最好只按下面四个问题的顺序来抓。

  1. 为什么降维图虽然容易看,但不是完整副本?
  2. PCA、t-SNE、UMAP 分别更想保留什么?
  3. 看起来很近的点看起来分开的团块到底能信到哪里?
  4. reconstruction error 和 trustworthiness 又是从什么方向去重新检查这些风险?

只要先把这个顺序固定住,就更不容易把解释问题和检查指标混在一起。

为什么需要这一节

学完降维之后,读者通常会这样想。

  • 现在终于能把数据画成二维了。
  • 点看起来分成了几团。
  • 所以结构应该已经更清楚了。

这个期待只对了一半。

说得对的部分 仍然要小心的部分
大的流向确实更容易一眼看见 原始结构并没有被完整复制
更容易快速发现团块和异常值候选 团块和距离解释可能被夸大
用来说明和展示非常有用 视觉效果可能制造过强的确信感

所以,P4-18.2 学的不是单纯怎样画图,而是读图时该在哪里停下来

为什么只要降维就会出现信息损失

正如在 P4-18.1 里看到的,降维就是把很多轴压成更少的轴。这句话本身就意味着:不可能把所有信息原封不动地保留下来。

例如,把 50 维数据压到 2 维时:

  • 一些大变动可以被保留下来
  • 一些小差异或局部关系会变弱
  • 某些方向上的信息会被合并,甚至消失

降维本质上很接近一种压缩(compression)。

压缩里一定包含选择。

  • 什么要优先保留下来?
  • 什么会被认为没那么重要,从而被压缩?

正因为有这个选择,信息损失才会自然跟着出现。

压缩过程总会包含保留什么、削弱什么这样的选择。强烈的整体模式可能会留下来,但细小的局部关系可能会变弱甚至消失。

如果把这个点稍微读得更实务一点,可以写成这样。

原始数据里原本在看的东西 降维之后可能怎样改变 因而要重新确认什么
大的整体方向差异 可能相对保留得较好 这种大流向是否也连接到真实业务差异
边界附近的模糊样本 可能看起来更挤在一起,或更分开 原始特征里到底什么地方模糊
少数样本的细小差异 可能在压缩里被埋掉 小群体是否需要单独再看
分散在多条轴上的细小变化 可能被压平到一两条轴里 哪些特征在概括过程中变得模糊

“容易看”不等于“原始结构被完整保留”

二维散点图(scatter plot)看起来很整洁,但这并不表示原始高维结构就被完整地搬到了二维平面上。

这里的重要区分是:

  • 容易看:对人来说,解释起来更方便
  • 结构保留:原始数据关系被足够保留下来

这两件事可能重合,但并不总是同一件事。

可视化是对人友好的表达,并不会自动等于完整复制结构

看起来很近,就代表原来真的也很近吗

最常见的误解是:

如果两个点在 2D 图里几乎贴在一起,那它们在原始数据里也一定差不多。

但在降维过程中:

  • 原本离得远的点,可能会在图上靠近
  • 原本离得近的点,也可能在图上稍微拉开

这是一种自然扭曲,因为高维结构被挤压到了更少的轴上。

如果把这个感觉画出来,会是下面这样。

flowchart TB
  A["高维关系"]
  B["投影到 2D"]
  C["2D 中看到的距离"]
  D["不一定等同于原始距离"]

  A --> B --> C --> D

这张图强调的是:二维图里的距离,并不总等于原始高维空间中的距离。图里看起来靠近的两个点,不一定原本也近;反过来,图里看起来有些分开,也不代表原始结构里就不相似。

图上的距离和原始距离之间,是可能出现差异的。

例如,就算客户 A 和 B 在二维图里几乎贴在一起,它们在原始特征里也可能像下面这样其实差得不小。

客户 访问次数 购买金额 最近性 2D 图上的印象
A 看起来和 B 很近
B 看起来和 A 很近

在图上,它们都可能像类似的活跃客户。但回到原始特征,A 可能购买规模更高,而 B 可能最近活跃性更高。所以,如果只因为 2D 看起来很近,就把它们塞进同一套运营策略,那么信息损失就已经变成了解释错误。

为什么不同方法首先想保留的东西不同

并不是所有降维方法都在画同一种图。有的方法先保留大的整体变动,有的方法则更看重近邻结构。

最先问的问题 更接近的方法 初学者先要抓住什么
想尽量保留大的整体变动吗 PCA 它会先保留大方差方向
想更强调非线性结构或近邻关系吗 t-SNE、UMAP 它们对局部近邻结构比对整体布局更敏感

这个区分必须先固定下来,否则后面质量指标就很容易被误读成同一类问题。

t-SNE 和 UMAP 更想保留什么

并不是所有方法都像 PCA 那样优先保留大方差方向。在可视化里经常被提到的 t-SNE 和 UMAP,更偏向于保留局部邻域关系(local neighborhood)。

方法 入门时先抓住的核心 因此图上经常出现的特点
PCA 先保留大的整体变动 整体方向和扩散容易看,但局部分组可能较弱
t-SNE 试图让原空间里的近邻关系在低维里也相似出现 局部团块会看得更清楚,但团块之间距离要谨慎解读
UMAP 试图在低维里也保留近邻图结构 常常既能看见局部结构,也会让整体布局稍微更好读一些

把 t-SNE 再压成很短的话:

  • 先在原始高维空间里,像概率那样计算谁是谁的近邻
  • 再调整低维中的点位置,让相似的近邻关系也在那里出现
  • 所以它对让近邻点看起来聚在一起的力量很强

把 UMAP 再压成很短的话:

  • 先在原空间里建立近邻图
  • 再把点放置到低维里,让这个图关系尽量保留
  • 所以它往往表现出既保留局部邻域结构,也努力让整体图更容易看

如果把这个差别压成解释句,会像下面这样。

看图时先问的问题 在 t-SNE、UMAP 里尤其要小心什么
同一团内部的接近性能信到哪里 局部邻域结构通常值得参考,但仍然不是完美保留
一团和另一团之间的距离能信到哪里 它可能会因为方法和参数而被夸大或压缩,所以更要小心
图上看见的团数就是真实结构吗 视觉上的分离可能是结构提示,但不能立刻定案

所以,t-SNE 和 UMAP 不是画漂亮图的工具,而更应该被读成试图把原空间里的近邻关系搬到低维中来的工具。因此,它们对局部结构提示更强,但对整体距离绝对分离的解读则要更保守。

reconstruction error 到底在算什么

既然前面已经看到:有的方法更强调保留大的整体变动,有的方法更强调保留局部结构,那么质量指标也不应该被当成在问同一种问题。

检查问题 更接近的指标
降维后的表达,到底还能把原始信息重建回来多少 reconstruction error
低维图里看起来近的近邻关系,到底能信多少 trustworthiness

也就是说,reconstruction error 更偏向重建问题,而 trustworthiness 更偏向近邻关系保留问题。

当人们想用数值来读信息损失时,经常会遇到的概念就是 reconstruction error。它的含义很简单。

先降维,再重建回原始维度时,重建结果和原始数据到底差了多少?

它最基本的形式通常写成下面这样。

\[ \text{Reconstruction Error} = \frac{1}{n}\sum_{i=1}^{n}\lVert x_i - \hat{x}_i \rVert^2 \]

这里:

  • \(x_i\):原始数据
  • \(\hat{x}_i\):降维后再重建的数据
  • \(\lVert x_i - \hat{x}_i \rVert^2\):原始值和重建值之间的平方差

所以,这可以读成:对每个样本,先算原始值和重建值差了多少,再把这些差取平均。

这种公式特别适合 PCA 这种能降维,也能再重建回去的方法。

reconstruction error 小 reconstruction error 大
只靠降维后的轴,也能相对较好地重建原始信息 在降维过程中丢掉了更多信息
很可能大的结构被保留下来了 重要差异可能被压平得比较厉害

不过,即使在这里也不能立刻过度下结论。

还要一起记住的点 原因
reconstruction error 小,并不自动表示图就容易解释 重建做得好,不代表 2D 图上的团块形状没有被扭曲
不能把同样意义的 reconstruction error 直接套在 t-SNE 或 UMAP 上 因为这些方法本来就更接近保留近邻结构,而不是重建

所以,reconstruction error 是一个在看原始信息还能被重建回来多少的指标,而不是直接衡量这张图看起来有多有说服力的指标。

trustworthiness 在问什么

在可视化质量指标里,trustworthiness 顾名思义,问的是:这张低维图中的近邻关系,到底有多值得相信? 如果压成一句话,就是下面这个问题。

那些在低维图里突然看起来很近的点,在原始高维空间里也真的属于近邻吗?

公式写成下面这样。

\[ T(k) = 1 - \frac{2}{nk(2n - 3k - 1)} \sum_{i=1}^{n}\sum_{j \in U_k(i)}(r(i,j)-k) \]

这里:

  • \(n\):样本数
  • \(k\):要看前多少个近邻
  • \(U_k(i)\):在低维里变成近邻,但在原始高维里并不属于前 \(k\) 近邻的那些点
  • \(r(i,j)\):点 \(j\) 在原始高维空间里是点 \(i\) 的第几个近邻

如果把这条公式翻成话,它就是:

  • 找出那些在低维图里突然看起来很近的点
  • 按照它们在原空间里其实有多远,给它们惩罚
  • 惩罚越小,trustworthiness 就越高

所以,trustworthiness 可以这样来读。

trustworthiness 高 trustworthiness 低
低维图中的近邻关系和原空间相对比较一致 图上看起来靠近的关系里,有更多原本很远的点
看起来贴在一起的点这个解释可以多信一点 看起来贴在一起,所以原来就相似这种解释必须更谨慎

这个指标也不是万能的。

指标直接告诉你的东西 指标不会直接告诉你的东西
近邻关系保留得怎么样 整个分组之间的距离解读是否正确
低维里是不是新制造了很多假近邻 这张图在展示时看起来有多有说服力

所以,trustworthiness 扮演的是一种刹车:它重新问你这张图里的近邻关系,到底能信多少? scikit-learn 官方文档也把它说明成一种检查 local structure 是否被保留下来的值。当你看到降维图之后,很快就想把贴在一起的点都归成一类时,应该立刻想起 trustworthiness 在追问什么。

安全的阅读顺序

为了减少视觉错觉,降维结果最好按下面这个顺序来读。

  1. 先看大的流向和团块
  2. 再看这些团块和哪些原始特征有关
  3. 再看别的轴数或别的方法下,是否也出现类似图形
  4. 必要时,再用 reconstruction error、trustworthiness、原始特征比较去重新确认

把这个顺序压成流程,会像下面这样。

flowchart TB
  A["2D 或 3D 视图"]
  B["看到一个模式"]
  C["回到原始特征"]
  D["检查这个模式是否稳健"]
  E["把它当作假设,而不是证明"]

  A --> B --> C --> D --> E

这一节的核心句,其实就是最后这一句。

降维图可以帮助产生假设,但不能单独证明这个假设。

案例与示例

案例 1. 为什么二维图里两类商品看起来很远,也不能立刻断定原始特征就真的完全不同

假设一个商品策划团队把几十个商品特征降成二维图后,看见两团点彼此离得很远。只看图,会让人觉得这是完全不同的商品家族。但回到原始特征,价格区间和核心功能仍可能非常相似,只是某些辅助特征在投影过程中被放大了。反过来,那些在图里略微重叠的商品,在原始高维空间里也可能依然能清楚区分。所以,降维图适合用来提出“分离假设”,但最终判断必须回到原始特征摘要和后续分析。

flowchart TD
  A["2D 降维图"]
  B["两组看起来离得很远"]
  C["马上断定它们是不同产品家族"]
  D["这可能是投影夸张造成的"]
  E["回到原始特征"]
  F["比较价格与核心功能"]
  G["检查其他投影方式或轴数"]
  H["保留或削弱这个分组假设"]

  A --> B --> C
  B --> D
  D --> E
  E --> F
  F --> G --> H

如果把这个场景记成解释备忘,可以这样整理。

图上先看到的结构 立刻要贴上的解释边界 再次检查的 review 问题
两团点看起来离得很远 不要只凭 2D 距离就断定原始特征完全不同 原始特征摘要里也出现同样的分离吗?
某些点看起来重叠 它们可能只是因为投影而比原来更混在一起 在别的轴数或别的方法下,也同样重叠吗?

所以,可视化这一节的核心,是把看见的结构 -> 解释边界 -> 下一验证问题一起留下。即使图表表面上很像,有些可见结构会在原始特征里再次被确认,有些则会作为投影错觉变弱,因此审查备忘必须把这些路径分开记。

案例 2. 为什么不能因为有一个点看起来特别远,就立刻删掉它

假设一个数据分析团队对运营日志做降维之后,看见有一个点远离主要点群。只看图时,它可能很像一个异常日志。但回到原始特征,这个点也可能只是一次正常的部署后流量,或者某个特定活动带来的暂时增长。它当然也可能真的是问题日志,所以关键并不只是它看起来远,而是还要再问它为什么看起来远?

图上最先看见的信号 容易立刻跳出的误解 先要重新看什么
某个点异常地远 它一定是异常值,应该立刻删掉 原始日志特征、时间区间、部署历史
一小团点单独分开 它一定是一群错误用户 是否真的存在共通属性,以及别的轴数下是否一样

这个案例说明,降维图确实适合寻找异常值候选,但“是否删除”的决定,必须回到原始特征和时间语境之后再做。

练习与示例

这个例子会用 PCA 把五个特征缩成 2D,然后确认原始空间里的近邻和 2D 空间里的近邻可能怎样不同。

  • 问题场景:检查 2D 图里看起来很近的商品候选,在原始特征里是否也能直接读成很近
  • 输入(input):用五个评分特征表示的商品候选
  • 期望输出(output):PCA 保留下来的方差比例、原始空间里的近邻、2D 空间里的近邻
  • 要确认的概念:
  • 2D 缩减表达不是原始空间的复制品
  • 缩减前后的近邻顺序可能改变
  • 降维图是后续复查的起点,而不是结论
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.metrics import pairwise_distances
from sklearn.preprocessing import StandardScaler

items = pd.DataFrame(
    [
        {"id": "A", "price_score": 2, "battery": 7, "camera": 5, "service": 10, "design": 8},
        {"id": "B", "price_score": 3, "battery": 9, "camera": 8, "service": 3, "design": 6},
        {"id": "C", "price_score": 8, "battery": 3, "camera": 3, "service": 2, "design": 1},
        {"id": "D", "price_score": 5, "battery": 1, "camera": 6, "service": 5, "design": 2},
        {"id": "E", "price_score": 4, "battery": 1, "camera": 2, "service": 5, "design": 1},
        {"id": "Q", "price_score": 8, "battery": 3, "camera": 10, "service": 2, "design": 7},
    ]
)

features = ["price_score", "battery", "camera", "service", "design"]
X_scaled = StandardScaler().fit_transform(items[features])

pca = PCA(n_components=2, random_state=0)
points_2d = pca.fit_transform(X_scaled)

raw_distances = pairwise_distances(X_scaled)
reduced_distances = pairwise_distances(points_2d)
q_index = items.index[items["id"] == "Q"][0]


def nearest_ids(distance_matrix):
    order = distance_matrix[q_index].argsort()[1:4]
    return items.iloc[order]["id"].tolist()


print("explained_variance=", [round(float(v), 3) for v in pca.explained_variance_ratio_])
print("nearest_in_original=", nearest_ids(raw_distances))
print("nearest_in_2d=", nearest_ids(reduced_distances))

for item_id, point in zip(items["id"], points_2d):
    print(item_id, "2d=", [round(float(value), 2) for value in point])

运行结果如下。

1
2
3
4
5
6
7
8
9
explained_variance= [0.505, 0.348]
nearest_in_original= ['D', 'B', 'C']
nearest_in_2d= ['B', 'D', 'C']
A 2d= [2.55, -1.23]
B 2d= [1.63, 0.87]
C 2d= [-1.96, 0.04]
D 2d= [-0.83, -0.38]
E 2d= [-1.19, -1.62]
Q 2d= [-0.19, 2.32]

这个例子要读出三点。

  1. 即使 PCA 的前两条轴保留了整体方差中的相当一部分,也不会完整保留原始空间。
  2. 在原始空间里,离 Q 最近的候选是 D;但在 2D 空间里,B 会先出现。
  3. 因此,在 2D 图里发现看起来很近的候选后,还要回到原始特征距离和实际 feature 值重新确认。

把这个场景写成可视化解释备忘,可以这样记录。

通用记录语言 这次练习中马上要留下的内容
最先看见的结构 在 2D PCA 空间里,Q 看起来最接近 B
解释边界 在原始特征空间里,Q 的最近候选是 D,所以不能把 2D 距离直接当成原始距离
下一问题 是否要把 Q、B、D 的原始 feature 值并排放在一起,看哪些轴在投影中被压缩了

检查清单

  • 你是否理解,降维图对结构探索和说明很有用,但“好看”并不自动等于“结构被保留”?
  • 你现在有没有把 2D 图里的距离,直接读成原始高维空间里的距离?
  • 你能不能说明 PCA 更先保留大范围整体变动,而 t-SNE 和 UMAP 更重视近邻结构?
  • 你有没有把看见的团块或异常点候选,不经复查就直接送去做策略判断?
  • 你能不能说明 reconstruction error 问的是能复原多少,而 trustworthiness 问的是近邻关系能信多少
  • 你有没有区分自己现在要确认的是复原,还是近邻关系保留
  • 你是否把降维图读成后续复查的起点,而不是最终结论?
  • 你是否准备通过原始特征、其他方法、或其他轴数去复查图里看到的结构?

出处与参考资料