Elasticsearch zScore 计算(合并 2 个具有不同分数分布的文档集合)

Elasticsearch zScore Calculation (merging 2 document collections with different score distributions)

使用 Elasticsearch / Elastic,我想合并 n 个文档集合并按 zScore(或任何标准化分数)对它们进行排序。

详情:

合并 2..n 个文档集合,每个文档都有一个不同范围的分数字段(例如 0-100,0-10000, 0-57, ...),然后合并所有文档并使用 zScore对合并后的 table.

进行排序

我目前的计划:

  1. 为了能够比较这些文档集合的分数,我想通过计算 zScore(标准分数)来标准化每个分数
  2. 为此,获取每个文档集合的所有分值,计算均值和标准差,最后计算 zScore。
  3. 按 zScore 对合并的 table 进行排序。

问题

这种方法有意义吗?

我可以在一个 elasticsearch 查询(脚本分数)中执行此操作吗?换句话说,我可以先查询所有分数然后计算 zScore 吗?

有谁知道合并和排序具有不同分数范围的文档集合的其他方法吗?

谢谢!

示例分布 - Google Spreadsheet

参考资料

我总是告诉我的学生,"which method is best" 的答案几乎总是以 "it depends" 开头。我将把计算 Z 分数的机制放在一边;在此处、ES 文档或在线其他地方查找很容易。

最佳的归一化方法取决于原始分布,以及您需要保留的属性。 Z 分数与高斯分布高度一致,前提是分布是对称的并且 s.d。与 "relatively smooth" 分布有关。

此外,Z 分数非常有效,因为您可以对任何有序的指标进行计算。转换保留了顺序、连续性和各种其他拓扑和数学属性。

另一方面...

考虑一下泊松分布,mu = sd = 1。您可以无限制地获得正 Z 分数; +1 到 +3 范围内的那些已经足够常见了。另一方面,Z 分数低于 -1 是不可能的,尽管从那里到 0 的范围足够大。如果这不是您想要表示的,请考虑另一种方法。

类似地,考虑模式为 +1 和 -1 的双正态分布,mu=0,sd = 2。Z 分数在 -0.5 和 +0.5 附近会有集群,在 0 时相对较少。

也就是说,一个重要的考虑因素是您要合并的分布是否具有相似的形状。如果是这样,那么您选择的缩放变换无关紧要,只要您可以使用合并的 Z 分数,或者变换是可逆的:您可以 "unpack" 生成的 Z 分数来恢复原始分布形状。

如果您使用 Z 分数合并一组泊松分布,您将很容易将它们解压成一个组合泊松分布。如果你用 Gaussians 试试这个,你也会得到很好的结果。但是,如果您合并一组具有截然不同纹理的双正态分布(关注 Z=0 附近的谷深度),您可能会把合并弄得过大;您希望尽可能多地关注模式,也许调整 Z 分数,使模式在每个转换中落在 -1 和 +1。

如果您有不同的分布,还要考虑每个分布中的观测值数量。如果您有 10,000 个来自泊松分布的观测值和 100 个来自教科书正态分布的观测值,则合并结果将消除正态分布。

这些不同形状分布的问题,但合并到相同的space,应该是使用 Z 分数的唯一问题。如果您正在合并此类分布,那么请给我们更多详细信息,因为合并方法将取决于我在此处提到的一些注意事项。


这些根本不是 normal 发行版。这些似乎是指数几何族中的东西。但是,同属一个家庭使他们成为合并的好人选。

但是,形状的差异使它们成为通过 z 分数合并的不佳候选者:均值对最大的少数元素过于敏感。相反,我建议您对每个数字(任何基数)取对数,然后将 那些 值转换为 z 分数。要恢复组合形状,请将选定的基数 (2, 10, e) 提高到 z 分数的幂。如果您不喜欢这些微小的值,只需将所有值乘以一个选定的比例因子——也许足以恢复一个或另一个原始分布的实际值。

这是旧的 post,我有类似的要求,我们采用相同的方法。 Elasticsearch 没有这个功能,所以我创建了一个小的,它使用 min-max 或 z-score normalizer 对弹性搜索返回的分数进行归一化。

https://github.com/bkatwal/elasticsearch-score-normalizer