我需要计算和存储一个条件概率表(用于贝叶斯网络),它是一个矩阵的提取,其输入为N(每个节点的唯一阈值数)和T(节点可以拥有的父节点数) )。 T的值通常为1至10& N的范围通常为3到7。
示例,
If N = 5, and T = 1 the values will be 5^1=5
if N = 5, and T = 2 the values will be 5^2 = 25
if N = 5, and T = 3 the values will be 5^3 = 125
(and so on).
N的值也可以改变,但我保持这个例子简单。
所需的输出是: (对于T = 1& N = 5,输出应为5 ^ 1 = 5,即1 * 5矩阵 [0.2,0.2,0.2,0.2,0.2]):
T_Id Cell_Id Probability
T001 1 0.2
T001 2 0.2
T001 3 0.2
T001 4 0.2
T001 5 0.2
(对于T = 2& N = 5,输出应为5 ^ 2 = 25,即5 * 5矩阵):
T_Id Cell_Id Probability
T002 1 0.732292842
T002 2 0.232364214
T002 3 0.033319518
T002 4 0.001977041
T002 5 4.63852E-05
T002 6 0.188558672
T002 7 0.59424024
T002 8 0.188558672
T002 9 0.027038088
T002 10 0.001604327
T002 11 0.026367464
T002 12 0.183881865
T002 13 0.579501342
T002 14 0.183881865
T002 15 0.026367464
T002 16 0.001604327
T002 17 0.027038088
T002 18 0.188558672
T002 19 0.59424024
T002 20 0.188558672
T002 21 4.63852E-05
T002 22 0.001977041
T002 23 0.033319518
T002 24 0.232364214
T002 25 0.732292842
同样对于T = 3& N = 5,输出应为5 ^ 3 = 125,依此类推......
如何通过Python保持T& S组合的可扩展性来实现这一目标。 N记在心里?
P.S。 :使用下面的代码可以实现类似的功能,但是它使用RANDOM值作为输入,可以修改下面的代码以实现如上所示的结果吗?
import random
precision = 1000
def f(n) :
matrix = []
for l in range(n) :
lineLst = []
sum = 0
crtPrec = precision
for i in range(n-1) :
val = random.randrange(crtPrec)
sum += val
lineLst.append(float(val)/precision)
crtPrec -= val
lineLst.append(float(precision - sum)/precision)
matrix.append(lineLst)
return matrix
matrix = f(5)
print matrix
上面的示例输出:
[[0.64, 0.229, 0.043, 0.034, 0.054],
[0.847, 0.04, 0.068, 0.04, 0.005],
[0.758, 0.148, 0.006, 0.027, 0.061],
[0.159, 0.477, 0.329, 0.023, 0.012],
[0.817, 0.146, 0.026, 0.01, 0.001]]
预期输出(如果N = 5,即f(5)):
[[0.7322, 0.2323, 0.0333, 0.0019, 4.63852E-05],
[0.1885, 0.5942, 0.1885, 0.0270, 0.0016],
[0.0263, 0.1838, 0.5795, 0.1838, 0.0263],
[0.0016, 0.0270, 0.1885, 0.5942, 0.1885],
[4.63852E-05, 0.0019, 0.0333, 0.2323, 0.7322]]