将集合划分为元素数量相等的子集

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

为了进行心理实验,我必须将由4个特征(实数)描述的一组图片(240)分成3个子集,每个子集中的元素数量相等(240/3 = 80)所有子集在这些特征方面大致平衡(就平均值和标准差而言)。

有人可以建议一种算法来实现自动化吗?我可以使用 Python 或 R 中的任何包/模块来执行此操作吗?我应该从哪里开始?

python algorithm r
6个回答
5
投票

如果我正确理解你的问题,你可以在Python中使用

random.sample()

import random

pool = set(["foo", "bar", "baz", "123", "456", "789"]) # your 240 elements here
slen = len(pool) / 3 # we need 3 subsets
set1 = set(random.sample(pool, slen)) # 1st random subset
pool -= set1
set2 = set(random.sample(pool, slen)) # 2nd random subset
pool -= set2
set3 = pool # 3rd random subset

2
投票

我会按如下方式解决这个问题:

  1. 分为 3 个相等的子集。
  2. 计算出每个子集的均值和方差。由此构建“不均匀”度量。
  3. 比较每对元素,如果交换可以减少“不均匀性”,则交换它们。继续,直到没有更多的对可以比较,或者总的不均匀性低于某个任意的“足够好”阈值。

1
投票

您可以使用 R 中的

plyr
库轻松完成此操作。这是代码。

require(plyr)

# CREATE DUMMY DATA
mydf = data.frame(feature = sample(LETTERS[1:4], 240, replace = TRUE))

# SPLIT BY FEATURE AND DIVIDE INTO THREE SUBSETS EQUALLY
ddply(mydf, .(feature), summarize, sub = sample(1:3, 60, replace = TRUE))

1
投票

如果您仍然对详尽的搜索问题感兴趣。你有 240 人选择 80 种可能性来选择第一组,然后另外 160 人选择 80 种作为第二组,此时第三组就固定了。总的来说,这为您提供:

120554865392512357302183080835497490140793598233424724482217950647 * 92045125813734238026462263037378063990076729140

显然,这不是一个选择:)


0
投票

按照与平均值的马哈拉诺比斯距离递减的顺序对物品进行排序;它们将从最非凡到最无聊的顺序排列,包括措施之间存在的任何相关性的影响

将 X[3*i] X[3*i+1] X[3*i+2] 分配给子集 A、B、C,为每个 i 选择 A/B/C 的顺序,以最大限度地减少不匹配度量。

为什么要降序?统计上较重的项目将首先被分配,并且在较大数量的后续轮次中选择排列将有更好的机会消除最初的不平衡。

此过程的要点是最大化将数据集中存在的任何异常值分配给单独子集的机会。


0
投票

我能够通过使用 Snee, R. D. (1977) 的 Duplex 算法的通用版本来解决类似的任务。

通过从原始数据集中分配数据点的逐步过程,将原始数据集划分为互斥的子集。在每次迭代中,相对于其容量而言填充最少的子集会从剩余池中选择一个数据点,并选择子集中距离当前数据点最远的一个。

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