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

6 投票
5 回答
11186 浏览
提问于 2025-04-17 02:59

为了进行一个心理实验,我需要把一组图片(总共有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

我会这样处理这个问题:

  1. 把数据分成3个相等的部分。
  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

撰写回答