免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2951 | 回复: 9
打印 上一主题 下一主题

[算法] 怎么度量一个排列相对于另一个排列的混乱程度?或者说相似度。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-16 01:45 |只看该作者 |倒序浏览
有一个排列,比如[1、2、3、4、5];
我要随机打乱它,比如得到[2、1、3、4、5]。
现在,我需要一个量来刻画排列2相对于排列1的混乱程度;或者说刻画两个排列的相似度,相似度越高,表明两个排列越接近。

目前我能想到的办法就是用宽度优先搜索来确定排列2位于排列1的第几层,层数越深表明相似度越低,混乱度越高。

但是具体运行起来发现这个办法很缓慢,尤其是排列比较长的时候(也可能跟我的算法实现有关)。

有没有一个什么统计学公式,把两个排列代进去就能很快速估算出一个相似度的值来,不太精确也行。

论坛徽章:
0
2 [报告]
发表于 2015-05-16 01:49 |只看该作者
或者是有其他好办法也行。请介绍介绍。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2015-05-16 02:03 |只看该作者
一共5个元素,取值范围1~5,你可以把它展开变成一个25维01向量,比如说12345就是00001 00010 00100 01000 10000,21345就是00010 00001 00100 01000 10000,然后算一下这两个向量的夹角的余弦,结果取值范围[1, -1],但由于这个25维向量每一维取值只有0和1,也就是说都在第1象限,两个向量夹角不会大于90度,所以实际的取值范围是[1, 0],1是最相似也就是完全一样,0是最不相似。

论坛徽章:
0
4 [报告]
发表于 2015-05-16 02:40 |只看该作者
回复 3# windoze


    谢谢猫兄,我试试。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2015-05-16 15:29 |只看该作者
谁都别拦着:猫哥是我偶像

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
6 [报告]
发表于 2015-05-16 18:04 |只看该作者
回复 5# cokeboL

这个方法本来是用来计算文本串相似度的,在他这个问题里不一定适用,但我觉着拿来凑合一下应该是没问题的。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
7 [报告]
发表于 2015-05-16 18:05 |只看该作者
回复 6# windoze


    get                     

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
8 [报告]
发表于 2015-05-16 18:23 |只看该作者
刚才拿python试了一下,感觉结果还是基本靠谱的,点积余弦之类的函数就直接用numpy了:

  1. from numpy import (array, dot, arccos)
  2. from numpy.linalg import norm
  3. from random import shuffle

  4. def to_vec(l, m):
  5.         ret=[]
  6.         for e in l:
  7.                 sl=[0]*m
  8.                 sl[e-1]=1
  9.                 ret+=sl
  10.         return ret

  11. def sim1(u, v):
  12.         return dot(u,v)/norm(u)/norm(v)

  13. def sim(u, v, m):
  14.         a=to_vec(u, m)
  15.         b=to_vec(v, m)
  16.         return sim1(a,b)

  17. def test(n):
  18.         a=list(range(1,n+1))
  19.         b=list(range(1,n+1))
  20.         shuffle(b)
  21.         print a,
  22.         print b,
  23.         print "=>",
  24.         print sim(a, b, n)

  25. for n in range(10):
  26.         test(5)

  27. for n in range(10):
  28.         test(10)
复制代码
输出结果:

  1. [1, 2, 3, 4, 5] [1, 3, 2, 5, 4] => 0.2
  2. [1, 2, 3, 4, 5] [2, 4, 5, 1, 3] => 0.0
  3. [1, 2, 3, 4, 5] [1, 3, 2, 4, 5] => 0.6
  4. [1, 2, 3, 4, 5] [3, 1, 5, 4, 2] => 0.2
  5. [1, 2, 3, 4, 5] [1, 4, 2, 5, 3] => 0.2
  6. [1, 2, 3, 4, 5] [3, 1, 5, 2, 4] => 0.0
  7. [1, 2, 3, 4, 5] [3, 5, 2, 4, 1] => 0.2
  8. [1, 2, 3, 4, 5] [1, 5, 4, 2, 3] => 0.2
  9. [1, 2, 3, 4, 5] [1, 4, 2, 3, 5] => 0.4
  10. [1, 2, 3, 4, 5] [4, 5, 3, 2, 1] => 0.2
  11. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 5, 6, 4, 10, 8, 7, 9, 3, 1] => 0.2
  12. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 9, 3, 5, 1, 8, 7, 6, 4, 10] => 0.3
  13. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [5, 7, 4, 9, 3, 8, 6, 1, 2, 10] => 0.1
  14. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [10, 4, 2, 6, 5, 1, 7, 9, 3, 8] => 0.2
  15. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [7, 1, 8, 6, 4, 10, 2, 3, 9, 5] => 0.1
  16. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [7, 3, 8, 5, 10, 6, 9, 1, 4, 2] => 0.1
  17. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [10, 6, 8, 2, 9, 7, 4, 5, 1, 3] => 0.0
  18. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 4, 5, 8, 1, 10, 6, 7, 3, 9] => 0.0
  19. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [3, 4, 7, 9, 10, 1, 8, 6, 2, 5] => 0.0
  20. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [2, 9, 1, 7, 10, 6, 4, 8, 3, 5] => 0.2
复制代码

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
9 [报告]
发表于 2015-05-18 16:24 |只看该作者
1 2 3
3 2 1

是同等混乱吗?顺序重要吗?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
10 [报告]
发表于 2015-05-18 16:38 |只看该作者
回复 10# fender0107401

lz不是说估算么,而且他也觉得相似度可以拿来凑合一下。

实际要想评估“混乱程度”你得做随机性测试,基本思路就是拿一大堆结果看分布,成本太高了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP