将集合分成元素数量相等的子集
为了进行一个心理实验,我需要把一组图片(总共有240张)根据4个特征(这些特征是实数)分成3个子集,每个子集里要有相同数量的图片(240除以3等于80)。而且,这些子集在这些特征上要尽量保持平衡,也就是说在平均值和标准差方面要差不多。
有没有人能推荐一个算法来自动完成这个任务?在Python或R语言中有没有可以用的包或模块?我应该从哪里开始呢?
5 个回答
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))
2
我会这样处理这个问题:
- 把数据分成3个相等的部分。
- 计算每个部分的平均值和方差。然后用这些数据来构建一个“均匀度”指标。
- 比较每一对元素,如果交换它们能让“均匀度”变得更好,就交换它们。一直这样做,直到没有更多的元素可以比较,或者总的均匀度低于某个随便设定的“足够好”的标准。
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