1

请参阅下面从传感器获取的数据矩阵,只是 INT 数字,没有什么特别的。

    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 来源

source 是我得到的所有原始数据

o 条目

条目是所有 A 到 K 传感器的集合,以垂直第一行为例:条目是

25  0   25  66  41  47  40  12  69  76  1

o 规则

规则是一个带有断言值返回的“假设”函数,到目前为止只是“真”或“假”。例如,我假设传感器 A、E 和 F 的值永远不会在一个条目中相同,如果一个条目 A=E=F,它将触发违规,此规则函数将返回 false。

橙:

range 是用于选择垂直条目的函数,例如,前 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. 任何人都可以分享我描述的更好的规则/范围设计吗?

感谢您的任何提示。

Rgs,

KC

4

2 回答 2

1

如果我正确理解您的要求,我什至可能不会冒险走上 Numbpy 的道路,因为根据您的描述,我认为这不是真正需要的。这是我可能如何解决您提出的特定问题的示例实现:

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

这里做了一些假设(例如相等是您的规则中唯一使用的运算符)和一些功能被遗漏了(例如将您的输入解析为我使用的listof dicts,但我希望您能弄清楚这一点靠自己。

当然,可能有一个比这更简单的基于 Numpy 的解决方案,我只是暂时没有想到(现在已经很晚了,我现在要睡觉了;)),但希望这对您有所帮助。

编辑:

糟糕,错过了其他东西(忘记在发布之前添加它) - 我只测试l(给定范围)中的第一个元素。你只想将它粘贴在另一个for循环中,而不是使用那个硬编码的0索引。

于 2011-06-01T06:26:13.857 回答
0

您想查看 Numpy 矩阵中的矩阵等数据结构。它公开了一个处理矩阵操作的函数列表。

至于规则/范围生成器,恐怕您必须构建自己的领域特定语言才能实现这一目标。

于 2011-06-01T05:44:25.203 回答