ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

优化计算相似度矩阵

2020-03-12 09:40:41  阅读:390  来源: 互联网

标签:deta numpy sum 样本 矩阵 Aji 相似 Aij 优化


任务:现有特征矩阵XRN×FX\in R^{N\times F}X∈RN×F,N为样本个数,F为特征大小,需要计算相似度矩阵AAA,Aij=AjiA_{ij}=A_{ji}Aij​=Aji​为第i个样本和第j个样本的相似度,利用欧式距离求解两个样本间的距离:
Aij=Aji=f=1F(XifXjf)2A_{ij}=A_{ji}=\sum_{f=1}^{F}(X_{if}-X_{jf})^{2}Aij​=Aji​=f=1∑F​(Xif​−Xjf​)2

未优化的双重循环写法

def dobule_loop(X):
    N = len(X)
    A = numpy.zeros((N, N))
    for i in range(N):
        for j in range(i+1, N):
            A[j][i] = A[i][j] = numpy.sum(numpy.square(X[i]-X[j]))
    return A

优化写法

去掉第二个循环,使用批量计算,例如第i个样本需要和i+1到N的样本计算欧式距离,则将i+1到N个样本取出与第i个样本批量计算

def optimize_loop(X):
    N = len(X)
    A = numpy.zeros((N, N))
    for i in range(N):
        deta = numpy.sum(numpy.square(X[i]-X[i+1:N]), axis=1)
        A[i, i+1: N] = deta
        A[i+1:, i] = deta
    return A

时间上,后者比前者高效,例如当X的维度是(4000,3)时,前者时间为43.92秒,而后者只需0.56秒。

标签:deta,numpy,sum,样本,矩阵,Aji,相似,Aij,优化
来源: https://blog.csdn.net/weixin_43486780/article/details/104811360

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有