起因:
最近在写大论文,会涉及到一些相似度的原理,在这里做个笔记。
余弦相似度
上公式:
上原理:
上示例:
优缺点:
从公式的计算方式与实际情况相结合进行分析总结。(我就不写了,论文查重,你懂的!)
上代码:
import numpy as np
def cos(a,b):
a = np.array(a)
b = np.array(b)
mul = sum(a * b)
m = np.sqrt(sum(a**2)) * np.sqrt(sum(b**2))
result = mul / m
return result
Kendall相似系数
上公式:
上示例:
上代码:
def Kendall(x, y=None):
print("用户一评论项目:",x)
print("用户二评论项目:", y)
cnt = len(x)
print("x(即item共有)长度:",cnt)
coeff = 0.0
co_num = 0 # 记录比较的次数
if y == None:
y = range(1, cnt + 1)
for i in range(cnt):
if x[i] ==0 or y[i] == 0:
continue
for j in range(cnt):
j += i
if(i==j):
continue
if(j>=cnt): # 此1]-x[2]再计算x[2]-x[1]
break
if x[j] == 0 or y[j] == 0:
continue
co_num += 1
mark = (x[i] - x[j]) * (y[i] - y[j])
if mark >= 0:
coeff += 1.0
elif mark < 0:
coeff -= 1.0
print("一致性元素减去非一致性元素的对数:",coeff) # 一致同减的幅度不同)
print("比较次数",co_num)
kendall_sim = coeff / co_num #一致性元素减去非一致性元素除以比较的次数
return kendall_sim
Jaccard
上公式:
上示例:
上代码:
def jaccard(p,q):
i = 0 #两个用户共有的项目数
i_p = 0 # 用户p评价的项目数
i_q = 0 # 用户q评价的项目数
for j in range(len(p)): # len(p)为总的项目数
if p[j] != 0 and q[j] != 0: # 计算p与q共有项目的个数i
i = i+1
else:
continue
for j in range(len(p)):
if p[j] != 0:
i_p = i_p + 1
else:
continue
for j in range(len(p)):
if q[j] != 0:
i_q += 1
else:
continue
print("用户一评论的项目数:%d"%(i_p))
print("用户二评论的项目数:%d"%(i_q))
print("用户一与用户二共同评论的项目数:%d"%(i))
return i / (i_p + i_q - i)