爲了進行心理學實驗,我必須將由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 –