我在 pyspark 中有一个共现矩阵,用于某些关键字 A、B、C 的共现
A B C
A 5 1 0
B 1 3 2
C 0 2 3
Run Code Online (Sandbox Code Playgroud)
如何在 Python 中计算所有关键字的该矩阵的 jaccard 相似度。是否有任何库可以做到这一点,或者我应该简单地使用 Jaccard 相似度公式来计算相似度?
假设共现矩阵以列表的形式给出:
\ncom = [[5, 1, 0], \n [1, 3, 2],\n [0, 2, 3]]\nn_elem = len(com)\nRun Code Online (Sandbox Code Playgroud)\n两个集合的Jaccard相似度A和B由 给出|A \xe2\x88\xa9 B| / |A \xe2\x88\xaa B|。|A|共现矩阵给出、|B|和的值|A \xe2\x88\xa9 B|。的值|A \xe2\x88\xaa B|很简单|A| + |B| - |A \xe2\x88\xa9 B|,我们可以找到 Jaccard 索引。
首先,让我们创建一个列表列表,其中包含与 大小相同的列表com。默认值是1因为集合与其自身的相似度指数为1,我们不会计算这些元素:
similarity = [[1 for _ in row] for row in com]\nRun Code Online (Sandbox Code Playgroud)\n现在,我们可以循环遍历每对值com并计算相似度。内循环从 开始,i+1因为similarity[i][j]与 相同similarity[j][i],所以我们只需要计算矩阵的上三角形:
for i in range(n_elem):\n a = com[i][i] # |A|\n for j in range(i+1, n_elem):\n b = com[j][j] # |B|\n aib = com[i][j] # |A \xe2\x88\xa9 B|\n aub = a + b - aib # |A \xe2\x88\xaa B|\n # Set both off-diagonal elements simultaneously\n similarity[i][j] = similarity[j][i] = aib / aub\nRun Code Online (Sandbox Code Playgroud)\n这给我们留下了以下similarity矩阵:
[[1 , 0.14285714285714285, 0.0], \n [0.14285714285714285, 1 , 0.5], \n [0.0 , 0.5 , 1]]\nRun Code Online (Sandbox Code Playgroud)\n现在,如果您的共现矩阵是 numpy 数组(或者您愿意使用 numpy),您可以通过将循环外包给 numpy 的 C 后端来加速计算。
\nimport numpy as np\ncom_arr = np.array([[5, 1, 0], \n [1, 3, 2],\n [0, 2, 3]])\nn_elem = com_arr.size\nRun Code Online (Sandbox Code Playgroud)\n首先,我们可以使用矩阵的对角线得到每个元素的出现次数:
\nocc = np.diag(com_arr) # array([5, 3, 3])\nRun Code Online (Sandbox Code Playgroud)\n接下来,创建 的矩阵|A \xe2\x88\xaa B|。请记住,|A \xe2\x88\xa9 B|已经由 指定com_arr:
aub = occ[:, None] + occ[None, :] - com_arr\nRun Code Online (Sandbox Code Playgroud)\n由于occ是一维数组,因此添加索引将分别创建一列(形状为 的列向量)和一行(形状为 的行向量)None的二维数组。将行向量添加到列向量时,numpy 会自动广播维度,以便最终得到形状为 的(在本例中)方阵。现在,看起来像这样:(3, 1)(1, 3)(3, 3)aub
array([[5, 7, 8],\n [7, 3, 4],\n [8, 4, 3]])\nRun Code Online (Sandbox Code Playgroud)\n最后,将交集除以并集:
\nsimilarity = com_arr / aub\nRun Code Online (Sandbox Code Playgroud)\n瞧,我们的值与以前相同:
\narray([[1. , 0.14285714, 0. ],\n [0.14285714, 1. , 0.5 ],\n [0. , 0.5 , 1. ]])\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |