一.类似度计算方法

  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()