相似度算法原理及python实现

“古之善为士者,微妙玄通,深不可识。
夫唯不可识。
故强为之容:豫兮,若冬涉川;犹兮,若畏四邻;俨兮,其若客;涣兮,若冰之将释;孰兮,其若朴;旷兮,其若谷;浑兮,其若浊。
孰能浊以止,静之徐清?
孰能安以久,动之徐生?”[1]

在数据挖掘和数据分析中,经常会遇到需要知道个体数据间差异的大小,进而需要得到个体数据间的相似度,最常见的就是电商平台中对于物品的推荐以及内容平台中对于信息的推送等等。
相似度就是两个item之间的相似性,一般就是计算两个item的特征之间的距离,距离越大,相似度越小;距离越小,相似度越大;也可以两个向量间的夹角来表示,夹角越大,相似度越小;夹角越小,相似度越大;
常用的有以下四种方法:

  • 欧几里得距离(Eucledian Distance)或称 欧氏距离
  • 余弦相似度 (Cosine Similarity)
  • 杰卡德相似系数(Jaccard Similarity coefficient)
  • 皮尔逊相关系数(Pearson correlation)

欧几里得距离 or 欧氏距离

两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:


EuclideanDistance.png

python代码常用的有两种,一种使用numpay,一种使用scipy:

import numpy as np
x=np.random.random(8)
y=np.random.random(8)
d1=np.sqrt(np.sum(np.square(x-y)))
d1

输出:

1.1282380087788222
from scipy.spatial.distance import pdist
z=np.vstack([x,y])
d2=pdist(z)
d2

输出:

array([ 1.12823801])

余弦相似度 (Cosine Similarity)

也可以叫余弦相似度。 几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。余弦取值范围为[-1,1]。求得两个向量的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征这两个向量的相似性。夹角越小,趋近于0度,余弦值越接近于1,它们的方向更加吻合,则越相似。当两个向量的方向完全相反夹角余弦取最小值-1。当余弦值为0时,两向量正交,夹角为90度。因此可以看出,余弦相似度与向量的幅值无关,只与向量的方向相关。
两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦:


CosineSimilarity.png
d3=np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))
d3

输出:

0.70543665237781283
z=np.vstack([x,y])
d4=1-pdist(z,'cosine')
d4

输出:

array([ 0.70543665])

杰卡德相似系数(Jaccard Similarity coefficient)

杰卡德相似系数


JaccardSimilarity01.png

两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。杰卡德相似系数是衡量两个集合的相似度一种指标。

杰卡德距离


JaccardSimilarity02.png

与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

杰卡德相似系数代码实现:

import numpy as np
from scipy.spatial.distance import pdist
x=np.random.random(8)>0.5
y=np.random.random(8)>0.5

x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)

#方法一:根据公式求解
up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())
down=np.double(np.bitwise_or(x != 0, y != 0).sum())
d1=(up/down)
           

#方法二:根据scipy库求解
X=np.vstack([x,y])
d2=pdist(X,'jaccard')

皮尔逊相关系数(Pearson correlation)

皮尔逊相关系数的定义


PearsonCorrelation01.png

前面提到的余弦相似度只与向量方向有关,但它会受到向量的平移影响,在夹角余弦公式中如果将 x 平移到 x+1, 余弦值就会改变。怎样才能实现平移不变性?这就要用到皮尔逊相关系数(Pearson correlation),有时候也直接叫相关系数。
如果将夹角余弦公式写成:


PearsonCorrelation02.gif

表示向量x和向量y之间的夹角余弦,则皮尔逊相关系数则可表示为:
PearsonCorrelation03.gif

皮尔逊相关系数具有平移不变性和尺度不变性,计算出了两个向量(维度)的相关性。

import numpy as np
x=np.random.random(8)
y=np.random.random(8)

#方法一:根据公式求解
x_=x-np.mean(x)
y_=y-np.mean(y)
d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_))

#方法二:根据numpy库求解
X=np.vstack([x,y])
d2=np.corrcoef(X)[0][1]

相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。


  1. 老子《道德经》第十五章,老子故里,中国鹿邑。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容