将设置除以具有相同数量元素的子集

时间:2011-09-24 13:02:16

标签: python algorithm r

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

有人可以提出一种自动化算法吗?我可以使用Python或R中的任何软件包/模块吗?我应该从哪里开始?

5 个答案:

答案 0 :(得分:3)

如果我理解你的问题,可以在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

答案 1 :(得分:2)

我会解决这个问题如下:

  1. 分为3个相等的子集。
  2. 计算每个子集的均值和方差。从他们那里构建一个“不平衡”的措施。
  3. 比较每对元素,如果交换会减少“不均匀”,则交换它们。继续,直到没有更多的对要比较,或者总不均匀性低于某个任意“足够好”的阈值。

答案 2 :(得分: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))

答案 3 :(得分:1)

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

120554865392512357302183080835497490140793598233424724482217950647 * 92045125813734238026462263037378063990076729140

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

答案 4 :(得分:0)

按照平均值Mahalanobis distance递减来订购商品;它们将被从最特别的订购到最无聊的订购,包括措施之间存在的任何相关性的影响

将X [3 * i] X [3 * i + 1] X [3 * i + 2]分配给子集A,B,C,为每个i选择最小化您的A / B / C顺序不匹配的措施。

为什么减少订单?统计上繁重的项目将首先被分配,并且在更多的后续轮次中选择排列将更有可能平衡最初的不平衡。

此程序的目的是最大化数据集中存在的任何异常值将被分配到单独子集的机会。