是否可以在对象数组中具有一定百分比的唯一性?

问题描述 投票:0回答:1

这是我第一次在此站点中编写。

因此,我需要使用返回对象的函数来生成一组随机数据。该对象从其他对象数组中随机选择一些属性(在真正的嵌套级别上)。因此,该函数在结构上返回相同的对象,但其属性返回不同的值。

有没有一种方法可以计算唯一性比率或类似的东西?就像在集合中有一个生成的对象与另一个对象完全相等时一样,它将返回唯一性0,如果没有与其他对象共享的属性,则返回100,并且如果某些对象是共享的,而其他对象不共享,则它们之间的某个百分比?

我的目标是例如生成一组100个对象,并选择生成的前20个最独特的对象。

预先感谢您的想法。

编辑:

假设我已经生成了数据集。所有对象都具有相同的结构,但值不同。像这样的东西:

{
name: 'Some Name',
propA: (picked randomly from set A),
propB: (picked randomly from a different set B),
sections: [
  {
    propC: (another random from another set C)
   },
   {...}, 
   ...
]

}

[我用ramda编写的一些工具生成了这些对象的数组,例如从列表中随机选择,并用R.times来做。

主要问题是我需要这个:

{
  ...generatedObject,
  uniqueness: 79
}

在每个对象上,唯一性是一个百分比。

到目前为止,我使用deep-diff来获取对象之间的差异,并编写了一个函数,用于根据对象中更改的道具数量提取百分比。

这是fn:

// changes is a Number
const measureUniquenessBetweenTwoChildObjects = R.curry((changes, objA, objB) =>
  R.compose(
    R.multiply(100), 
    R.divide(R.__, changes), 
    R.length, 
    diff)(objA, objB)
  );

这是如果更改与生成的道具相同,则差异为100%。

然后,我确实选择了列表中的每个对象,并将此函数与除对象本身之外的所有其他对象进行映射,用平均数减少该差值数组,这就是我认为的最终数字。然后我用R.assoc将该数字附加到对象上。

检查百分比差异数组会给我这样的信息:

[
  73.02, 73.02, 72.79, 72.56,
  72.56, 72.34, 72.34, 72.11,
  71.66, 71.66,  71.2, 70.98,
  70.98, 70.98, 70.75, 70.52,
  70.29, 70.29, 70.07, 69.84
]

这些都是我赋予对象的唯一性比率。

但是我认为我的解决方案有缺陷,我觉得这里有些奇怪。这是我解决这个问题的逻辑。

我想问你是如何解决这个问题的?最后,问题是编写一种算法,该算法计算具有相同结构但值不同的一组对象中每个对象的唯一性值。

我不是在要求代码,只是要求一些想法以适当的方式使之工作。我既不是数据科学家也不是数学家,所以我以幼稚的方式实现了这一目标。

希望这使它更清楚。

谢谢。

javascript similarity ramda.js
1个回答
0
投票

几个other questions证明,如果您正在寻找优化的解决方案,那么这个问题就很难解决。我不知道是否有比强力算法更好的算法。这是不可能的,因为(100 choose 20)很大(535983370403809682970)-除非您有一些我真的想知道的硬件!

但是我认为您可以找到一个局部最优值,这可能不是一个坏猜测。那将涉及

  1. 计算差矩阵
  2. 行总和
  3. 选择最大值
  4. 将该值添加到列表中
  5. 如果仍然需要更多项目,请从行和列中删除该索引,然后返回到步骤2。

当然,您也可以使用某些simulated annealing技术来找到更好的局部最大值。


关于差异,正如我在评论中所建议的,deep-diff可能超出您的需要。您可能可以使用功能like this

const findLeafPaths = (o, path = [[]]) => 
  typeof o == 'object'
    ? Object .entries (o) .flatMap (
        ([k, v]) => findLeafPaths (v, path) .map (p => [k, ...p])
      ) 
    : path

查找样本对象中的所有路径,然后通过将R.path映射到每个对象,将其简化为值数组。要找到它们之间的数值差异应该非常简单(我将从R.zipWith (R.equals)或类似名称开始)。但是,如果deep-diff对您来说效果很好,则没有理由进行更改;据我了解您的要求,它只是在测试是否存在。

© www.soinside.com 2019 - 2024. All rights reserved.