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
相关产品推荐
相关产品推荐

