Nested defaultdict-更新值时出错

问题描述 投票:0回答:1

我有一本名为dQalpha的字典,另一本名为dQbeta的字典,它们分别计算工人dQalpha[worker]的经验和项目dQbeta[example]的难度。

我现在要添加一个名为dQgamma的新度量标准,该度量标准通过使用dQgamma[worker][example](嵌套的defaultdict)来计算工作人员与项目的相关性。

但是,如果我说self.dQgamma=defaultdict(lambda: defaultdict(dict)),则会收到错误消息

TypeError: float() argument must be a string or a number

如果我说self.dQgamma=defaultdict(lambda: defaultdict(list)),我会收到此错误消息

ValueError: setting an array element with a sequence.

有人可以帮忙吗?这是代码:

self.dQalpha={}
self.dQbeta={}
self.dQgamma=defaultdict(lambda: defaultdict(dict))


der = np.zeros_like(x)
i = 0
for worker in self.workers:
    der[i] = -self.dQalpha[worker] 
    i = i + 1
for example in self.examples:
    der[i] = -self.dQbeta[example] 
    i = i + 1
for worker in self.workers:
    for example in self.examples:
        der[i] = self.dQgamma[worker][example] #VALUE ERROR HERE
        i = i + 1

return der

UPDATE

如果我说self.dQgamma=defaultdict(lambda: defaultdict(der.dtype)),我得到

NameError: global name 'der' is not defined

这是更完整的代码段

  def gradientQ(self):

        self.dQalpha={}
        self.dQbeta={}
        self.dQgamma=defaultdict(lambda: defaultdict(der.dtype))

        for example, worker_label_set in self.e2wl.items():
            dQb = 0
            for (worker, label) in worker_label_set:
                for tlabel in self.prior.keys():
                    sigma = self.sigmoid(self.alpha[worker]*self.expbeta(self.beta[example]))
                    delta = self.kronecker_delta(label,tlabel)
                    dQb = dQb + self.e2lpd[example][tlabel]*(delta-sigma)*self.alpha[worker]*self.expbeta(self.beta[example])\
                          *self.expgamma(self.gamma[worker][example])
            self.dQbeta[example] = dQb - (self.beta[example] - self.priorbeta[example])

        for worker, example_label_set in self.w2el.items():
            dQa = 0
            for (example, label) in example_label_set:
                for tlabel in self.prior.keys():
                    sigma = self.sigmoid(self.alpha[worker]*self.expbeta(self.beta[example]))
                    delta = self.kronecker_delta(label,tlabel)
                    dQa = dQa + self.e2lpd[example][tlabel]*(delta-sigma)*self.expbeta(self.beta[example])\
                          *self.expgamma(self.gamma[worker][example])

            self.dQalpha[worker] = dQa - (self.alpha[worker] - self.prioralpha[worker])


        for worker, example_label_set in self.w2el.items():
            for example, worker_label_set in self.e2wl.items():
                dQg = 0
                for tlabel in self.prior.keys():
                    sigma = self.sigmoid(self.alpha[worker]*self.expbeta(self.beta[example])*\
                                         self.expgamma(self.gamma[worker][example]))
                    delta = self.kronecker_delta(label, tlabel)
                    dQg = dQg + self.e2lpd[example][tlabel]*(delta-sigma)*self.alpha[worker]*self.expbeta(self.beta[example])\
                          *self.expgamma(self.gamma[worker][example])

            self.dQgamma[worker][example] = dQg - (self.gamma[worker][example] - self.priorgamma[worker][example])




    def optimize_df(self,x):
        # unpack x
        i=0
        for worker in self.workers:
            self.alpha[worker] = x[i]
            i = i + 1

        for example in self.examples:
            self.beta[example] = x[i]
            i = i + 1

        for worker in self.workers:
            for example in self.examples:
                self.gamma[worker][example] = x[i]
                i = i + 1



        self.gradientQ()

        # pack x
        der = np.zeros_like(x)
        i = 0
        for worker in self.workers:
            der[i] = -self.dQalpha[worker] #Flip the sign since we want to minimize
            i = i + 1
        for example in self.examples:
            der[i] = -self.dQbeta[example] #Flip the sign since we want to minimize
            i = i + 1
        for worker in self.workers:
            for example in self.examples:
                der[i]= self.dQgamma[worker][example] #Flip the sign since we want to minimize #TODO: fix
                i = i + 1
        return der
python arrays dictionary nested defaultdict
1个回答
0
投票

self.dQgamma[worker][example]返回的值是字典还是列表(取决于您声明的方式。)>

您尝试将其影响到期望标量的numpy数组。这就是为什么您有一个错误。

您应该声明dQgamma以使其返回数组的兼容值:

self.dQgamma=defaultdict(lambda: defaultdict(der.dtype))
© www.soinside.com 2019 - 2024. All rights reserved.