【问题标题】:A strange (because i am new in python) result when i update self variable. Why this happens?当我更新 self 变量时,一个奇怪的结果(因为我是 python 新手)。为什么会发生这种情况?
【发布时间】: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.Aself.B 的内容,除非使用它们的长度作为for 循环的限制。

标签: python loops class self


【解决方案1】:

很难看不到其余代码,但看起来您正在多次引用可变对象 A 和 B(列表和字典),并从不同的地方编辑它们。

请注意,在 python 中,每次将可变对象分配给变量时,您只是创建了对同一对象的新引用,而不是复制它。因此,您对该对象所做的每次编辑都会反映在其所有引用上。

【讨论】:

  • 我发现了问题。如果我使用 print(self.update()) 我会获得正确的值,但如果我使用 '' print(self.update().get('A')) print(self.update().get('B '))'' 我错了。我不知道为什么
【解决方案2】:

好的。问题是这样的:

 print(self.update().get('A'))
        print(self.update().get('B'))

我以这种方式更改它,现在它可以工作,但我不明白这背后的逻辑。

     a = self.update()
     print('\n---New transition matrix... ---')
     print(a.get('A'))
     print('\n---New Emission matrix... ---')
     print(a.get('B'))

也许在以前的方式中,我调用 update 2 次,然后计算出错。我不知道。

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多