我有一个包含三个字段的数据集: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 技能不足以找出可以绕过这个限制的(高性能)查询......
我的下一个想法是计算最大熵,但这会受到以下事实的影响:它没有考虑实际频率值(以及相同频率值在同一数据集中的“频率”/次数) - 仅不同值的数量。除非我误解了熵公式。
所以我的问题是:
- 有没有办法在 SQL 中做到这一点?
- 如果没有,有没有办法“调整”计算出的方差来解释零条目的数量?(假设我知道省略了多少个零条目)
- 如果是,有没有办法在上面的单个 SQL 查询中执行此操作?(再次假设我事先知道省略了多少个零条目)
- 如果两者都不可能,有没有办法使用熵并调整实际值?
- 我应该考虑其他一些措施(例如峰度?)?是否有任何可以轻松调整丢失零条目的方法?
- 或任何其他建议或替代解决方案?