2011-09-24 59 views
4

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

任何人都可以提出一种算法来自动化吗? Python或R中是否有任何包或模块可用于执行此操作?我应该从哪里开始?

+0

此问题说明类似于NP完整的分区问题http://en.wikipedia.org/wiki/Partition_problem。 –

+0

这就是我的想法,但我需要的不是一个最佳的划分,而只是一个粗略的近似。任何人都可以建议我应该如何设计一个迭代来检查上述情况下的所有可能的分割?那会有多少种组合? – twowo

+0

请看看这个SO问题http://stackoverflow.com/questions/4803668/3-partition-problem –

回答

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 
+3

The整点是他们不能随机的。每个群体需要具有某些特质的大致相等的比例。 'random.sample'只会给你(大约)对于大群体 - 比OP提到的240多得多。然而,把它放在一个循环中,然后检查结果是否符合标准,并且它可以工作(因为这个组只有240个,你可以做很多次而没有性能问题)。 – agf

+0

非常感谢!我认为它会解决问题。我只是很好奇,如果我想要进行穷举搜索,会有多少组合呢? – twowo

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

如果您仍然对穷举搜索问题感兴趣,你可以选择80个可能性来选择第一组,然后另一个160选择第二组的80个,此时第三组是固定的。总之,这给你:

120554865392512357302183080835497490140793598233424724482217950647 * 92045125813734238026462263037378063990076729140

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

0

令您的项目由他们减少从平均Mahalanobis distance;他们将从最不寻常的到最无聊的,,包括措施之间存在的任何相关性的影响。

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

为什么要降序?首先分配统计重量较大的项目,然后在较大数量的后续轮次中选择置换将有较好的平衡初始失衡的机会。

该过程的要点是最大限度地提高数据集中存在任何异常值的机会将分配给不同的子集。

相关问题