V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
unii23i
V2EX  ›  问与答

家人们,怎么算匹配度呢??

  •  
  •   unii23i · 2022-12-15 10:47:39 +08:00 · 1223 次点击
    这是一个创建于 720 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 1000 人都有使用某种标签,1000 人重复 1 项记为 80%,重复 2 项记为 90%以此类推等等....比如 A 和 B 都是性别男,他们匹配度就是 80%

    但是 1000 人的每一个人都需要和另外 1000 进行比对,这个过程 1 天都计算不完,更别说人更多的时候

    应该怎么计算匹配值呢?

    soul 有匹配度先不管是不是大数据怎么算的,但是同行小软件也有匹配度,说明这是可以实现的一个功能

    大家有什么计算的方法嘛

    6 条回复    2022-12-16 00:03:10 +08:00
    opengps
        1
    opengps  
       2022-12-15 11:00:55 +08:00
    如果都很慢的话,只能是延时出结果,后台服务单独计算刷新,每次实时用的都是之前的结果
    snowhere
        2
    snowhere  
       2022-12-15 12:04:30 +08:00
    1. 1000 个人每个人和另外 1000 人比对 n 个标签值,大概需要 n*1000000 次,这个你看起来数量很多,但其实没你想的效率那么低需要 1 天。你可以造一些数据试一下处理时间
    2. 简单来说可以先对标签排序,01 标识有无,每个人生成一个二进制序列,然后位运算就可以快速匹配。
    3. 复杂来说大软件的匹配度会用更高深的数学知识去做,比如矩阵什么的,我也不太懂
    unii23i
        3
    unii23i  
    OP
       2022-12-15 16:59:27 +08:00
    @snowhere

    昨天有个朋友问了一个挺有意思的问题,“珍爱网的相似度匹配分析是怎么做的?”。不是内部员工,只能简单猜测下他们的实现方法,珍爱网的匹配分析就是比较两个人的“我的心灵视界”中各个维度的相似度,也就是图中两个曲线的相似度,包括但不仅限于性格、追求、独立程度等维度。一个直观的想法是首先把每个人的“我的心灵视界”数据抽象成一个高维的向量,向量的每一维就对应了数据中的一项。为了简化问题,我们假设只有两个维度,性格和追求。每一维最正向的值设为 1 ,最反向的值设为 0 。现在来了一个小赵,他性格是极端外向,追求是极端知足,那么代表他的向量就是[1,0]。又来了一个小钱,她性格是极端内向,追求是极端追求,那么她的向量就是[0,1]。之后我们只需要比较这两个向量的相似度就好了,一个先想到的做法是利用余弦定理来计算,回忆一下,对应向量 a 和 b ,cosθ=a*b/|a||b|,*是向量点击运算,cos 值在[0,π]内是一个 0 到 1 之间的数,正好可以换算成百分数作为相似度。以上面的虚拟人物为例,可以得到 cosθ=0 ,也就是他们相似度为 0%。如果又来了一个小孙,她的向量是[1,0],那么她和小赵的 cosθ=1 ,也就是 100%,符合认知。那么这种做法有问题吗,其实是有的。现在又来了一个小李,她的向量是[0.5,0],表示她中等外向,然后极端知足,这时候利用余弦定理也会得到 100%的相似度,这其实是不太符合直觉的。这是因为余弦定理只是比较两个向量的夹角,并没有考虑两个向量的量级(magnitude),而在珍爱网匹配分析中,其实量级是有比较大的影响的。因此一个更好更简单的做法是直接比较两个向量的 L1 距离,那么对于[0.5,0]和[1,0],L1 距离就是|0.5-1|+|0-0|=0.5 ,然后再除以最大可能的 L1 距离 2 ,可以得到相似度 25%。这样得到的值比较低 ,珍爱网里面肯定会加一个正向偏移量,让值不会太难看。那么什么时候适合用余弦相似度呢,在对向量的量级不是特别敏感的时候可以使用,比如计算两个文档的相似度,比如文档 A 里面“单身狗”,“孤独”,“悲惨”分别出现了 666 ,233 ,88 次,文档 B 中这三词分别出现了 333 ,116 ,44 次,我们其实可以知道这两篇文章都是讲述感情的,只是篇幅长短不同而已,所以相似度应该是 90%以上的,如果用 L1 、L2 距离就会得到一个不恰当的相似度值。


    有一种算法叫 simhash ,基本原理就是傅里叶变换处理声波的形状,向上用 1 表示,向下用 0 表示,然后所有的形状就可以用 64 位的 long 表示,再根据海明距离,算出相似度,这种算法速度很快,几百万的歌曲才用几十毫秒。





    目标数=1000 从集合中直接找和目标数相等的数;有的话直接返回;集合排序,截取小于目标数的部分出来=新集合

    新集合中 找到目标数 /2 的数的插入位置,取此位置前后的两个数



    我找到了这些,和你说的好像差不多,看起来网上没有明确的算法或者公式
    bjzhush
        4
    bjzhush  
       2022-12-15 17:05:36 +08:00
    这个不是匹配度,是相似度。
    去搜一下推荐算法,相似度算法,你就知道怎么搞了
    shm7
        5
    shm7  
       2022-12-15 21:01:53 +08:00
    简单的向量内积?不行来个加权?
    LaurelHarmon
        6
    LaurelHarmon  
       2022-12-16 00:03:10 +08:00 via Android
    先输入特征,然后每个用户都变成高维向量;
    想快速的话,将所有用户的向量按行排列,算个矩阵内积,立马出来所有用户两两之间的相似度。
    想准的话,就有很多方法了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3169 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:44 · PVG 20:44 · LAX 04:44 · JFK 07:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.