zoukankan      html  css  js  c++  java
  • 余弦相似度

    一、定义

    余弦取值范围为[-1,1]。求得两个向量的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性。夹角越小,趋近于0度,余弦值越接近于1,它们的方向更加吻合,则越相似。当两个向量的方向完全相反夹角余弦取最小值-1。当余弦值为0时,两向量正交,夹角为90度。因此可以看出,余弦相似度与向量的幅值无关,只与向量的方向相关。

    由于连续离散点连线的斜率存在无穷大的问题,所以,把角度和斜率转换为向量夹角余弦值,方便比较相似度。
    ​​

    二、一维数组余弦相似度

    import numpy as np
    import math
    
    def cos_sim(vector_a, vector_b):
        """
        计算两个向量之间的余弦相似度
        :param vector_a: 向量 a
        :param vector_b: 向量 b
        :return: sim
        """
        vector_a = np.mat(vector_a)
        vector_b = np.mat(vector_b)
        num = float(vector_a * vector_b.T)
        # 或者用np自带的matmul()
        # num = np.matmul(vector_a,vector_b.T)
        denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
        cos = num / denom
        return cos
    a = [0.1,0.2,0.3]
    b = [2,3,4]
    print(cos_sim(a,b))
    

    尝试使用如下代码,结果显示:ambigous。

    def cos(vector1,vector2):
        dot_product = 0.0
        normA = 0.0
        normB = 0.0
        for a,b in zip(vector1,vector2):
            dot_product += a*b
            normA += a**2
            normB += b**2
        if normA == 0.0 or normB==0.0:
            return None
        else:
            return dot_product / ((normA*normB)**0.5)
    

    三、数组之间相似度

    def get_cos_similar_matrix(self,v1, v2):
        """
        计算两个数组之间的余弦相似度
        :param v1:
        :param v2:
        :return:
        """
        num = np.dot(v1, np.array(v2).T)  # 向量点乘
        denom = np.linalg.norm(v1, axis=1).reshape(-1, 1) * np.linalg.norm(v2, axis=1)  # 求模长的乘积
        res = num / denom
        res[np.isneginf(res)] = 0
        return res
    

    四、向量和矩阵的余弦相似度

    def get_cos_similar_multi(v1: list, v2: list):
        num = np.dot([v1], np.array(v2).T)  # 向量点乘
        denom = np.linalg.norm(v1) * np.linalg.norm(v2, axis=1)  # 求模长的乘积
        res = num / denom
        res[np.isneginf(res)] = 0
    
  • 相关阅读:
    node-webkit 笔记
    CEF 相关资料
    输出重定向
    FindProcDLL::FindProc 和 KillProcDLL::KillProc,必须使用WPF x86编译出来的程序
    wpf xaml inlines
    Gradle 笔记
    Android手机的 storage
    SpringMVC 工作原理详解
    SpringMVC 面试题
    18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)
  • 原文地址:https://www.cnblogs.com/leimu/p/14596031.html
Copyright © 2011-2022 走看看