相似度计算的python实现

转载 2018年04月16日 10:11:52
========================================
本文转自 https://blog.csdn.net/u013393647/article/details/46754055
(原文有所修改)
========================================

相似度计算的python实现


一、介绍

    在数据挖掘中有很多地方要计算相似度,比如聚类分析和协同过滤。计算相似度的有许多方法,其中有欧几里德距离、曼哈顿距离、Jaccard系数和皮尔逊相关度等等。我们这里把一些常用的相似度计算方法,用python进行实现以下。如果是初学者,我认为把公式先写下来,然后再写代码去实现比较好。

二、欧几里得距离

    几个数据集之间的相似度一般是基于每对对象间的距离计算,最常用的是欧几里德距离:

#-*-coding:utf-8 -*-
#计算欧几里德距离:
def euclidean(p,q):
#如果两数据集数目不同,计算两者之间都对应有的数
same = 0
for i in p:
    if i in q:
        same +=1

#计算欧几里德距离,并将其标准化
e = sum([(p[i] - q[i])**2 for i in range(same)])
return 1/(1+e**.5)
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print euclidean(p,q)

三、皮尔逊相关度
    几个数据集中出现异常值的时候,欧几里德距离就不如皮尔逊相关度‘稳定’,它会在出现偏差时倾向于给出更好的结果。其公式为:

-*-coding:utf-8 -*-
#计算皮尔逊相关度:
def pearson(p,q):
#只计算两者共同有的
    same = 0
    for i in p:
        if i in q:
            same +=1

    n = same
    #分别求p,q的和
    sumx = sum([p[i] for i in range(n)])
    sumy = sum([q[i] for i in range(n)])
    #分别求出p,q的平方和
    sumxsq = sum([p[i]**2 for i in range(n)])
    sumysq = sum([q[i]**2 for i in range(n)])
    #求出p,q的乘积和
    sumxy = sum([p[i]*q[i] for i in range(n)])
    # print sumxy
    #求出pearson相关系数
    up = sumxy - sumx*sumy/n
    down = ((sumxsq - pow(sumxsq,2)/n)*(sumysq - pow(sumysq,2)/n))**.5
    #若down为零则不能计算,return 0
    if down == 0 :return 0
    r = up/down
    return r
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print pearson(p,q)


四、曼哈顿距离
    曼哈顿距离是另一种相似度计算方法,不是经常需要,但是我们仍然学会如何用python去实现,其公式为:

#-*-coding:utf-8 -*-
#计算曼哈顿距离:
def manhattan(p,q):
#只计算两者共同有的
    same = 0
    for i in p:
        if i in q:
        same += 1
#计算曼哈顿距离
    n = same
    vals = range(n)
    distance = sum(abs(p[i] - q[i]) for i in vals)
    return distance
p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3,4,3]
print manhattan(p,q)

五、Jaccard 系数
    当数据集为二元变量时,我们只有两种状态:0或者1。这个时候以上的计算相似度的方法就无法派上用场,于是我们引出Jaccard系数,这是一个能够表示两个数据集都是二元变量(也可以多元)的相似度的指标,其公式为:
#-*-coding:utf-8 -*-
# 计算jaccard系数
def jaccard(p,q):
    c = [a for i in p if v in b]
    return float(len(c))/(len(a)+len(b)-len(b))
#注意:在使用之前必须对两个数据集进行去重
我们用一些特殊的数据集去测试一下:

p = ['shirt','shoes','pants','socks']
q = ['shirt','shoes']
print jaccard(p,q)
得出结果是:0.5

图像相似度算法的个人见解(python&opencv)

简述前段时间写了篇博文 哈希算法实现图像相似度比较(Python&OpenCV) ,使用简单的哈希算法进行图像相似度判断。但是在实践中该算法达不到预期的效果: 图像缩放8*8大小,图片信息内容严重丢失...
  • haofan_
  • haofan_
  • 2017-12-14 21:07:55
  • 4796

推荐系统中的相似度计算方法总结及实现代码(python)

相似度的计算是推荐系统非常重要的环节,包括:用户与用户之间的相似度,物品与物品之间的相似度或者用户与物品的相关性。       下面以在协同过滤中计算两个用户的相似度来介绍几种常用的相似度计算方法。其...
  • Allenalex
  • Allenalex
  • 2016-05-03 22:34:36
  • 6720

【Python】Tanimoto相似度算法实现

公式: 假设A  =  [1,2,3,4]  ,长度为4假设B  =  [1,2,5,6]  ,长度为4 则AB的公共部分C = [1,2], 长度为2AB的相似度为:2 / (4 + 4 - 2...
  • ns2250225
  • ns2250225
  • 2015-02-14 16:02:55
  • 3075

python实现机器学习中的各种距离计算及文本相似度算法

import numpy as np import math# 依赖包numpy、python-Levenshtein、scipy def Euclidean(vec1, vec2): npv...
  • AlanConstantineLau
  • AlanConstantineLau
  • 2017-04-03 22:45:07
  • 5584

推荐系统相似度python

  • 2018年01月23日 11:18
  • 957KB
  • 下载

深度学习在推荐领域的应用:Lookalike 算法

当2012 年Facebook 在广告领域开始应用定制化受众(Facebook CustomAudiences)功能后,受众发现这个概念真正得到大规模应用。什么是受众发现?如果你的企业已经积累了一定的...
  • kwame211
  • kwame211
  • 2017-08-29 11:35:18
  • 4319

【强化学习】使用off-policy算法机器人抓取任务基准;生成对抗网络 GAN 就是强化学习

本文转自雷克世界(ID:raicworld)编译 | 嗯~阿童木呀在本文中,我们探讨了用于基于视觉的机器人抓取操作的深度强化学习算法。无模型深度强化学习(RL)已经在一系列具有挑战性的环境中得到了成功...
  • np4rHI455vg29y2
  • np4rHI455vg29y2
  • 2018-03-26 00:00:00
  • 169

Python简单实现基于VSM的余弦相似度计算

在知识图谱构建阶段的实体对齐和属性值决策过程中、判断一篇文章是否是你喜欢的文章、比较两篇文章的相似性等,都涉及到了向量空间模型(Vector Space Model,简称VSM)和余弦相似度计算相关知...
  • Eastmount
  • Eastmount
  • 2015-11-18 05:40:46
  • 19257

同义词词林(哈工大扩展版) + Python词语相似度计算源代码

  • 2017年12月05日 00:33
  • 372KB
  • 下载

算法——K均值聚类算法扩展应用(Java实现)

1、前面一篇文章算法——K均值聚类算法(Java实现)简单的实现了一下K均值分类算法,这节我们对于他的应用进行一个扩展应用 2、目标为对对象的分类 3、具体实现如下 1)首先建立一个基类Kmea...
  • CYXLZZS
  • CYXLZZS
  • 2012-05-25 16:25:07
  • 3685
收藏助手
不良信息举报
您举报文章:相似度计算的python实现
举报原因:
原因补充:

(最多只允许输入30个字)