在机器学习和向量数据库中,密集向量(Dense Vector)和稀疏向量(Sparse Vector)是两种不同的向量表示方式,适用于不同的数据特性和应用场景。以下是它们的核心区别和实际应用解析:
1. 密集向量(Dense Vector)
特点:
全维度填充:每个维度都有非零值(或显式存储的零值)。
连续存储:所有维度值按顺序存储,无省略。
固定长度:维度数在创建时确定,不可变。
示例:
# 一个128维的密集向量(如BERT嵌入)
[0.12, -0.45, 0.87, ..., 0.23] # 所有128个维度都有值典型应用:
深度学习模型输出:如BERT、ResNet生成的嵌入向量。
向量数据库存储:Milvus、FAISS等处理的默认向量类型。
相似性计算:余弦相似度、欧氏距离等。
优势:
适合表示连续、稠密的数据特征(如图像、语义嵌入)。
计算效率高(硬件加速友好)。
2. 稀疏向量(Sparse Vector)
特点:
大部分维度为零:仅存储非零值及其位置,省略零值。
压缩存储:通常用
(index, value)键值对表示。可变长度:非零值数量不固定。
示例:
# 一个100万维的稀疏向量(如词袋模型)
{
1024: 0.9, # 第1024维的值为0.9
2048: 0.3, # 第2048维的值为0.3
... # 其他维度均为0(不存储)
}典型应用:
文本特征表示:TF-IDF、词袋模型(Bag-of-Words)。
推荐系统:用户行为特征(如点击历史)。
高维分类数据:One-Hot编码。
优势:
节省存储空间(尤其适合维度极高且稀疏的场景)。
计算时跳过零值,提升效率。
3. 核心对比
4. 在向量数据库中的实践
Milvus/Pinecone等处理方式:
密集向量:直接存储和索引,支持欧氏距离、内积等计算。
# Milvus插入密集向量 data = {"id": 1, "vector": [0.1, 0.2, 0.3], "text": "..."}稀疏向量:需转换为密集向量或专用稀疏索引(如Milvus 2.3+支持SPTAG稀疏索引)。
# 稀疏向量转密集向量(补零) sparse = {1: 0.9, 3: 0.2} dense = [0, 0.9, 0, 0.2] # 补零后的密集表示
选择建议:
若数据天然稀疏(如文本词频),优先用稀疏表示。
若需深度模型处理或相似性搜索,转换为密集向量更高效。
5. 可视化理解
密集向量:
[0.3, 0.7, 0.0, 0.4, 0.0] → 存储所有5个维度
稀疏向量:
{0: 0.3, 1: 0.7, 3: 0.4} → 仅存储3个非零值通过理解这两种表示法的差异,可以更高效地设计特征工程和选择向量数据库方案。