精华内容
下载资源
问答
  • 这个简短的代码提供了一个用于二进制向量的 Tanimoto 距离计算器。 它模拟统计工具箱的 pdist 函数,该函数不提供 Tanimoto 距离选项。
  • 自述文件 这是一个Rails应用程序,用于在信息检索和存储的项目工作中计算蛋白质之间的相似性561 要在本地运行此应用程序,您需要安装ruby 2.0.0,rails 4.1.2。 从终端捆绑安装运行 从终端导轨运行 ...
  • 集体智慧编程正式开始了接触,第一...这里重点讲了三个计算相似程度的评价方法:欧几里德距离、皮尔逊相关度、Tanimoto 测试数据如下:(就是嵌套字典,共7个人对使用过的商品的评价) critics={'Lisa Rose': {'L...

    集体智慧编程正式开始了接触,第一课便是如何寻找想进用户(也就是两者的相似程度),正如大多数的推送服务一样,通过计算你和其他的用户的相似程度,给你推荐最佳匹配人认为很好的但是你还没有购买的东西。

    这里重点讲了三个计算相似程度的评价方法:欧几里德距离、皮尔逊相关度、Tanimoto

    测试数据如下:(就是嵌套字典,共7个人对使用过的商品的评价)

    critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
     'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 
     'The Night Listener': 3.0},
    'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 
     'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 
     'You, Me and Dupree': 3.5}, 
    'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,
     'Superman Returns': 3.5, 'The Night Listener': 4.0},
    'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,
     'The Night Listener': 4.5, 'Superman Returns': 4.0, 
     'You, Me and Dupree': 2.5},
    'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 
     'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,
     'You, Me and Dupree': 2.0}, 
    'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,
     'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
    'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}

     

    一:欧几里德距离

     

    原理很简单,降维理解:已知直角三角形的两直角边,求斜边长度。

    通过两者曾共同使用、评价过的东西来计算。例如:以人们一致评价过的物品为坐标轴,将参与评价的人绘制到图上,以此来考查他们的远近关系。简单的二维图如下:

    Toby(1,4.5),若两者在“偏好空间”越相近,则两者越相似。由于这是二维图,所以同一时间只能看到两项评分。可以看下面代码,仔细理解一下,在多维情况下依旧适用。(每个共有物品都会做比较)

    #欧几里德距离
    from math import sqrt
    def sim_distance(prefs,person1,person2):
    	si = {}
    	for item in prefs[person1]:
    		if(item in prefs[person2]):
    			si[item] = 1
    	if(len(si) == 0):
    		return 0					#上面的代码应该可以省略
    	sum_of_squares = sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])
    	return (1/(1+sqrt(sum_of_squares)))    #下面解释一下
    
    sim = sim_distance(critics,'Lisa Rose','Gene Seymour')
    print(sim)

    解释:上面的sum_of_squares越小,两者距离越近,越相似。但我们需要一个函数对偏好越近的情况给出越大值,所以我们对开方后的值加1(防止分母为0),再取倒数。

    适合于特征数据量较小的情况

    二:皮尔逊相关度

    这个相对于欧几里德距离要复杂一点。它的一个好处是,当两者对一件物品的评分差距较大时,并不一定两者不想近,如果他两对于其他的物品评价也有差距,但是都是正相关,那两者的相似度还是相近的。这个比欧几里德距离准确。

    它是存在一条拟合线的,这条线尽量靠近所有点,结果也是求所有点和这条线的拟合程度。皮尔逊相关度评价算法首先会找出两位评论者都曾评论过的物品,然后计算两者的评分总和与平方和,并求得评分的乘积之和。最后,算法利用这些计算结果计算出皮尔逊相关度。

    #皮尔逊相关度
    from math import sqrt
    def sim_pearson(prefs,person1,person2):
    	si = {}
    	for item in prefs[person1]:
    		if(item in prefs[person2]):
    			si[item] = 1
    	n = len(si)
    	if(n == 0):
    		return 0
    	#求和
    	sum1 = sum(prefs[person1][item] for item in si)
    	sum2 = sum(prefs[person2][item] for item in si)
    	#求平方和
    	sum1_sq = sum(pow(prefs[person1][item],2) for item in si)
    	sum2_sq = sum(pow(prefs[person2][item],2) for item in si)
    	#求乘积和
    	asum = sum(prefs[person1][item]*prefs[person2][item] for item in si)
    	#计算皮尔逊评价值
    	num = asum-(sum1*sum2/n)
    	den = sqrt((sum1_sq-pow(sum1,2)/n)*(sum2_sq-pow(sum2,2)/n))
    	if(den == 0):
    		return 0
    	return (num/den)
    
    sim = sim_pearson(critics,'Lisa Rose','Gene Seymour')
    print(sim)

    适合于特征数据量较大的情况(效果较好)

    三:Tanimoto

    Tanimoto感觉比较简单:

        交集/并集

        这是一个计算交集和并集的比率的方法

       度量两个集合之间的相似程度的方法。 
        A=[1,2,3,4]                 列表长度:4
        B=[1,2,7]                     列表长度:3
        C = A & B = [1,2]        列表长度:2
        T = Nc / ( Na + Nb -Nc) = len(c) / ( len(a) + len(b) - len(c)) = 2 / (4+3-2) = 0.4 

    def tanimoto(p,q):
    	c = [v for v in p if v in q]
    	return float(len(c)) / ((len(p) + len(q) - len(c)))

        可以用户计算用户之间的相似程度,这种方法适用于:数据表示为0、1这种二值化,而非有数量大小的情况

     

    以上为全部内容,在查找物品、人物相似程度上都是比较简单的算法,各自都有适用于的场景。

    展开全文
  • Tanimoto系数

    千次阅读 2017-05-17 16:40:53
    Tanimoto系数和皮尔逊系数还要欧氏距离一样可以用来判断两个数据的相关程度。 Tanimoto系数可以表示为两个集合的交比上两个集合的并举例: 两个人拥有相同的东西/两个人所有的东西 可以看出两个人的相关程度,...

    Tanimoto系数和皮尔逊系数还要欧氏距离一样可以用来判断两个数据的相关程度。
    Tanimoto系数可以表示为公式两个集合的交比上两个集合的并

    举例:
    两个人拥有相同的东西/两个人所有的东西
    可以看出两个人的相关程度,如果拥有相同东西越多表明两个人的兴趣爱好越相同(一般情况下)

    展开全文
  • Tanimoto相似度与Bregman距离

    万次阅读 2014-06-06 20:26:36
    之前写过一篇距离与相似...Tanimoto系数由Jaccard系数扩展而来。用来计算稀疏非二值不平衡向量的相似性,类似cosine距离 Bregman距离是一个数学通式,许多的距离,如欧式距离,KL距离等等都可以有Bregman公式推导而来。

    之前写过一篇距离与相似性度量的blog,这里添加两个少见的相似性度量方法,并且再扩展一些东西。

    之前的blog: http://blog.csdn.net/ice110956/article/details/14143991


    Tanimoto 系数

    Tanimoto系数由Jaccard系数扩展而来。首先引入Jaccard系数。

    Jaccard系数

    两个特征向量A,B,如果其值都是0,1的二值数据,那么有一个简单的判定相似性的方法:

    F00 = A中为0并且B中也为0的个数

    F10 = A1 B0的个数

    F01 = A0 B1的个数

    F11 = A1 B1 的个数

    那么可以定义这么一个similarity:


    这叫做(simplematch coefficient)SMC,简单匹配系数。

     

    很多情况下,两个向量中,0的个数会大大多于1的个数,也就很稀疏,类不平衡。这时候不同向量之间的SMC会因为过多出现的0而没有效果。

    那么我们可以只考虑F11,得到:

    这也就是Jaccard距离。

     

    如果把两个向量看作两个集合,0为此元素不存在,1为此元素存在,那么Jaccard距离就是很好地比较两个集合相似性的度量方法。在集合的相似度计算中,Jaccard距离可以写成:

     

    扩张Jaccard

    如果这个时候,还是很稀疏,但是值是非二值的,该怎么办?

    一种简单的方法就是用cosine距离:


    cosine距离是处理稀疏非二值特征的很好的选择。


    但是,我们还想以Jaccard距离的思维来做又要如何?如下:


    如果我们的x,y都是二值向量,那么如上公式就会得到Jaccard距离。

    分子项,只有两个均非0才会有非0的有用结果,类似于F11,不过这里不是简单的计数,而是用数乘来表示。

    分母项,2范数表示大小,也只有非0的项才有贡献,再减去xy即共同的,这个类似

    以上是通过观察得出的结论,具体推导不知。

     

    SMC距离在一般的非不平衡二值问题上计算应该比较方便。

    Jaccard在文本分类等不平衡二值问题上有所作为

    Tanimoto的话,没用过,效果不知道有没有cosine好。应该会得到一个类似cosine的结果。

     

    Bregman 散度距离

    (BregmanDivergence)

    形式如下:


    其中为某个凸函数,表示函数对y求导,<>表示点乘。

    我们把y=x^2作为,得到:


    即得到欧式距离。

    Bregman距离的数学性质及推导不知,wiki上说,其为许多常见距离的一个通式。

    wiki http://en.wikipedia.org/wiki/Bregman_divergence

    其中包括欧式距离,曼哈顿距离,KL距离等等。水平有限,只能引用到此。


    mahalanobis距离

    马氏距离:

    首先考虑欧式距离,欧式距离有两点明显的缺点:

    1.把不同量纲级别的属性同等看待

    比如一个特征向量包含人的年龄,收入,那么收入得到的点乘会远远大于年龄,使得年龄没有作用。

    一般的做法是归一化属性值。

    2.属性间相关性

    一个人的体重很多时候正比于身高。如果作为特征中的两个属性,就会重复计算这个值,得到冗余信息。

    一种做法是做去相关,降维,特征选择等等。


    不同与欧式距离,马氏距离考虑了量纲即属性间相关性。如下:

    M(x,y)=(x-y)sigm(x-y)T

    其中sigm表示整体特征向量的协方差矩阵。


    马氏距离的最大缺点就是计算复杂度要高出很多,具体运用时要考虑这个因素。

    补充

    补充之前距离没写到的一些信息:

    转换 transformation

    有时候,我们得到了距离,进而可以用这个距离求相似性。如:

    s表示相关性,d表示距离,则有:

    s = -d

    s=1/(1+d) 这种方法把距离映射到(0-1)的相似性空间中

    s=e^-d      这种方法为非线性映射

    s = 1-(d-mind)/(maxd-mind)  也是一种把距离映射到(0-1)上的方法,不过这种是线性的。

    小结:任意一种递减的函数都可以把d映射为s度量

     

    归一化normalization

    像cosine这种,本身就是(-1,1)的数据,可以直接使用。不过很多情况下,如欧式距离,range都无从控制。归一化是必须的。

     

    度量(metric)

    满足以下几种性质的量,可以成为度量(metric):

    非负性

    (a)d(x,y)>=0  

    (b)d(x,y)=0 if x==y 

    对称性

    d(x,y) = d(y,x) for all x,y

    三角性

    d(x,z)<= d(x,y) + d(y,z)

    metrics对于许多算法是必须的,不过很多情况下,不必满足metrics也可以作为距离度量。

     

    有再看到类似的再更新。

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    公式:

    • 假设A  =  [1,2,3,4]  ,长度为4
    • 假设B  =  [1,2,5,6]  ,长度为4 
    • 则AB的公共部分C = [1,2], 长度为2
    • AB的相似度为:2 / (4 + 4 - 2) = 0.33

    算法:

    方法一:

    #-*- coding: utf-8 -*-  
    #user_data为用户信息嵌套字典  
    #如{'fabrice' : {'water' : 3}}  
    def sim_tonimoto(user_data, user1, user2):  
        common = {}  
        #判断有没有相同的数据, 没有相同数据则返回0  
        for item in user_data[user1]:  
            if item in user_data[user2]:  
                common[item] = 1  
      
        if len(common) == 0:  
            return 0  
      
        common_num = len(common)  
        user1_num = len(user_data[user1])  
        user2_num = len(user_data[user2])  
      
        res = float(common_num)/(user1_num + user2_num - common_num)  
      
        return res  

     

    方法二:

    def sim_tonimoto(user_data, user1, user2):  
        common = [item for item in user_data[user1] if item in user_data[user2]]  
        return float(len(common))/(len(user_data[user1]) + len(user_data[user2]) - len(common))  

     

    转载于:https://my.oschina.net/mickelfeng/blog/749552

    展开全文
  • Tanimoto系数(又称广义Jaccard系数)-TanimotoDistanceMeasure. 相似系数)" style="margin:0px; padding:0px; border:0px; list-style:none"> 相似系数)" style="margin:0px; padding:0px; border:0px; list-...
  • The Elements of Artificial Intelligence Using Lisp - Steven L. Tanimoto.pdf The Elements of Artificial Intelligence Using Lisp - Steven L. Tanimoto.pdf
  • Tanimoto Coefficient

    2015-10-23 21:16:00
    Tanimoto Coefficient TheTanimoto coefficientbetween two points,aandb, withkdimensions is calculated as: The Tanimoto similarity is only applicable for a binary variable, and for binary vari...
  • Tanimoto Coefficient和前面的5中相关度计算方式有很大的不同,它不关心用户对物品的具体评分值是多少,它在关心用户与物品之间是否存在关联关系。还记得上一篇文章《Mahout学习笔记——数据承载》里面提到的布尔...
  • 也就是tanimoto相关度能够很好的解决01关系, 也就是是否关系, 比如是否看过某部电影; 而皮尔逊相关度能够很好的解决一些用程度衡量的, 比如为某部电影打分就是程度 只是把距离函数改掉了: #coding:utf-8 ...
  • RDKit | 基于分子指纹的分子相似性

    千次阅读 2019-10-14 10:52:44
    分子相似性: 相似性原理(similar property ...已经提出了各种评估方法,但是最常用的评估方法称为“Tanimoto系数”。使用以下等式从两个分子A和B的位阵列指纹计算Tanimoto系数: 导入库 import pandas ...
  • 1.5 Tanimoto 系数(Tanimoto Coefficient) Tanimoto 系数也称为 Jaccard 系数,是 Cosine 相似度的扩展,也多用于计算文档数据的相似度: 类名:TanimotoCoefficientSimilarity 原理:又名广义Jaccard系数,是...
  • 两个数组相识度算法 tanimoto

    千次阅读 2011-07-28 16:34:16
    在日常程序中可能会出现对比两个数组相识程度,我这里是看到一些资料后根据lire程序提取的计算两个数组相识度的算法 tanimoto 度量两个集合之间的相似程度的方法。 A=[1,2,3,4] B=[1,2,5] C = A & B = [1,2] T = Nc ...
  • 当评估分子相似性时,经常使用基于分子指纹的Tanimoto系数。该方法本身没有问题,但是使“相似”的原因因情况而异,因此存在新的相似性确定方法的空间。Fraggle就是一种特殊的相似性评估算法。 Fraggle与现有...
  • -1 1 0] D = pdist( X , ‘jaccard’) 结果 D = 0.5000 0.5000 1.0000 2.4Tanimoto系数(广义Jaccard相似系数) Jaccard相关系数用来衡量两个集合的相关性,数值越大,相似度就越高。相对于Jaccard系数,Jaccard...
  • import numpy as np def tanimoto_coefficient(p_vec, q_vec): “”" This method implements the cosine tanimoto coefficient metric :param p_vec: vector one :param q_vec: vector two :return: the tanimoto ...
  • 医疗图像分割的损失函数

    千次阅读 2019-01-10 14:24:58
    # alpha=beta=1 : tanimoto coefficient (also known as jaccard) # alpha+beta=1 : produces set of F*-scores # implemented by E. Moebel, 06/04/18 """ def tversky_loss ( y_true , y_pred ) : alpha =...
  • >>> fps = [Chem.RDKFingerprint(x) for x in ms] >>> DataStructs.FingerprintSimilarity(mfp[0], mfp[1]) 0.6 度量方法非常多,随便举几例:Tanimoto, Dice, Cosine, Sokal, Russel, Kulczynski, McConnaughey等...
  • 二、相似性搜索 进行相似性比对和搜索需要用到相似性搜索相关的操作符: 百分号"%":使用tanimoto相似性作为标准进行相似性搜索,返回的结果是给定分子与库中分子的相似性是否超过阈值(通过rdkit.tanimoto_...
  • 16.rogerstanimoto 田本罗杰斯差异(Rogers-Tanimoto dissimilarity) ,其中 17.russellrao 拉塞尔差异(Russell-Rao dissimilarity) 18.seuclidean 19.sokalmichener 索卡尔米切纳差异(Sokal-Michener ...
  • python 学习笔记(相似性计算方法)

    千次阅读 2015-11-30 10:26:10
    Tanimoto系数,又称为广义Jaccard系数: T a n i m o t o ( A , B ) = A ∗ B / ( | | A | | 2 + | | B | | 2 − A ∗ B ) Tanimoto(A,B)=A*B/(||A||^2+||B||^2-A*B) def Tanimoto_distance(prefs,p1,p2):...
  • 点上方蓝字计算机视觉联盟获取更多干货在右上方···设为星标★,与你不见不散仅作学术分享,不代表本公众号立场,侵权联系删除转载于:机器之心AI博士笔记系列推荐周志华《机器学习》手推笔记...
  • 求解相似度的常见算法

    千次阅读 2020-07-19 22:13:32
    2.4Tanimoto系数(广义Jaccard相似系数) 2.5对数似然相似度/对数似然相似率 2.6互信息/信息增益,相对熵/KL散度 2.7信息检索--词频-逆文档频率(TF-IDF) 2.8词对相似度--点间互信息 3.距离算法与相似度算法的选择...
  • 协同过滤推荐及相似性度量

    万次阅读 2014-01-08 10:42:21
    协同过滤 —— ...更准确的说法为:Tanimoto Coefficient主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得...
  • 各种相似度计算的python实现

    万次阅读 多人点赞 2018-08-30 11:18:16
    Tanimoto系数是一种度量两个集合之间相似程度的方法(与Jaccard 系数相似,但不是完全相同)。其主要用于二元变量或者多元变量之间的数据集之间的相似度计算,其公式为: # ! /usr/bin/python # -*- coding:...
  • Tanimoto的代码类似,但是必须对每一个集合使用一次去重,实现集合的互异性 def Jaccard(a,b): c=[v for v in a if v in b] return float(len(c))/(len(a)+len(b)-len(c)) 皮尔逊相关系数 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,148
精华内容 459
关键字:

Tanimoto