例如,如果选择巧克力,冰淇淋,甜甜圈......,则按照自己喜好的顺序选择。
如果用户1选择
A B C D E F G H I J
并且用户2选择
J A B C I G F E D H
从0到100计算得分的一些好方法是什么,以说明他们的选择有多接近?它必须有意义,例如,如果大多数答案是相同的,但只有1或2个答案不同,则得分不能达到极低。或者,如果大多数答案只是“移动1个位置”,那么我们就不能将它们视为“全部不同”,并且只为1个位置的差异给出0分。
答案 0 :(得分:3)
为每个字母项指定一个从1开始的整数值 A = 1,B = 2,C = 3,D = 4,E = 5,F = 6(为简单起见,在F处停止) 然后考虑项目的顺序,将其用作倍数 因此,如果数字是第一个项目,则其乘数为1,如果是第6项,则乘数为6 找出你可能拥有的最高分(基本上当所有事情都是连续的顺序)
item a b c d e f
order 1 2 3 4 5 6
value 1 2 3 4 5 6
score 1 4 9 16 25 36 Sum = 91, Score = 100% (MAX)
item a b d c e f
order 1 2 3 4 5 6
value 1 2 4 3 5 6
score 1 4 12 12 25 36 Sum = 90 Score = 99%
=======================
order 1 2 3 4 5 6
item f d b c e a
value 6 4 2 3 5 1
score 6 8 6 12 25 6 Sum = 63 Score = 69%
order 1 2 3 4 5 6
item d f b c e a
value 4 6 2 3 5 1
score 4 12 6 12 25 6 Sum = 65 Score = 71%
显然,这是我刚刚提出的非常粗略的实现。它可能不适用于所有事情。实施例3和4交换一个位置,但得分偏离2%(相对于ex 1和2,关闭1%)。这只是一个想法。我不是算法专家。您可以使用最终数字并对其进行其他操作以进行更好的数值比较。
答案 1 :(得分:2)
你可以
Score = 100 * (SequenceLength - Levenshtein( Sequence1, Sequence2 ) ) / SequenceLength
编辑距离基本上是在序列2中转换序列1所需的操作数。因此算法是Levenshtein distance algorithm。
示例:
Weights
insert: 1
delete: 1
substitute: 1
Seq 1: ABCDEFGHIJ
Seq 2: JABCIGFEDH
Score = 100 * (10-7) / 10 = 30
Seq 1: ABCDEFGHIJ
Seq 2: ABDCFGHIEJ
Score = 100 * (10-3) / 10 = 70
答案 2 :(得分:2)
最直接的计算方法是 Levenshtein distance ,这是将一个字符串转换为另一个字符串时必须进行的更改次数。
Levenshtein距离对您的任务的不利之处在于它不能衡量产品本身之间的紧密程度。即你不会知道A
和J
是如何彼此接近的。例如,用户1可能喜欢甜甜圈,而用户2可能喜欢小圆面包,并且您知道大多数首先喜欢的人也喜欢第二个。根据这些信息,您可以推断用户1通过它们没有相同的元素来做出与用户2的选择接近的选择
如果是这种情况,您将不得不使用以下两种方法之一:统计方法来推断选择之间的相关性或 recommendation engines 。