本文均将相似度值在0-1范围内
欧式距离
归一到0-1之间:
代码实现:
def euclid_sim(in_a, in_b):
return 1 / (1 + linalg.norm(in_a - in_b))
皮尔逊相关系数
归一到0-1之间:
代码实现:
def pears_sim(in_a, in_b):
return 0.5 + 0.5 * corrcoef(in_a, in_b)[0][1]
余弦相似度
归一到0-1之间:
代码实现:
def cos_sim(in_a, in_b):
return 0.5 + 0.5 * float(in_a * in_b.T) / linalg.norm(in_a) / linalg.norm(in_b)
示例
from numpy import linalg, mat, corrcoef
def euclid_sim(in_a, in_b):
return 1 / (1 + linalg.norm(in_a - in_b))
def pears_sim(in_a, in_b):
return 0.5 + 0.5 * corrcoef(in_a, in_b)[0][1]
def cos_sim(in_a, in_b):
return 0.5 + 0.5 * float(in_a * in_b.T) / linalg.norm(in_a) / linalg.norm(in_b)
def main():
my_mat = mat([[2, 5, 2],
[0, 5, 4],
[0, 5, 2],
[4, 3, 1],
[4, 3, 2]])
print(euclid_sim(my_mat[0, :], my_mat[4, :]))
print(pears_sim(my_mat[0, :], my_mat[4, :]))
print(cos_sim(my_mat[0, :], my_mat[4, :]))
if __name__ == '__main__':
main()
输出
0.2612038749637414
0.5
0.9363930240887843