乐趣区

关于python3.x:推荐系统基础相似度计算

一. 类似度计算方法

  1. 欧式间隔
  2. 杰卡德 (Jaccard) 类似度
  3. 余弦类似度
  4. 皮尔逊 (Pearson) 类似度

1. 欧式间隔

欧式空间下度量间隔的办法, 两个物体, 都在同一个空间下示意为两个点, 如果叫做 p,q, 别离都是 n 个坐标, 那么欧式间隔就是掂量这两个点之间的间隔. 欧氏间隔不适用于布尔向量之间
计算公式:

$$

xE(p,q) = \sqrt{\sum_{i=1}^n (p_i – q_i)^2}

$$

欧氏间隔的值是一个 非正数, 最大值正无穷 , 通常计算类似度的后果心愿是[-1,1] 或[0,1]之间, 个别能够应用
​ 如下转化公式:

$$
1/1+E(p,q)
$$

2. 杰卡德(Jaccard)

两个汇合的交加元素个数在并集中所占的比例, 十分实用于布尔向量示意, 分子是两个布尔向量做点积计算, 失去的就是交加元素的个数, 母是两个布尔向量做或运算
计算公式:

代码实现:

def jaccard_similar():
    Nu = {'A', 'C', 'D'}
    Nv = {'A', 'B', 'D', 'E'}
    similarity = len(Nu & Nv) / len(Nu | Nv)
    print(similarity)

3. 余弦类似度

度量的是两个向量之间的夹角, 用夹角的余弦值来度量类似的状况, 余弦类似度在度量文本类似度, 用户类似度, 物品类似度的时候较为罕用余弦类似度的特点, 与向量长度无关, 余弦类似度计算要对向量长度归一化, 两个向量只有方向统一, 无论水平强弱, 都能够视为 ’ 类似 ’

计算公式:

代码实现:

def UserSimilarity(train):
 W = dict()
 for u in train.keys(): 
    for v in train.keys():
         if u == v:
             continue
         W[u][v] = len(train[u] & train[v])
         W[u][v] /= math.sqrt(len(train[u]) * len(train[v]) * 1.0)
 return W 

4. 皮尔逊 (Pearson) 类似度

实际上也是一种余弦类似度, 不过先对向量做了中心化, 向量 a b 各自减去向量的均值后, 再计算余弦类似度, 皮尔逊相关系数度量的是两个变量的变化趋势是否统一, 不适宜计算布尔值向量之间的相关度
计算公式:

代码实现:
调用 pandas.DataFrame 中的 corr()办法

ratings_matrix.T.corr()
退出移动版