【发布时间】:2021-08-13 14:26:00
【问题描述】:
现在我被这个问题困扰了一个星期,我不知道为什么会这样。所以我想向你提出我的问题,看看你是否有解决方案。
我有这个代码。我的目的是使用循环更新此变量 A 和 B。所以,我首先使用调用类时给出的 A 和 B 执行所有计算,然后代码计算 gamma 和 xi,最后我想计算新的 A 和 B。
我首先在课堂上创建用于查找计算 gamma 和 xi 所需的值的函数。然后我创建用于查找 gamma 和 xi 的函数。在这个函数中,我用 self.fun 调用前面的函数。
然后我创建了我在这里展示的函数来计算新的 A 和 B 值并将它插入一个循环中,因为我想迭代这个函数直到我达到收敛。
但是…… 此方法可以正确计算 A,但是,当它需要计算 B 时,它会在计算 B 之前使用新的 A。这意味着,在计算 A 时,旧的 A 和 B 用于计算 gamma 和 xi,然后是 A。在计算 B 的地方,它使用新的 A 和 B 来计算 gamma 和 xi,但我希望它使用与计算第一个 A 相同的东西。
def update(self):
for n in range(self.iter):
gamma = self.gamma()
xi = self.xi()
# new trans matrix
new_A = []
for i in range(len(self.A)):
temp = []
for j in range(len(self.A[i])):
numerator = 0
denominator = 0
for r in range(len(self.seq)):
for t in range(len(xi[r])):
numerator += xi[r][t][i][j]
denominator += gamma[r][t][i]
aij = numerator / denominator
temp.append(aij)
new_A.append(temp)
self.A = new_A
emission_signals = unique(self.seq[0])
emission_matrix = []
for k in range(len(emission_signals)):
emission_matrix.append([])
for i in range(len(self.A)):
gamma_vec = []
gamma_num = []
for r in range(len(self.seq)):
for t in range(len(self.seq[r])):
gamma_append = gamma[r][t][i]
gamma_vec.append(gamma_append)
if self.seq[r][t] == emission_signals[k]:
gamma_num_append = gamma[r][t][i]
gamma_num.append(gamma_num_append)
bik = sum(gamma_num) / sum(gamma_vec)
emission_matrix[k].append(bik)
new_B = {}
keys = emission_signals
for i in range(len(keys)):
new_B[keys[i]] = emission_matrix[i]
self.A = new_A
self.B = new_B
return {'A': self.A, 'B': self.B}
我不知道我是否解释得很好,但这是我的问题。 希望你能帮助我!
谢谢!
【问题讨论】:
-
在计算
new_B之前,你做了self.A = new_A。 -
你在函数的中间做了一次,然后在最后做了多余的。听起来第一个是错误的。
-
你是对的。我切断了它,但问题仍然存在。
-
如果我使用 new_A 和 new_B 作为回报,它会给我正确的解决方案,但如果我插入 self.A = new_A 和 self.B = new_B,事情就会出错
-
您甚至从不使用
self.A或self.B的内容,除非使用它们的长度作为for循环的限制。