我有一个包含多个向量的DataFrame,每个向量有3个条目。每行都是我表示的向量。我需要计算每个向量之间的余弦相似度。将其转换为矩阵表示更好还是DataFrame本身有更简洁的方法?
以下是我尝试过的代码。
import pandas as pd
from scipy import spatial
df = pd.DataFrame([X,Y,Z]).T
similarities = df.values.tolist()
for x in similarities:
for y in similarities:
result = 1 - spatial.distance.cosine(x, y)
答案 0 :(得分:10)
您可以直接使用sklearn.metrics.pairwise.cosine_similarity
。
<强>演示强>
import numpy as np; import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
df = pd.DataFrame(np.random.randint(0, 2, (3, 5)))
df
## 0 1 2 3 4
## 0 1 1 1 0 0
## 1 0 0 1 1 1
## 2 0 1 0 1 0
cosine_similarity(df)
## array([[ 1. , 0.33333333, 0.40824829],
## [ 0.33333333, 1. , 0.40824829],
## [ 0.40824829, 0.40824829, 1. ]])
答案 1 :(得分:0)
您可以从 sklearn.metrics.pairwise 导入 pairwise_distances 并传递要计算余弦相似度的数据帧,还可以传递超参数 metric='cosine',因为默认情况下,度量超参数是设置为“欧几里得”。
演示
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import pairwise_distances
df = pd.DataFrame(np.random.randint(0, 5, (3, 5)))
df
## 0 1 2 3 4
## 0 4 2 1 3 2
## 1 3 2 0 0 1
## 2 3 3 4 2 4
pairwise_distances(df,metrics='cosine)
##array([[2.22044605e-16, 1.74971353e-01, 1.59831950e-01],
[1.74971353e-01, 0.00000000e+00, 3.08976681e-01],
[1.59831950e-01, 3.08976681e-01, 0.00000000e+00]])