2013-05-13 57 views
1

我有一個包含三個字段的數據集:id,特徵和頻率。我想要做的是找出一組給定的id,哪個特徵具有最大的頻率分佈。我想要的結果是,如果我將id組分組爲兩個子組,使用該特徵的頻率中值,則我有兩組彼此之間差異最大但尺寸大致相同的組。當數據集不包含頻率爲零的條目時,計算頻率的方差

我的第一個想法是,我計算每個特徵的頻率方差,並使用方差最高的特徵。

給定一個數據庫表,其看起來像這樣:

id | feature | frequency 
---+---------+------------- 
0 | 0  | 1 
0 | 1  | 1 
0 | 2  | 0 
1 | 0  | 2 
1 | 1  | 2 
1 | 2  | 0 
2 | 0  | 3 
2 | 1  | 3 
2 | 2  | 8 
3 | 0  | 4 
3 | 1  | 8 
3 | 2  | 10 
4 | 0  | 5 
4 | 1  | 10 
4 | 2  | 12 
  • 特徵0具有的頻率1,2,3,4,5
  • 特徵1具有1,2,3個頻率,9,10
  • 特徵2具有的頻率0,0,4,10,12

我們可以看到,特徵2具有最大的擴散和splittin 4分g將是一個很好的觀點,可以分成兩組(0,0和4分爲一組,10和12分組到另一組)。

我可以用下面的SQL查詢計算這個

SELECT feature, variance(frequency) as f FROM Dataset WHERE id IN (<list of ids>) GROUP BY feature ORDER BY f DESC LIMIT 1; 

這工作得很好,但也有缺點。我的數據集很稀少(大多數條目的頻率爲零),對於我來說(對於空間和插入條目所需的時間而言)都很昂貴,以便將零頻率項存儲在數據庫中。因此,我的實際表是這個樣子:

id | feature | frequency 
---+---------+------------- 
0 | 0  | 1 
0 | 1  | 1 
1 | 0  | 2 
1 | 1  | 2 
2 | 0  | 3 
2 | 1  | 3 
2 | 2  | 8 
3 | 0  | 4 
3 | 1  | 8 
3 | 2  | 10 
4 | 0  | 5 
4 | 1  | 10 
4 | 2  | 12 

上面的SQL查詢沒有得到正確的結果了,因爲它需要考慮零頻率項,以計算出正確的偏差值。我的SQL技能不足以找出能夠解決此限制的(高性能)查詢...

我的下一個想法是計算最大熵,而不是這樣,因爲它沒有考慮到這一事實考慮到實際頻率值(以及同一頻率值在同一數據集中的「頻率」/次數) - 只有不同值的數量。除非我誤解了熵公式。

所以我的問題是:

  1. 是否有一種方法在SQL做到這一點?
  2. 如果不是,是否有一種方法可以「調整」計算出來的方差來解釋零條目的數量? (假設我知道有多少個零條目被省略)
  3. 如果是,是否有一種方法可以在上面的單個SQL查詢中執行此操作? (同樣,假設我事先知道有多少零條目被省略)
  4. 如果兩者都不可能,是否有一種使用熵和調整實際值的方法?
  5. 我應該考慮一些其他措施(例如峯度?)嗎?是否有任何可以輕鬆調整缺少零條目?
  6. 還是其他建議或替代解決方案?

回答

1

對於在表中填補空白,你可以通過CROSS JOIN的方式使用一個「助手」臨時表與功能的有效列表UNION失蹤零頻率值。 「如何」真的取決於您使用的數據庫語言。例如,假設您有一個名爲「helper」的表格,其中有三行(針對您的三種不同功能)。然後這可能工作:

select id, feature, frequency 
from have 
union 
select b.id 
    , a.feature 
    , 0 as frequency 
from helper a 
cross join have b 
where not exists (
    select 1 from have b1 
    where b1.id=b.id 
    and b1.feature = a.feature 
    ) 

Here is an SQLFiddle