我有一个包含三个字段的数据集: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
我们可以看到,特征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 - 仅限不同值的数量。除非我误解了熵公式。
所以我的问题是:
答案 0 :(得分:1)
关于填补表格中的空白,您可以使用“辅助”临时表和有效的功能列表,通过UNION
将CROSS 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}}