Javascript 有没有办法在一组对象中获得一定百分比的唯一性?
这是我第一次在这个网站上写作 所以我需要用一个函数生成一组随机数据,该函数返回一个对象。 此对象从其他对象数组中随机拾取某些属性(在真正嵌套的级别上)。因此,函数在结构中返回相同的对象,但在属性中返回不同的值 有没有办法计算唯一性比率之类的?例如,如果集合中有一个生成的对象与另一个完全相等,它将返回唯一性0,如果没有与任何其他对象共享的属性,则返回100,如果某些对象是共享的,而其他对象不是,则返回介于两者之间的某个百分比 我的目标是生成一组100个对象,例如,并选择前20个最独特的生成对象 提前感谢你的想法 编辑: 假设我已经生成了数据集。 所有对象都具有相同的结构,但值不同。 大概是这样的:Javascript 有没有办法在一组对象中获得一定百分比的唯一性?,javascript,similarity,ramda.js,Javascript,Similarity,Ramda.js,这是我第一次在这个网站上写作 所以我需要用一个函数生成一组随机数据,该函数返回一个对象。 此对象从其他对象数组中随机拾取某些属性(在真正嵌套的级别上)。因此,函数在结构中返回相同的对象,但在属性中返回不同的值 有没有办法计算唯一性比率之类的?例如,如果集合中有一个生成的对象与另一个完全相等,它将返回唯一性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
)——除非你有一些我非常想知道的硬件
但我认为你可以找到一个局部最优解,这可能是一个不错的猜测。这将涉及
至于差异,正如我在评论中所建议的,
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个最不同的集合,那么它应该