Javascript 有没有办法在一组对象中获得一定百分比的唯一性?

Javascript 有没有办法在一组对象中获得一定百分比的唯一性?,javascript,similarity,ramda.js,Javascript,Similarity,Ramda.js,这是我第一次在这个网站上写作 所以我需要用一个函数生成一组随机数据,该函数返回一个对象。 此对象从其他对象数组中随机拾取某些属性(在真正嵌套的级别上)。因此,函数在结构中返回相同的对象,但在属性中返回不同的值 有没有办法计算唯一性比率之类的?例如,如果集合中有一个生成的对象与另一个完全相等,它将返回唯一性0,如果没有与任何其他对象共享的属性,则返回100,如果某些对象是共享的,而其他对象不是,则返回介于两者之间的某个百分比 我的目标是生成一组100个对象,例如,并选择前20个最独特的生成对象 提

这是我第一次在这个网站上写作

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

有没有办法计算唯一性比率之类的?例如,如果集合中有一个生成的对象与另一个完全相等,它将返回唯一性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)
   },
   {...}, 
   ...
]
[
  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
]
}

我用我用ramda编写的一些实用程序生成了一个这些对象的数组,比如从列表中随机选取,然后用R.times来完成

主要问题是我需要这个:

{
  ...generatedObject,
  uniqueness: 79
}
在每个对象上,唯一性是一个百分比

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

这就是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将该数字附加到对象上

检查百分比差异数组会得到如下结果:

{
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)
   },
   {...}, 
   ...
]
[
  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
]
每一个都是我附加到对象的唯一性比率

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

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

我不是在要求代码,只是一些想法,使这项工作在一个适当的方式。我不是一个数据科学家或数学家,所以我用我天真的方式实现了这一点

希望这能让事情变得更清楚

谢谢。

有几个例子表明,如果你在寻找一个优化的解决方案,这个问题是NP难的。我不知道有没有比暴力更好的算法。这是不可能的,因为它相当大(
5359833700403809682970
)——除非你有一些我非常想知道的硬件

但我认为你可以找到一个局部最优解,这可能是一个不错的猜测。这将涉及

  • 计算差分矩阵
  • 对行求和
  • 选择最大值
  • 将该值添加到列表中
  • 如果仍然需要更多项,请从行和列中删除该索引,然后返回步骤2
  • 当然,你也可以用一些技巧找到更好的局部最大值


    至于差异,正如我在评论中所建议的,
    deep diff
    可能超出了您的需要。您可能可以使用以下函数:

    const findLeafPaths=(o,path=[[]])=>
    o的类型==‘对象’
    ? Object.entries(o).flatMap(
    ([k,v])=>findleafpath(v,path).map(p=>[k,…p])
    ) 
    :路径
    

    要查找示例对象中的所有路径,然后针对每个对象,通过在这些路径上映射
    R.path
    ,将其缩减为一个值数组。要找出它们之间的数字差异应该相当简单(我会从
    R.zipWith(R.equals)
    或类似的东西开始)。但是如果
    deep diff
    对你来说效果很好,没有理由改变;据我所知,它只是测试一些我认为不可能实现的东西。

    如果数据是真正随机生成的,请阅读并创建一个你所尝试的东西的列表。我认为这里潜伏着一个非常有趣的问题。请对其进行编辑,以明确您希望完成的工作以及您迄今为止的尝试。例如,您是否正在寻找生成这些随机对象的帮助?或者你想要一个你可以自己编码的唯一性公式?或者,在给定一组对象的情况下,是否需要一个算法来计算这种唯一性值?还有别的吗?当然,我们希望看到你自己投入的工作。我投票决定重新开始。还有一些人也需要这样做。它将进入一个重新开放请求队列,供人们查看。但是如果你想提出一个新问题,请随意。只需在这里添加一条指向它的注释。然后关闭这个,这更清楚。有些人可能仍然认为StackOverflow是不可能的,因为许多人真的只是想能够为答案编写代码。但我不同意。我喜欢这个任务。结果矩阵在我看来很奇怪,因为我希望它是围绕主对角线对称的。你能详细说明一下为什么这是一个排列问题吗?我将其视为O(n^2),因为我们可以测量100个对象中每个对象的唯一性,从而得到100*100/2-100或4900个唯一性度量。(我假设唯一性度量是可交换的,即A对B与B对A相同,因此减半,并且没有理由衡量对象的唯一性与自身,因此-100。)有了这个结果矩阵,每个对象的唯一性度量可以平均,并选择前20名。。。我错过了什么吗?啊,我误解了。我以为你想要的是最明显的场景。如果你想要20个最不同的集合,那么它应该