一种简单的计算item相似度算法

2023-11-20

      计算item之间相似度是个有意义的工作,比如词的相似度就有很多应用场景。词相似度就有很多做法,工业上现在用得最多的可能是word2vec了,还有些算语义相似度的偏学术的办法。


这里介绍一种比较简单可行的思路,不只是算词相似度,其他类型也可以。这个方法很早以前在读书时候就知道的,基本思路也是把item表示成其他item的向量之后,再用向量进行相似度计算。


怎么表示这样的关系,就变成一个可以自由控制的开放方法,最简单的办法,用item和item之间的关联度来表示向量上对应维度的强弱。而任何关联度计算公式的核心都包含两个item同时出现(共现)的程度,共现通常自由定义。比如在文本词的应用环境中,可以用同时出现在段落、文章、甚至句子。再比如商品环境中,可以定义成一定范围内的同一个人的购物清单。


于是一个itemi可以表示成所有item的向量Vi=[0.1, 0.2, 3.1, 0, 0...] 如此格式,对itemi和j的相似度就可以用Vi和Vj的相似度来表征了,比如cosine, jaccard、皮尔逊等等。使用这样的表示的好处是可以发现真正的"相似"性,因为如果两个item a,b 真的是相似,它们很可能不会出现在一个共现场景下,例如同义词在同样的环境只会选一个,或者相同功能的商品一般人只会买一个,而不会选多个。但它们都共同的和其他item同时出现过,它们和其他item的关联很可能是稳定的,但a,b之间很少共现。


这种方法简单,但算法效率并不是太高,因为算两两关联至少是个O(n^2)的复杂度。n表示item的数量。

第一步,算两两item的关联度,需要枚举所有的共现出来,再累加;复杂度是O(n^2),通常item都比较稀疏,还算能接受。

第二步,每个item表示成V之后,两两之间的V还要算一个相似度,其实是O(n^2) 再乘以V的维度数,应该是O(n^3)。


事实上也有一些加速的算法了,但我还没研究过,我自己想到一个加速第二步的办法。

首先,item表示成其他item关系,应该让尽可能保留强关联的维度,也就是V的大部分维度是0。

其次,把所有V表示出来成一个矩阵M,M肯定是对角线对称的。 V根据cosine的公式 分子是两个向量Va Vb中交集部分,那么∑(wa * wb) 在这个M上 对任意两个V 累加同行部分和同列部分 是等价的。所以我们不需要对任意两个V在每个维度单独累加,而是可以累加每个V上的二元组wi * wj 而得到,最后再除以sqrt(∑(Va) * ∑(Vb))。

       举个例子                                             a  ,   b   ,  c  , d    

                                                             a   0    0.5   0.3  0.1

                                                             b  0.5   0    0.7   0.9

                                                             c   0.3  0.7   0   0.5

                                                             d   0.1  0.9  0.5    0

     这样一个矩阵,横着看算Vc和Vd的相似度,就是a,b对应两列在c,d两行求出的交集(左下角四个元素),除再以c和d各自V的大小。这个过程也等价于右上角四个元素换个方向的计算。 那就是把 (c,d) 这样的元组 不管在哪行出现,交集全部拿出来再进行累加就行了。这样的好处是第二步的过程和第一步完全一样了,比写一个V求相似度函数要简单、方便、效率更高,可以直接加入MR框架中。


可以看到相似度其实是一种更具体的关联度,关联度上直接挖掘未必能得出比较好解释的结果。有了相似度,就可以在这种关系上进行进一步的真正的聚类团体发现。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种简单的计算item相似度算法 的相关文章

随机推荐

  • 【C语言】 文本文件读取中文汉字出现乱码问题的解决方法

    include
  • 手把手教你如何写一个三子棋/N子棋的小游戏

    这里写目录标题 第一步 游戏进入界面 第二步 初始化棋盘 第三步 打印棋盘 第四步 玩家和电脑下棋 第五步 判断输赢 三子棋或者N子棋怎么写 让我们先来玩一把 再来看看怎么写 程序运行界面 1为玩游戏 2为清屏 0为退出游戏 我们选1 然后
  • 前端多个参数传参js

    function getparm 返回当前 URL 的查询部分 问号 之后的部分 var urlParameters location search 声明并初始化接收请求参数的对象 var requestParameters new Obj
  • PPTP中的PAC 和PNS

    http blog csdn net galdys article details 6682298 网络服务器 PNS 访问集线器 PAC PAC 可编程自动化控制器 的概念是由ARC咨询集团的高级研究员Craig Resnick提出的 在
  • rostcm6情感分析案例分析_基于情感词典的情感分析方法

    上节课我们介绍了基于SnowNLP快速进行评论数据情感分析的方法 本节课老shi将介绍基于情感词典的分析方法 基于情感词典的分析方法是情感挖掘分析方法中的一种 其普遍做法是 首先对文本进行情感词匹配 然后汇总情感词进行评分 最后得到文本的情
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • Kali Linux进阶篇:Nmap扫描网络空间存活主机技巧

    课前声明 1 本分享仅做学习交流 请自觉遵守法律法规 2 搜索 Kali与编程 学习更多网络攻防干货 一 背景介绍 nmap是一个网络连接端扫描软件 用来扫描网上电脑开放的网络连接端 确定哪些服务运行在哪些连接端 并且推断计算机运行哪个操作
  • Java对象的快速复制的几种方式

    浅拷贝 深度复制 BeanUtils copyProperties 对象的克隆是指创建一个新的对象 且新的对象的状态与原始对象的状态相同 当对克隆的新对象进行修改时 不会影响原始对象的状态 注释 clone 是object类的protect
  • Makefile中的include命令详解

    转载地址 点击打开链接 关于Makefile中的include命令 网上有很多介绍 比较普遍的说法是 Makefile中的include命令与C语言中的include命令类似 命令include file dep 即把file dep文件在
  • 最流行的五大数据模型工具

    当今的商业决策对基于天的数据依赖越来越强烈 然而 正确而连贯的数据流对商业用户做出快速 灵活的决策起到决定性的作用 建立正确的数据流和数据结构才能保证最好的结果 这个过程叫做数据建模 为了避免认为错误并且加快进度 我们需要使用专业的软件来帮
  • CUBLAS变量解释(1)

    变量类型 cublasOperation t 解释 该类型表明输入的密集矩阵的形式 其值有 CUBLAS OP N 非转置 CUBLAS OP T 转置 CUBLAS OP C 共轭转置 该函数对应于BLAS FORTRAN版 的变量字符
  • C++文本文件,二进制文件,write(),read(),map容器,seekg(),seekp(),tellg(),tellp()函数

    include
  • 百度富文本编辑器UEditor配置及功能实现详解

    当前功能基于PHP 其它语言流程大抵相同 大概流程 1 将docx文件上传到服务器中 2 使用PHPoffice PHPword实现将word转换为HTML 3 将HTML代码返回并赋值到编辑器中 1 编辑器配置修改 1 1 新增上传wor
  • ubuntu下安装Navicat

    Step1 打开Navicat官网 下载Navicat 网址 http www navicat com en download download html Navicat for MySQL 10 0 11 Download Downloa
  • SQL中IN、NOT IN的使用,以及NULL值的比较

    SQL中IN以及NOT IN的使用 以及NULL值的比较 在LeetCode写 608 树节点 题时 发现使用NOT IN在比较值为空的列时存在问题 记录在此 IN 和 NOT IN 在SQL中是用来指定一个列应该与其匹配的值的列表 IN
  • 【论文阅读】learning with noisy correspondence for cross-modal matching ------ 跨模态匹配,噪声对应

    注意 本博客非逐字逐句翻译论文 是作者阅读论文后根据自己的理解所写 预知论文详情 请参阅论文原文 论文标题 Learning with Noisy Correspondence for Cross modal Matching 作者 Zhe
  • 信号与系统3——傅里叶描述

    信号与系统3 傅里叶描述 1 复正弦信号和线性时不变系统的频率相应 1 频率响应Frequency response 2 离散LTI系统的频率响应Frequency response of Discrete time LTI system
  • qml程序如何启动

    1 qml主界面是Window或者是ApplicationWindow 在main cpp中可以使用 QQmlApplicationEngine engine engine load main qml 2 qml中的主界面是Rectangl
  • MSP430F5529库函数——模数转换模块(ADC12)软件触发

    需提前观看 MSP430F5529库函数学习 串口 目录 代码 ADC初始化部分 引脚复位 ADC12 A init 函数声明 baseAddress sampleHoldSignalSourceSelect clockSourceSele
  • 一种简单的计算item相似度算法

    计算item之间相似度是个有意义的工作 比如词的相似度就有很多应用场景 词相似度就有很多做法 工业上现在用得最多的可能是word2vec了 还有些算语义相似度的偏学术的办法 这里介绍一种比较简单可行的思路 不只是算词相似度 其他类型也可以