[英]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.