为了进行心理学实验,我必须将由4个特征(实数)描述的一组图像(240)分成3个子集,每个子集具有相同数量的元素(240/3 = 80),使得所有子集相对于这些特征近似平衡(就平均值和标准偏差而言)。将组划分为具有相同元素数量的子集
任何人都可以提出一种算法来自动化吗? Python或R中是否有任何包或模块可用于执行此操作?我应该从哪里开始?
为了进行心理学实验,我必须将由4个特征(实数)描述的一组图像(240)分成3个子集,每个子集具有相同数量的元素(240/3 = 80),使得所有子集相对于这些特征近似平衡(就平均值和标准偏差而言)。将组划分为具有相同元素数量的子集
任何人都可以提出一种算法来自动化吗? Python或R中是否有任何包或模块可用于执行此操作?我应该从哪里开始?
如果我理解正确的话您的问题,您可以在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
我会解决这个如下:
您可以使用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))
如果您仍然对穷举搜索问题感兴趣,你可以选择80个可能性来选择第一组,然后另一个160选择第二组的80个,此时第三组是固定的。总之,这给你:
120554865392512357302183080835497490140793598233424724482217950647 * 92045125813734238026462263037378063990076729140
显然,这是不是一种选择:)
令您的项目由他们减少从平均Mahalanobis distance;他们将从最不寻常的到最无聊的,,包括措施之间存在的任何相关性的影响。
为子集A,B,C分配X [3 * i] X [3 * i + 1] X [3 * i + 2],为每个i选择最小化A/B/C的顺序你的不匹配措施。
为什么要降序?首先分配统计重量较大的项目,然后在较大数量的后续轮次中选择置换将有较好的平衡初始失衡的机会。
该过程的要点是最大限度地提高数据集中存在任何异常值的机会将分配给不同的子集。
此问题说明类似于NP完整的分区问题http://en.wikipedia.org/wiki/Partition_problem。 –
这就是我的想法,但我需要的不是一个最佳的划分,而只是一个粗略的近似。任何人都可以建议我应该如何设计一个迭代来检查上述情况下的所有可能的分割?那会有多少种组合? – twowo
请看看这个SO问题http://stackoverflow.com/questions/4803668/3-partition-problem –