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 具有最大的分布,并且在 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 技能不足以找出可以绕过这个限制的(高性能)查询......

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

所以我的问题是:

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

1 回答 1

0

关于填补表格中的空白,您可以使用带有有效特征列表的“帮助”临时表,UNION通过CROSS JOIN. “如何”实际上取决于您使用的数据库语言。例如,假设您有一个名为“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
   )

这是一个 SQLFiddle

于 2013-05-13T19:56:32.303 回答