I have a dictionary named dQalpha and another one named dQbeta which calculate the experience of a worker dQalpha[worker] and the difficulty of an item dQbeta[example] respectively.
I now want to add a new metric named dQgamma that calculates the correlation of worker and item, by using dQgamma[worker][example] which is a nested defaultdict.
However, if I say self.dQgamma=defaultdict(lambda: defaultdict(dict)), I get the error message
TypeError: float() argument must be a string or a number
If I say self.dQgamma=defaultdict(lambda: defaultdict(list)), I get this error message
ValueError: setting an array element with a sequence.
Can someone help? here's the code:
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
If I say self.dQgamma=defaultdict(lambda: defaultdict(der.dtype)) , I get
NameError: global name 'der' is not defined
EDIT
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))will give you adefaultdictwhich containsdefaultdicts which containdicts. When you doself.dQgamma[worker][example]you are getting adictobject (or alistobject in the second case), andder[i]expects a float value, hence the error. If you wantdQgammato be adefaultdictcontainingdefaultdicts offloatvalues, then dodefaultdict(lambda: defaultdict(float))(or evendefaultdict(lambda: defaultdict(x.dtype))if you want to store values of whatever data typexhas).NameError: global name 'der' is not definedthat occured?dervariable defined in your second snippet.optimize_df, asder = np.zeros_like(x), but in the first function, if i do that after defining dQalpha, dQbeta, dQgamma, it doesn't findxand then i don't know what to do