余弦相似度算法
余弦相似度算法
推荐系统中余弦相似度算法比较常用,与欧几里得不同,欧几里得比较常见,是一个通常采用的距离定义,指在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