寻找Python中 trial-and-error 机制的更好设计建议?

1 投票
2 回答
932 浏览
提问于 2025-04-16 18:44

下面是从传感器获取的数据矩阵,都是整数,没有什么特别的。

    A   B   C   D   E   F   G   H   I   J   K
1   25  0   25  66  41  47  40  12  69  76  1
2   17  23  73  97  99  39  84  26  0   44  45
3   34  15  55  4   77  2   96  92  22  18  71
4   85  4   71  99  66  42  28  41  27  39  75
5   65  27  28  95  82  56  23  44  97  42  38
…                                           
10  95  13  4   10  50  78  4   52  51  86  20
11  71  12  32  9   2   41  41  23  31  70  
12  54  31  68  78  55  19  56  99  67  34  94
13  47  68  79  66  10  23  67  42  16  11  96
14  25  12  88  45  71  87  53  21  96  34  41

横向的A到K是传感器的名称,纵向是按时间顺序记录的传感器数据。

现在我想用试错的方法来分析这些数据,我定义了一些概念来解释我想要的内容:

o 来源

来源就是我获取的所有原始数据。

o 条目

一个条目是从A到K所有传感器的数据集合,以第一行数据为例:这个条目是

25  0   25  66  41  47  40  12  69  76  1

o 规则

规则是一个“假设”函数,返回的值是确定的,目前只会返回“真”或“假”。 比如,我假设在一个条目中,传感器A、E和F的值永远不会相同,如果某个条目中A=E=F,那么就会触发违规,这个规则函数会返回假。

o 范围:

范围是一个选择纵向条目的函数,比如,前5个条目。

那么,基本的想法是:

o   source + range = subsource(s)
o   subsource + rules = valiation(s)

最后我想得到的列表可能看起来像这样:

rangeID ruleID violation
1   1   Y
2   1   N
3   1   Y
1   2   N
2   2   N
3   2   Y
1   3   N
2   3   Y
3   3   Y

但问题是,我在这里定义的规则和范围很快就会变得非常复杂,如果你深入看,会发现有太多可能的组合。以“A=E=F”为例,还可以定义“B=E=F”,“C=E=F”,“C>F”等等。

所以我很快需要一个规则/范围生成器,它可以接受这些“核心参数”,比如“A=E=F”,作为输入参数,甚至将来可以使用正则表达式。这太复杂了,让我感到无从下手,更不用说我可能还需要持久化规则的唯一ID、数据存储问题、规则自我嵌套组合的问题……

所以我的问题是:

  1. 有没有人知道是否有适合这种试错计算或我想要的规则定义的模块/软件?

  2. 有没有人可以分享我描述的更好的规则/范围设计?

谢谢任何提示。

祝好,

KC

2 个回答

0

你可以看看Numpy这个库,它提供了一些关于矩阵的数据结构,比如矩阵等。这个库里有很多函数,可以帮助你处理和操作矩阵。

至于规则或范围生成器,恐怕你需要自己创建一个特定领域的语言来实现这个功能。

1

如果我理解你的问题没错的话,我觉得其实不需要用到Numpy,因为根据你的描述,这个工具可能并不是必需的。下面是我可能会用来解决你提到的具体问题的一个示例:

l = [\
        {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1},\
        {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1}\
]
r = ['a=g=i', 'a=b', 'a=c']
res = []

# test all given rules
for n in range(0, len(r)):
        # i'm assuming equality here - you'd have to change this to accept other operators if needed
        c = r[n].split('=')
        vals = []
        # build up a list of values given our current rule
        for e in c:
                vals.append(l[0][e])
        # using len(set(v)) gives us the number of distinct values
        res.append({'rangeID': 0, 'ruleID':n, 'violation':'Y' if len(set(vals)) == 1 else 'N'})

print res

输出结果:

[{'violation': 'N', 'ruleID': 0, 'rangeID': 0}, {'violation': 'N', 'ruleID': 1, 'rangeID': 0}, {'violation': 'Y', 'ruleID': 2, 'rangeID': 0}]

http://ideone.com/zbTZr

这里有一些假设(比如你规则中只使用了等于这个操作符),还有一些功能没有包含在内(比如把你的输入解析成我用的listdict),但我希望你能自己搞定这些。

当然,可能还有一种基于Numpy的解决方案比这个更简单,只是我现在想不起来了(现在很晚了,我要去睡觉了;)),但希望这个对你还是有帮助。

编辑:

哎呀,我漏掉了另外一件事(在发帖前忘记加上了) - 我只测试了l中的第一个元素(给定的范围)……你只需要把它放在另一个for循环里,而不是使用那个硬编码的0索引。

撰写回答