python - 余弦相似度优化实现

标签 python python-2.7 optimization mathematical-optimization

我试图理解这个优化的代码以找到用户矩阵之间的余弦相似度。

def fast_similarity(ratings,epsilon=1e-9):
    # epsilon -> small number for handling dived-by-zero errors
    sim = ratings.T.dot(ratings) + epsilon
    norms = np.array([np.sqrt(np.diagonal(sim))])
    return (sim / norms / norms.T)

如果评分 =
           items           
     u  [
     s    [1,2,3]
     e    [4,5,6]
     r    [7,8,9] 
     s  ]

nomrs 将等于 = [1^2 + 5^2 + 9^2]

但是为什么我们要编写 sim/norms/norms.T 来计算余弦相似度?
任何帮助表示赞赏。

最佳答案

通过代码,我们有:

first

这意味着,sim 的对角线之一矩阵我们有每列相乘的结果。

如果你想使用一个简单的矩阵,你可以试一试:

second

您可以轻松检查此 gram matrix (这就是矩阵产品的命名方式)具有此属性。

现在代码定义了 norms这只不过是一个数组,取我们 gram matrix 的对角线并在它的每个元素上应用一个 sqrt。

这将为我们提供一个包含每列的范数值的数组:

third

所以基本上是norms向量包含 result 每一列的范数值矩阵。

一旦我们拥有所有这些数据,我们就可以评估这些用户之间的余弦相似度,因此我们知道余弦相似度的评估方式如下:

forth

注意 :
fifth

所以我们有我们的相似性将是:

six

所以我们只需要用我们的代码变量替换这些术语就可以得到:

seven

这解释了为什么你有这行代码:

return sim / norms / norms.T

编辑:
由于似乎我不清楚,所以每次我在这个答案中谈论矩阵乘法时,我都指的是 DOT PRODUCT两个矩阵。

This actually means that when it's written A*B we actually develop and solve as A.T * B

关于python - 余弦相似度优化实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087011/

相关文章:

无需 CLI 即可运行的 Python 脚本不采用命令行参数

ruby-on-rails - 在散列中找到低于前一个数字的第一个键/值的最快方法

python - Python 中的 Dickey-Fuller 测试

python - 使用 BeautifulSoup 解析 HTML 表格

python - 如果列表中的项目位于另一个列表中,则将其从列表中删除,同时保留重复项 - Python

c++ - 为什么左移运算符比乘法 (C++) 慢?

python - 限制 google OR-Tools 上的系数值

python - 如何防止将变量重新分配给同一类的对象以保留以前的数据?

python - 有没有办法使用 Python-C API 调整 python 列表的大小?

python - 从给定系列计算 pi 值时答案不正确