我有一个包含8个项目的主列表,然后有多个列表与主列表具有相同的项目,但是其中的项目以不同的顺序出现。如何找到每个列表与主列表之间的百分比相似度?
例如,主列表可能是:
[8,7,6,5,4,3,2,1];
我想与之比较的列表之一可能是:
[8,6,4,2,7,5,3,1];
我知道我可以遍历主列表并检查是否匹配,但是有一种优雅的方法可以计算出列表中的每个数字与主列表中的相同数字有多接近?
例如:
位置0:'8'匹配位置0;0个位置差异(100%),第1个位置:“ 7”与第4个位置匹配;位置2:3位差异(57.1%),位置1匹配为“ 6”;2个职位差(71.4%)
ETC。
最终结果将是两个列表之间的百分比相似度。
您可以使用Arraymap
和reduce
函数:
function getSimilaritry(a, b) {
return a.map(function(val, index) {
//calculate the position offset and divide by the length to get each
//values similarity score
var posOffset = Math.abs(b.indexOf(val) - index);
return posOffset/a.length
}).reduce(function(curr, prev) {
//divide the current value by the length and subtract from
//one to get the contribution to similarity
return (1 - curr/a.length) + prev;
});
}
如果不能保证列表具有相同的值,则需要为此添加处理。
另外请注意,你传递参数的顺序a
,并b
在getSimilarity
功能会影响结果。不清楚这是否是您的应用程序遇到的问题。
PS:我认为您的问题被否决了,因为它不包含您已经尝试解决此问题的代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句