gpt4 book ai didi

python - 迭代 pandas 行并计算行之间的余弦距离

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:00 25 4
gpt4 key购买 nike

我想计算 pandas 数据框中每行之间的余弦距离。在计算距离之前,我只想选择向量中大于 0 且相交的元素(两行都有值)。例如,行 1 [0,1,45,0,0] 和行 2 [4,11,2,0,0]。在这种情况下,程序将仅计算 [1,45] 和 [11,2] 之间的余弦距离。这是我的脚本,但这需要很长时间才能完成。感谢您对简化脚本和减少处理时间的任何帮助。

data = df.values
m, k = data.shape
dist = np.zeros((m, m))
for i in range(m):
for j in range(i,m):
if i!=j:
vec1 = data[i,:]
vec2 = data[j,:]
pairs = [(x, y) for (x, y) in zip(vec1, vec2) if x > 0 and y > 0]
if pairs:
sub_list_1, sub_list_2 = map(list, zip(*pairs))
dist[i][j] = dist[j][i]=cosine(sub_list_1, sub_list_2)
else:
dist[i][j]= dist[j][i] =1
else:
dist[i][j]=0

最佳答案

来自 cosine docs我们有以下信息 -

scipy.spatial.distance.cosine(u, v):计算一维数组之间的余弦距离。

u 和 v 之间的余弦距离定义为

enter image description here

其中 u⋅vuv 的点积。

使用上述公式,我们将得到一个使用 NumPy's broadcasting 的矢量化解决方案,就像这样 -

def self_cosine_vectorized(a):
dots = a.dot(a.T)
sqrt_sums = np.sqrt((a**2).sum(1))
cosine_dists = 1 - (dots/sqrt_sums)/sqrt_sums[:,None]
np.fill_diagonal(cosine_dists,0)
return cosine_dists

因此,得到dist -

dist = self_cosine_vectorized(df.values)  

运行时测试和验证

原始方法:

def original_app(data):
m, k = data.shape
dist = np.zeros((m, m))
for i in range(m):
for j in range(m):
if i!=j:
vec1 = data[i,:]
vec2 = data[j,:]
pairs = [(x, y) for (x, y) in zip(vec1, vec2) if x > 0 and y > 0]
if pairs:
sub_list_1, sub_list_2 = map(list, zip(*pairs))
dist[i][j] = cosine(sub_list_1, sub_list_2)
else:
dist[i][j]
else:
dist[i][j]=0
return dist

时间安排和验证 -

In [203]: data = np.random.rand(100,100)

In [204]: np.allclose(original_app(data), self_cosine_vectorized(data))
Out[204]: True

In [205]: %timeit original_app(data)
1 loops, best of 3: 813 ms per loop

In [206]: %timeit self_cosine_vectorized(data)
10000 loops, best of 3: 101 µs per loop

In [208]: 813000.0/101
Out[208]: 8049.504950495049

疯狂的8000x+加速!

关于python - 迭代 pandas 行并计算行之间的余弦距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42762593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com