寻求可保留点积相似度的高维单位向量降维方法
保留点积相似度的高维单位向量降维方案
问题背景
我手头有一批高维向量,维度n在1000~3000之间,这些向量满足:均值为0,标准差为1/√n,且L2范数为1。现在需要对它们做降维处理,核心要求是降维并重新归一化后,任意两个向量的点积要和原向量的点积尽可能接近。
已验证可行的方法:随机维度采样
我测试了随机选取部分维度的方法,结果显示点积相似度保留得不错。这里先说明:%是自定义操作符,作用是对操作数先归一化再计算点积。
测试代码如下:
# 原向量归一化后点积 In [34]: ab % bc Out[34]: 0.445 # 隔1个维度采样(降维至原维度的1/2) In [35]: ab[::2] % bc[::2] Out[35]: 0.424 # 隔2个维度采样(降维至原维度的1/3) In [36]: ab[::3] % bc[::3] Out[36]: 0.440 # 随机选取300个维度采样 In [39]: rnd = np.random.randint(0,1000,300) In [40]: ab[rnd] % bc[rnd] Out[40]: 0.450
从结果能看到,不管是间隔采样还是随机采样,降维后的点积和原结果都很接近,满足需求。
其他可选的同类方法
除了直接随机选维度,还有约翰逊-林德斯特劳斯(JL)变换,它是更严谨的随机降维方法,核心思路是用一个随机生成的低维矩阵和原向量做乘法实现降维。针对你的单位向量场景,简化版JL变换可以直接用元素服从均值0、标准差1/√k(k为目标维度)的随机投影矩阵,降维后再做归一化,同样能很好保留点积相似度。
需要注意的是,不管是随机采样还是JL变换,目标维度k不能太小,一般建议k至少取几十到上百(比如测试里的300维就效果很好),否则点积误差会明显增大。
内容的提问来源于stack exchange,提问作者sten
相关产品推荐
相关产品推荐

