计算两个Pandas数据框列之间的余弦相似度以获取余弦距离。

3

我有一个如下所示的数据框:

vector_a            vector_b
[1,2,3]             [2,5,6]
[0,2,1]             [2,9,1]
[4,7,1]             [1,7,4]

我想要在同一数据框中使用sklearn的cosine_similarity对列向量vector_a和vector_b进行计算,以得到一个名为'cosine_distance'的新列。请注意,vector_a和vector_b是pandas dflist列。
这是我尝试过的代码:
df['vector_a'] = df['vector_a'].apply(lambda x: np.asarray(x))
df['vector_b'] = df['vector_b'].apply(lambda x: np.asarray(x))
df['cosine_distance'] = cosine_similarity(df['vector_a'].apply(lambda x: np.transpose(x)), 
                                          df['vector_b'].apply(lambda x: np.transpose(x)))

我遇到了这个错误:

---> 58         df['cosine_distance'] = cosine_similarity(df['vector_a'].apply(lambda x: np.transpose(x)), df['vector_b'].apply(lambda x: np.transpose(x)))

~\Anaconda3\lib\site-packages\sklearn\metrics\pairwise.py in cosine_similarity(X, Y, dense_output)
   1025     # to avoid recursive import
   1026 
-> 1027     X, Y = check_pairwise_arrays(X, Y)
   1028 
   1029     X_normalized = normalize(X, copy=True)

~\Anaconda3\lib\site-packages\sklearn\metrics\pairwise.py in check_pairwise_arrays(X, Y, precomputed, dtype)
    110     else:
    111         X = check_array(X, accept_sparse='csr', dtype=dtype,
--> 112                         estimator=estimator)
    113         Y = check_array(Y, accept_sparse='csr', dtype=dtype,
    114                         estimator=estimator)

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    494             try:
    495                 warnings.simplefilter('error', ComplexWarning)
--> 496                 array = np.asarray(array, dtype=dtype, order=order)
    497             except ComplexWarning:
    498                 raise ValueError("Complex data not supported\n"

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: setting an array element with a sequence.

非常感谢您的提前帮助!

1个回答

4

简而言之:

df['cosine_similarity'] = df.apply(
    lambda row: cosine_similarity([row['vector_a']], [row['vector_b']])[0][0],
    axis=1)

解释:

  • cosine_similarity函数需要传入2D的np.array或者是一个嵌套列表。它无法理解pd.Series类型的列表。即使我们将其转换为嵌套列表,下一个问题也会出现:
  • cosine_similarity函数返回的是全对全的相似度矩阵。因此,我们需要限制成成对比较,并且人为地添加了一个维度(请注意[row['vector_a']], [row['vector_b']]中的额外方括号),然后取1x1数组中唯一的元素(在cosine_similarity(...)[0][0]末尾的零)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接