python - 计算没有 scipy、sklearn.metrics.pairwise 的余弦相似度矩阵
问题描述
假设我有一个这样的矩阵:
[[5.05537647 4.96643654 4.88792309 4.48089566 4.4469417 3.7841264]
[4.81800568 4.75527558 4.69862751 3.81999698 3.7841264 3.68258605]
[4.64717983 4.60021917 4.55716111 4.07718641 4.0245128 4.69862751]
[4.51752158 4.35840703 4.30839634 3.97312429 3.9655597 3.68258605]
[4.38592909 4.33261686 4.2856032 4.26411249 4.24381326 3.7841264]]
我需要计算矩阵行之间的余弦相似度,但不使用“scipy”和“sklearn.metrics.pairwise”中的余弦相似度。但我可以使用“数学”。
我用这段代码试过了,但我不明白如何遍历矩阵的每一行。
import math
def cosine_similarity(matrix):
for row1 in matrix:
for row2 in matrix:
sum1, sum2, sum3 = 0, 0, 0
for i in range(len(row1)):
a = row1[i]; b = row2[i]
sum1 += a*a
sum2 += b*b
sum3 += a*b
return sum3 / math.sqrt(sum1*sum2)
cosine_similarity(matrix)
你有什么想法我该怎么做?谢谢!
解决方案
您可以使用矢量化操作,因为您有一个 numpy 矩阵。此外,math.sqrt
因此不允许矢量化操作,您可以使用np.sqrt
矢量化平方根操作。以下是将相似性索引存储在列表中并返回的代码。
import numpy as np
def cosine_similarity(matrix):
sim_index = []
for row1 in matrix:
for row2 in matrix:
sim_index.append(sum(row1*row2)/np.sqrt(sum(row1**2) * sum(row2**2)))
return sim_index
cosine_similarity(matrix)
# 1.0,0.9985287276116063,0.9943589065201967,0.9995100043150523,0.9986115804314727,0.9985287276116063,1.0,0.9952419798474134,0.9984515542959852,0.9957338741601842,0.9943589065201967,0.9952419798474134,1.0,0.9970632589904104,0.9962784686967592,0.9995100043150523,0.9984515542959852,0.9970632589904104,1.0,0.9992584450362125,0.9986115804314727,0.9957338741601842,0.9962784686967592,0.9992584450362125,1.0
使用列表理解的进一步短代码
sim_index = np.array([sum(r1*r2)/np.sqrt(sum(r1**2) * sum(r2**2)) for r1 in matrix for r2 in matrix])
最终列表将转换为数组以进行整形以进行绘图。
可视化相似度矩阵:这里因为每一行都与自身完全相同,所以相似度指数为 1(黄色)。因此,绘制的矩阵的对角线是完全黄色的(索引 = 1)。
import matplotlib.pyplot as plt
plt.imshow(sim_index.reshape((5,5)))
plt.colorbar()
推荐阅读
- r - 如果多列具有负值,则添加新列
- c++ - 像 std::integral_constant 但在 std C++20 库中带有自动模板参数的东西?
- victory-charts - 在胜利图中显示内插 Y 值
- flask - 启动后自动运行烧瓶
- python - 安装后 Anaconda Prompt 和 Navigator 丢失
- php - 向不同类型的角色显示内容,但不是全部
- flutter - Riverpod 不必要的重建
- postgresql - Postgres.app 中的 initdb 不会创建 postgres &template1 数据库
- python - 如何在python中预处理包含网站链接(主机页面和登陆页面)的数据以进行机器学习训练?
- html - ..code:: 中的彩色文本 - reStructuredText 中的环境 - 文件 (.rst)