首页 > 编程知识 正文

相似度(pairwise相似度计算)

时间:2023-05-04 11:14:27 阅读:122319 作者:12

打了比赛。 为了更好地构建其中的负样本,需要计算不同句子之间的相似性。 句子约有100w,句子向量为300维,中途踩了很多洞,进行记录。

暴力计算最简单的idea是预先分配100w x 100w的矩阵,逐个计算即可

当然,实际上不能直接计算。 理由如下。

importnumpyasnpnp.zeros ([ 1000000,100000 ],dtype=np.float16 ) )。

由于numpy中的每个float32类型数据占用4个字节,因此预分配这些数组所需的总内存如下

1000000 * 100000 *4/1024/1024/1024/1024=3.6379 TB

因此,我发现对个人和小团队来说这是非常不现实的。 那么,如何优化这个过程呢?

需要记录所有数据吗? 只计算topk的数据【笨蛋方案】如果只是需要记录topk的数据,正好可以分配较小的数组进行相似度的计算【暴力计算】“-我后来使用的方法”

降维算法【一般方案】word2vec在每个word上生成300维向量,直接计算300维向量之间相似度的运算量很大,可以使用降维的方法

推荐:推荐阅读一些相关搜索算法/库【实际有用方法】:

topk相似性性能比较(kd-tree、kd-ball、faiss、annoy、线性搜索) ) ) ) ) ) ) ) ) ) )。

详细求解KD树

kNN中的两种优化数据结构: kd-tree和ball-tree在算法实现原理上有什么区别?

KD树沿卡迪尔轴或坐标轴分割数据,而ball树沿一系列hyper-spheres分割数据

paper : whatisagoodnearestneighborsalgorithmforfindingsimilarpatchesinimages?论文的最终结论:

Faiss的githubfaiss-alibraryforefficientsimilaritysearchandclusteringofdensevectors。

Faiss是针对Facebook开源稠密向量提供高效的相似度检索和聚类的框架

我在网上找了没有特别详细的Faiss原理性文章,Faiss的论文billion-scalesimilaritysearchwithgpus,或者这篇文章也相当详细的facebookaisimilaritysearch (facebokaisimilaritysearch )

请参阅文章:

你知道应该怎么把40w*40w的矩阵初始化到内存中吗?

8 .关于8. CSDN 【Python】numpy数组占用内存空间的问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。