python - cosine_similarity 2 pandas df 列之间的余弦距离

标签 python pandas scikit-learn cosine-similarity

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

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

我想在列 vector_a 和 vector_b 之间执行 sklearn 的 cosine_similarity 以获得同一数据帧中名为“cosine_distance”的新列。请注意 vector_a 和 vector_b 是 list 的 pandas df 列。

这是我尝试过的:

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.

提前致谢!

最佳答案

简单描述:

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] 末尾的零)

关于python - cosine_similarity 2 pandas df 列之间的余弦距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59549132/

相关文章:

python - 访问 Pandas 数据框列的正确方法

python - 使用 matplotlib 绘制两种不同的 SVM 方法有问题吗?

python - 如何向 CountVectorizer 添加权重因子

python - 在 for 循环中重复回答

python - 在 Python/R 中查找 LDA 后不同主题的数量

python - 根据列值将列表转换为元组字典

python - Numpy:使用矩阵切片体积

python - Pandas 可以在不修改文件其余部分的情况下读取和修改单个 Excel 文件工作表(选项卡)吗?

python - sklearn 库中 .score() 和 .predict 的区别?

python - 自动保存构造函数参数