【问题标题】:Calculate similarity/distance between rows using pandas faster使用 pandas 更快地计算行之间的相似度/距离
【发布时间】:2016-04-13 03:03:40
【问题描述】:

我对 Python 和 Pandas 还很陌生。 我在 Pandas 数据框中有以下列:

歌曲编号歌曲ID 专辑ID 艺术家ID 相似艺术家艺术家Hotttnesss songHotness Loudness tempo year

从艺术家热度到年份列的数字数据。 所以我尝试使用以下代码计算歌曲之间的距离/余弦:

t1=time()
m = 1000
mat = np.zeros((m, m))

for i in range(0,m):
    for j in range(0,m):
        if i != j:
            mat[i][j] = euclidean(data.ix[i,5:], data.ix[j,5:])
            '''if data.ix[i,2] == data.ix[j,2]:
                mat[i][j] += 1
            if data.ix[i,3] == data.ix[j,3]:
                mat[i][j] += 1
            #l1,l2 - list of similar artists
            l1_str = data.ix[i,4].strip(']')[1:]
            l2_str = data.ix[j,4].strip(']')[1:]
            l1 = l1_str.split()
            l2 = l2_str.split()
            common  = len(set(l1).intersection(l2))
            mat[i][j] += common
            mat[i][j] /= 3'''
        else:
            mat[i][j] = 0.0
t2 =time()
print(t2-t1)

所以这基本上需要循环 10^4*10^4 次。 如果我对 m =1000 执行此操作,我会在 2249 秒或 37.48 分钟内获得结果,因此我无法及时获得 m = 10000 的结果。

如何加快速度(通过避免循环?pandas 函数)?

感谢您的帮助

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以通过使用scikit-learn 中的euclidean_distances 函数来避免使用循环。

    from sklearn.metrics.pairwise import euclidean_distances
    import numpy as np
    
    mat = np.random.rand(5, 5)
    pairwise_dist_mat = euclidean_distances(mat)
    pairwise_dist_mat
    array([[ 0.        ,  1.19602663,  1.08341967,  1.07792121,  1.1245057 ],
       [ 1.19602663,  0.        ,  0.52135682,  0.82797734,  0.78247091],
       [ 1.08341967,  0.52135682,  0.        ,  0.87764513,  0.81903634],
       [ 1.07792121,  0.82797734,  0.87764513,  0.        ,  0.1386294 ],
       [ 1.1245057 ,  0.78247091,  0.81903634,  0.1386294 ,  0.        ]])
    

    【讨论】:

    • 你能证明使用sklearn 比使用numpyfor 循环更快吗?
    • 因为它使用线性代数而不是 for 循环来计算距离。从文档中,公式是 dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y)) (其中 dot 是点积)
    • 如果你愿意,你可以用 numpy 制作你自己的矢量化函数,但是 for 循环不可能更快
    • 你也可以在scipy中使用pdistdocs.scipy.org/doc/scipy/reference/generated/…
    • 根据我的经验,sklearn 速度较慢,使用 numpy 直接计算距离测量的性能优于它。
    猜你喜欢
    • 2013-12-16
    • 2016-11-13
    • 2013-06-24
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2021-09-05
    相关资源
    最近更新 更多