2011-09-24 99 views
4

爲了進行心理學實驗,我必須將由4個特徵(實數)描述的一組圖像(240)分成3個子集,每個子​​集具有相同數量的元素(240/3 = 80),使得所有子集相對於這些特徵近似平衡(就平均值和標準偏差而言)。將組劃分爲具有相同元素數量的子集

任何人都可以提出一種算法來自動化嗎? Python或R中是否有任何包或模塊可用於執行此操作?我應該從哪裏開始?

+0

此問題說明類似於NP完整的分區問題http://en.wikipedia.org/wiki/Partition_problem。 –

+0

這就是我的想法,但我需要的不是一個最佳的劃分,而只是一個粗略的近似。任何人都可以建議我應該如何設計一個迭代來檢查上述情況下的所有可能的分割?那會有多少種組合? – twowo

+0

請看看這個SO問題http://stackoverflow.com/questions/4803668/3-partition-problem –

回答

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 
+3

The整點是他們不能隨機的。每個羣體需要具有某些特質的大致相等的比例。 'random.sample'只會給你(大約)對於大羣體 - 比OP提到的240多得多。然而,把它放在一個循環中,然後檢查結果是否符合標準,並且它可以工作(因爲這個組只有240個,你可以做很多次而沒有性能問題)。 – agf

+0

非常感謝!我認爲它會解決問題。我只是很好奇,如果我想要進行窮舉搜索,會有多少組合呢? – twowo

2

我會解決這個如下:

  1. 分爲3點相等的子集。
  2. 找出每個子集的均值和方差。從他們構建「不平衡」措施。
  3. 比較每對元素,如果交換會減少「不均勻性」,交換它們。繼續,直到沒有更多的對比較,或者總體不均勻性低於某個任意「足夠好」的閾值。
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)) 
1

如果您仍然對窮舉搜索問題感興趣,你可以選擇80個可能性來選擇第一組,然後另一個160選擇第二組的80個,此時第三組是固定的。總之,這給你:

120554865392512357302183080835497490140793598233424724482217950647 * 92045125813734238026462263037378063990076729140

顯然,這是不是一種選擇:)

0

令您的項目由他們減少從平均Mahalanobis distance;他們將從最不尋常的到最無聊的,,包括措施之間存在的任何相關性的影響。

爲子集A,B,C分配X [3 * i] X [3 * i + 1] X [3 * i + 2],爲每個i選擇最小化A/B/C的順序你的不匹配措施。

爲什麼要降序?首先分配統計重量較大的項目,然後在較大數量的後續輪次中選擇置換將有較好的平衡初始失衡的機會。

該過程的要點是最大限度地提高數據集中存在任何異常值的機會將分配給不同的子集。

相關問題