【发布时间】:2020-05-02 08:35:02
【问题描述】:
我有一本名为dQalpha 的字典和另一本名为dQbeta 的字典,它们分别计算工人的经验dQalpha[worker] 和一个项目的难度dQbeta[example]。
我现在想添加一个名为 dQgamma 的新指标,它使用嵌套的默认字典 dQgamma[worker][example] 来计算工作人员和项目的相关性。
但是,如果我说 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
更新
如果我说 self.dQgamma=defaultdict(lambda: defaultdict(der.dtype)) ,我会得到 p>
NameError: global name 'der' is not defined
编辑
def gradientQ(self, dtype):
self.optimize_df(x)
self.dQalpha={}
self.dQbeta={}
self.dQgamma=defaultdict(lambda: defaultdict(x.dtype))
#ERROR TypeError: first argument must be callable
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(x.dtype)
# 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
【问题讨论】:
-
defaultdict(lambda: defaultdict(dict))会给你一个defaultdict,其中包含defaultdicts,其中包含dicts。当您执行self.dQgamma[worker][example]时,您将获得dict对象(或在第二种情况下为list对象),而der[i]需要一个浮点值,因此会出现错误。如果您希望dQgamma成为包含defaultdicts 的float值的defaultdict,则执行defaultdict(lambda: defaultdict(float))(如果您想存储x具有的任何数据类型的值,甚至是defaultdict(lambda: defaultdict(x.dtype)))。 -
感谢您的评论。你知道如何解决出现的
NameError: global name 'der' is not defined吗? -
那是因为您没有在第二个 sn-p 中定义任何
der变量。 -
我在名为
optimize_df的第二个函数中将其定义为der = np.zeros_like(x),但在第一个函数中,如果我在定义dQalpha、dQbeta、dQgamma 之后执行此操作,则找不到@987654354 @然后我不知道该怎么办
标签: python arrays dictionary nested defaultdict