如何识别描述数据集的最小参数集

时间:2020-03-06 15:05:27  来源:igfitidea点击:

我有一堆回归测试数据。每个测试只是消息列表(关联数组),将消息字段名称映射为值。这些数据中有很多重复项。

例如

test1 = [
      { sender => 'client',  msg => '123',  arg => '900', foo => 'bar', ... },
      { sender => 'server',  msg => '456',  arg => '800', foo => 'bar', ... },
      { sender => 'client',  msg => '789',  arg => '900', foo => 'bar', ... },
   ]

我想表示现场数据(作为最小深度决策树?),以便可以使用最少数量的参数以编程方式重新生成每条消息。例如,在上面

  • foo始终是" bar",因此我无需提及
  • 发件人和客户之间是相关的,所以我只需要提及一个或者另一个
  • 味精每次都不同

因此,我希望能够使用以下程序通过程序重新生成这些消息:

write_msg( 'client', '123' )
write_msg( 'server', '456' )
write_msg( 'client', '789' )

其中write_msg函数由嵌套的if语句或者使用参数的子函数调用组成。

根据原始数据,如何确定"最重要"的参数集,即可以让我使用最少数量的参数来重新创建数据集的参数?

解决方案

这看起来与数据库规范化非常相似。

我们有一个关系(测试数据集),以及一些已知的功能依赖性({sender} => arg,{} => foo以及可能的{msg} => sender。如果测试的顺序很重要,请添加{testNr} => msg。),我们想消除冗余。

将测试集视为数据库表,应用规范化规则并为每个联接创建等效函数(getArgFromSender(sender)等)。

如果字段和记录的数量很少:

通过遍历字段的每个组合来强行使用它,并针对每个组合检测列表中是否存在多个映射到相同值的项。

如果我们可以选择相当不错的字段:

首先假设我们需要所有字段。然后,随机选择一个字段,看看是否可以消除它;如果可以的话,将其划掉字段范围。否则,请随机选择另一个字段,然后重试。如果我们发现没有可以消除的字段,那么我们已经找到了一组合理的字段。如果我们首先选择了其他领域,则可能会找到更好的解决方案。我们可以重复整个过程几次,并根据需要选择最佳解决方案。这种方法称为爬山。

(我怀疑这个问题是NP完整的,即我们可能不知道有效而强大的解决方案,因此不应该因为梦想出一个完美的解决方案而失去睡眠)

以下论文描述了用于发现功能依赖项的算法:

Y. Huhtala, J. K?rkk?inen, P. Porkka,
  and H. Toivonen.  TANE: An efficient
  algorithm for discovering functional 
  and approximate dependencies. The
  Computer Journal,  42(2):100–111,
  1999, doi:10.1093/comjnl/42.2.100.
  
  I. Savnik and P. A. Flach. Bottom-up
  induction of functional  dependencies
  from relations. In Proc. AAAI-93 Workshop:
  Knowledge Discovery in Databases,
  pages 174–185, Washington,  DC, USA,
  1993. 
  
  C. Wyss, C. Giannella, and E.
  Robertson. FastFDs: A 
  Heuristic-Driven, Depth-First
  Algorithm for Mining Functional
  Dependencies from Relation Instances.
  In Proc. Data Warehousing and Knowledge Discovery, pages 101–110, Munich,
  Germany, 2001, doi:10.1007/3-540-44801-2.
  
  Hong Yao and Howard J. Hamilton. "Mining functional dependencies from data."  Data Mining and Knowledge Discovery, 2008, doi:10.1007/s10618-007-0083-9.

在发现多值依赖项方面也有一些工作:

I. Savnik and P. A. Flach. "Discovery
  of Mutlivalued Dependencies from
  Relations." Intelligent Data Analysis
  Journal, 4(3):195–211, IOS Press, 2000.