我有一個包含三個字段的數據集: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技能不足以找出能夠解決此限制的(高性能)查詢...
我的下一個想法是計算最大熵,而不是這樣,因爲它沒有考慮到這一事實考慮到實際頻率值(以及同一頻率值在同一數據集中的「頻率」/次數) - 只有不同值的數量。除非我誤解了熵公式。
所以我的問題是:
- 是否有一種方法在SQL做到這一點?
- 如果不是,是否有一種方法可以「調整」計算出來的方差來解釋零條目的數量? (假設我知道有多少個零條目被省略)
- 如果是,是否有一種方法可以在上面的單個SQL查詢中執行此操作? (同樣,假設我事先知道有多少零條目被省略)
- 如果兩者都不可能,是否有一種使用熵和調整實際值的方法?
- 我應該考慮一些其他措施(例如峯度?)嗎?是否有任何可以輕鬆調整缺少零條目?
- 還是其他建議或替代解決方案?