[英]Calculate variance of frequencies when dataset does not contain entries of frequency zero
我有一個包含三個字段的數據集: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
我們可以看到特征2具有最大的擴展,將4拆分會很好地將其分為兩組(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技能不足以找出可以解決此限制的(性能)查詢...
我的下一個想法是計算最大熵,但是這受到以下事實的困擾:它沒有考慮實際的頻率值(以及“頻率” /相同頻率值在同一數據集中的次數)-僅不同值的數量。 除非我誤解了熵公式。
所以我的問題是:
關於填補表中的空白,您可以使用帶有有效功能列表的“ helper”臨時表,通過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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.