原文:https://docs.voxel51.com/tutorials/dimension_reduction.html
本文中,您将学习如何在 FiftyOne 中对数据进行 PCA、t-SNE、UMAP 和自定义降维。
教程涵盖以下内容:
- 为什么降维很有用
- 不同降维技术的优缺点
- 在 FiftyOne 中如何运行内置的降维技术
- 在 FiftyOne 中运行自定义降维技术
准备工作
- 相关库安装
!pip install -U fiftyone scikit-learn umap-learn
1、why 降维
前景, 每个人都对嵌入(表示输入数据特征的数值向量)感到兴奋。例如,在计算机视觉中,图像嵌入用于图像反向搜索;在大型语言模型 (LLM) 的上下文中,文档被分块和嵌入(使用文本嵌入模型)以进行检索增强生成 (RAG)。嵌入功能非常强大,但鉴于其高维性(其长度通常在 384 到 4096 之间),他们很难被人类解释和查看。这就是降维技术派上用场的地方!
降维技术是在较低维空间中表示来自较高维空间信息的定量方法。通过将嵌入内容压缩到二维或三维空间中,我们可以将它们可视化,从而更直观地了解数据中 “隐藏” 结构。
当我们将高维数据投影到低维空间时,我们隐式地平衡表征复杂性和可解释性。为了压缩嵌入,降维技术对基础数据、其分布和变量之间的关系做出假设。
接下来,我们将使用三种流行的降维技术可视化嵌入: PCA、t-SNE 和 UMAP。并简要概述每种技术的优点、缺点和假设性。我们将说明用于生成嵌入的模型和降维技术在塑造数据可视化方面都发挥着至关重要的作用。
同样要注意,降维技术通常具有超参数,这可能会对结果产生不可忽视的影响。在本文中,我们将在出现选择的所有位置使用默认超参数。请随意修改您认为合适的内容!
2、FiftyOne 中的降维 API
fiftyone降维技术PCA、t-SNE使用scikit-learn库,UMAP使用umap-learn。
– 数据、模型准备
我们使用 CIFAR-10 数据集的test作为我们的测试集,其中包含 10,000 张大小为 32x32 像素的图像,跨越 10 个图像类别。我们可以直接从 FiftyOne Dataset Zoo 加载:
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
dataset = foz.load_zoo_dataset("cifar10", split="test")
session = fo.launch_app(dataset)
我们使用两种图像嵌入模型(ResNet-101 和 CLIP)比较和对比我们的四种降维技术。ResNet-101 是一种传统的视觉模型,表示图像中像素和块之间(pixels and patches in images)的关系,而 CLIP 则捕获图像更多语义内容。
FiftyOne Model Zoo库加载模型:
clip = foz.load_zoo_model("clip-vit-base32-torch")
resnet101 = foz.load_zoo_model("resnet101-imagenet-torch")
注:模型文件及相关配置本地存放路径 C:\Users\LF\fiftyone\ __ models__
(如果网络问题导致文件下载失败,可以先手动下载,然后根据说明文件manifest-torch.json修改名字,将其放置本地存放路径)
然后为每个模型生成嵌入,相当于对数据集调用 compute_embeddings()
方法,该方法使用指定的模型计算样本数据的嵌入向量。如果给定embeddings_field
字段,则计算的嵌入向量保存在样本数据中,返回None;否则返回到内存中。
## compute and store resnet101 embeddings
dataset.compute_embeddings(
resnet101,
embeddings_field="resnet101_embeddings" # 自定义字段名
)
## compute and store clip embeddings
dataset.compute_embeddings(
clip,
embeddings_field="clip_embeddings" # 自定义字段名
)
查看嵌入向量:
from fiftyone import ViewField as F
# print(dir(dataset))
print(dataset.values("vgg11_embeddings")[0]) # 特征值
print(dataset.values("vgg11_embeddings")[0].shape) # 特征维度,4096
print(len(dataset.values("vgg11_embeddings"))) # 数据集大小
– 降维
FiftyOne Bra