我有一个包含 [ID, ATTR1, ATTR2, ATTR3]
的项目表。我想选择大约一半的项目,但尝试获得一个未聚集的随机结果集。换句话说,ATTR1 值、ATTR2 值和 ATTR3 值的分布相当均匀。这不一定代表数据的整体,换句话说,总表可能通常集中在某些属性值上,但我想选择一个更多样化的子集。这些属性没有相互关联,因此 ATTR1 和 ATTR2 之间实际上没有相关性。
例如,假设 ATTR1 = "State"。我希望子集中的每个行项目都来自不同的州,即使在整个集合中,我的大部分数据都集中在几个州。并且对于其他 2 个属性也同时如此。 (我意识到有些表可能无法做到这一点,但有足够的数据,不太可能没有解决方案)
关于高效算法的任何想法?谢谢!我什至不知道如何搜索这个:)
(顺便说一句,如果这需要对整个集合进行预计算或索引也可以,只要我能快速抽出随机变化的子集即可)
最佳答案
有趣的问题。既然你想要列表的一半,那么这个怎么样:-
创建一个完全随机选择的一半值的列表。计算每个所选项目的 ATTR1、ATTR2、ATTR3 值的直方图。
:循环
现在随机选择一个在当前列表中的项目和一个不在当前列表中的项目。
如果新项目增加了直方图中唯一属性数量的“熵”,请保留它并更新直方图以反射(reflect)您刚刚所做的更改。
重复 N/2 次或更多次,具体取决于您想要强制它移动到覆盖每个值而不是随机的程度。您还可以使用“模拟退火”并逐渐改变接受交换的概率 - 从“有时允许交换,即使它使情况变得更糟”开始,到“仅在增加多样性时交换”。
关于algorithm - 算法的想法?随机排序列表,强调多样性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484186/