You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何对稀疏向量进行降维以降低其稀疏度?

稀疏计数向量降维/去稀疏化方案

你当前的这类向量属于典型的高维计数类稀疏向量,大量零值是因为维度冗余、大量维度仅在极少样本中出现,直接计算相似度会因为维度占比问题导致结果失真,可按以下方案处理:


前置无损失优化(优先执行)

先做特征裁剪,不需要降维就能直接降低稀疏度,无有效信息损失:

  • 先全局统计每个特征维度的总出现次数,删除全零维度、仅在1个词向量中出现的极低频维度,这类维度没有区分价值,直接裁剪就能砍掉大量无效零值
  • 对计数向量做TF-IDF加权,压低and这类高频通用词的权重,避免其数值干扰相似度计算结果

主动降维去稀疏化方案

如果裁剪后还是稀疏,或者需要进一步压缩维度,可选用以下适配稀疏向量的降维方法,输出均为稠密向量,完全消除零值问题:

1. 截断奇异值分解(Truncated SVD)

稀疏矩阵降维的首选方案,区别于PCA不需要对矩阵做中心化,完美适配稀疏输入,可自定义压缩后的维度,能保留绝大多数有效信息。
参考代码(Python):

import numpy as np
from sklearn.decomposition import TruncatedSVD

# 你的原始向量字典,替换成自己的变量名
raw_word_vec = {
    'and': np.array([0., 0., 2., 0., ...]),
    'come': np.array([0., 0., 0., 0., ...])
}

# 转换为矩阵格式
words = list(raw_word_vec.keys())
vec_matrix = np.array([raw_word_vec[w] for w in words])

# 降维,n_components为压缩后的维度,可按需调整
svd = TruncatedSVD(n_components=15, random_state=42)
dense_matrix = svd.fit_transform(vec_matrix)

# 转回字典格式
compressed_vec = {words[i]: dense_matrix[i] for i in range(len(words))}

2. 非负矩阵分解(NMF)

如果你的向量所有数值均为非负(和示例中的计数特征一致),可选NMF,分解出的低维向量也全部为非负值,可解释性比SVD更强,适合需要追溯维度含义的场景。

3. 适配稀疏的相似度计算(无需降维)

如果仅需要计算相似度,也可以不做降维,直接用稀疏向量专用的相似度算法:比如杰卡德相似度、稀疏版余弦相似度,计算时自动跳过零值维度,从计算逻辑上避免零值误导结果。


调参建议

降维维度可按保留的方差比例调整,一般保留原始90%以上的方差即可,通过svd.explained_variance_ratio_.sum()可查看当前维度保留的信息占比,通常压缩到原始维度的30%~50%即可满足需求。

内容的提问来源于stack exchange,提问作者user13056355

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:09:03