相似度算法

余弦相似度算法

余弦相似度算法

推荐系统中余弦相似度算法比较常用,与欧几里得不同,欧几里得比较常见,是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。
余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
另外:余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异

余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。余弦相似度通常用于正空间,因此给出的值为-1到1之间。
两个向量间的余弦值可以通过使用欧几里得点积公式求出:
在这里插入图片描述

给定两个属性向量,A和B,其余弦相似性θ由点积和向量长度给出,如下所示:
在这里插入图片描述

import math
import numpy as np

class similarity():
    # 向量与向量的余弦相似度
    def vector_similarity(self,Vector_A,Vector_B):
        fz, fmA, fmB = 0, 0, 0
        for i, j in zip(Vector_A,Vector_B):
            fz += i * j
            fmA += i * i
            fmB += j * j
        if fz * fmA *fmB == 0:return 0
        return fz / (math.sqrt(fmA) * math.sqrt(fmB))

    # 矩阵与矩阵的余弦相似度
    def Matrix_similarity(self, Matrix_C, Matrix_D):
        res = []
        for i, j in zip(Matrix_C, Matrix_D):
            res0, res1, res2 = 0, 0, 0
            for k in range(len(Matrix_C[0])):
                res0 += i[k] * j[k]
                res1 += i[k] * i[k]
                res2 += j[k] * j[k]
            res.append(res0 / (math.sqrt(res1) * math.sqrt(res2)))
        return res

    # 向量与向量的余弦相似度 numpy
    def vector_similarity2(self,Vector_A,Vector_B):
        return np.sum(Vector_A * Vector_B) / (np.sqrt(np.sum(Vector_A * Vector_A)) * np.sqrt(np.sum(Vector_B * Vector_B)))

    # 矩阵与矩阵的余弦相似度 numpy
    def Matrix_similarity2(self, Matrix_C, Matrix_D):
        return np.sum(Matrix_C * Matrix_D, axis=1) / (np.sqrt(np.sum(Matrix_C ** 2, axis=1)) * np.sqrt(np.sum(Matrix_D ** 2, axis=1)))

if __name__ == '__main__':
    vector_A = [1, 3, 5, 7, 2, 4, 6]
    vector_B = [1, 3, 5, 7, 2, 4, 7]
    Matrix_C = [
        [2, 2, 1, 1, 2, 2, 2, 2],
        [2, 2, 1, 1, 2, 2, 2, 2],
        [1, 1, 2, 2, 2, 2, 2, 2]
    ]
    Matrix_D = [
        [1, 0, 1, 1, 2, 2, 2, 2],
        [1, 1, 2, 2, 2, 2, 2, 2],
        [1, 1, 1, 1, 2, 2, 2, 2]
    ]

    A = np.array([1, 3, 5, 7, 2, 4, 6])
    B = np.array([1, 3, 5, 7, 2, 4, 7])
    C = np.array([
        [2, 2, 1, 1, 2, 2, 2, 2],
        [2, 2, 1, 1, 2, 2, 2, 2],
        [1, 1, 2, 2, 2, 2, 2, 2]
    ])
    D = np.array([
        [1, 0, 1, 1, 2, 2, 2, 2],
        [1, 1, 2, 2, 2, 2, 2, 2],
        [1, 1, 1, 1, 2, 2, 2, 2]
    ])

    print(similarity().vector_similarity(vector_A, vector_B))
    print(similarity().vector_similarity2(A, B))

    print(similarity().Matrix_similarity(Matrix_C, Matrix_D))
    print(similarity().Matrix_similarity2(C, D))

结果:

D:\Anaconda\python.exe F:/Jupyter/recommend_workdemo/coSine.py
0.9975694083904585
0.9975694083904585
[0.8998425413316951, 0.9230769230769232, 0.9647638212377322]
[0.89984254 0.92307692 0.96476382]

Process finished with exit code 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值