余弦相似度


一、定義

余弦取值范圍為[-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM