当数据集不包含频率为零的条目时,计算频率的方差

时间:2013-05-13 17:42:18

标签: sql missing-data variance entropy

我有一个包含三个字段的数据集:id,feature和frequency。我想要做的是找出一组给定的id,哪个特征具有最大的频率扩展。我想要的结果是,如果我将id组分成两个子组,使用该特征的频率中值,我有两组彼此最不同但大小大致相同的组。 / p>

我的第一个想法是我计算每个特征的频率方差,并使用方差最高的特征。

给定一个类似于下面的数据库表:

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具有最大的扩散,并且在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技能不足以找出可以解决这个限制的(高效)查询...

我的下一个想法是计算最大熵,但是它会受到以下事实的影响:它不会将实际频率值(以及同一数据集中相同频率值的“频率”/次数)变为account - 仅限不同值的数量。除非我误解了熵公式。

所以我的问题是:

  1. 有没有办法在SQL中执行此操作?
  2. 如果没有,是否有办法“调整”计算的方差以考虑零条目的数量? (假设我知道省略了多少个零条目)
  3. 如果是,有没有办法在上面的单个SQL查询中执行此操作? (再次假设我事先知道省略了多少零条目)
  4. 如果两者都不可能,有没有办法使用熵并调整实际值?
  5. 我应该考虑一些其他措施(例如峰度吗?)?是否可以轻松调整缺少的零项?
  6. 或任何其他建议或替代解决方案?

1 个答案:

答案 0 :(得分:1)

关于填补表格中的空白,您可以使用“辅助”临时表和有效的功能列表,通过UNIONCROSS JOIN丢失的零频率值用于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 ) 。 “如何”实际上取决于您使用的数据库语言。例如,假设您有一个名为“helper”的表,其中包含三行(针对您的三个不同功能)。这可能会起作用:

{{1}}

Here is an SQLFiddle