将集合划分为元素数相等的子集

2024-04-25 04:09:51 发布

您现在位置:Python中文网/ 问答频道 /正文

为了进行心理实验,我必须将一组由4个特征(实数)描述的图片(240)分成3个子集,每个子集中的元素数相等(240/3=80),这样所有子集就这些特征(平均值和标准差)近似平衡。

有人能提出一个自动算法吗?有没有Python或R中的包/模块可以用来实现这一点?我应该从哪里开始?


Tags: 模块算法元素图片特征子集平均值实数
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. 分成3等子集。
  2. 计算出每个子集的均值和方差。从中构造一个“不均匀”度量。
  3. 比较每对元素,如果交换可以减少“不均匀性”,则交换它们。继续,直到没有更多的对可比较,或者总不均匀度低于某个任意的“足够好”阈值。

您可以使用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))

相关问题 更多 >