我在另一个文件调用a.baum_welchm( record,test,delta=0.001,max_iteration=float('inf'))时,record和test都是一个数组,但是record能传进去,test就传不进去,总是报错说我给delta传递了多个值TypeError: baum_welchm() got multiple values for argument 'delta'
def baum_welchm(self, os, test,delta=0.001,max_iteration=float('inf')):
K=len(os)
log_likelihood_prev = float('-inf')
iteration_number = 0
while True:
logm=0
for single_o in os:
alpha, log_likelihood, scale = self.forward_with_scale(single_o)
logm+=log_likelihood
now_delta = logm - log_likelihood_prev
if (now_delta <= delta) or (iteration_number >= max_iteration):
break
else:
log_likelihood_prev = logm
iteration_number += 1
init_ho=self.ho.copy()
#K个学生的 原本A 和 B 的中的分子分母在 多序列的更新公式中 需要累加,然后进行 加权平均,所有建立存放各分子分母的矩阵
multi_pi= np.zeros((K, self.h), np.float)
multi_A_numerator= np.zeros((K,self.h, self.h), np.float)
multi_A_denominator= np.zeros((K,self.h, self.h), np.float)
multi_B_numerator= np.zeros((K,self.h, self.o), np.float)
multi_B_denominator= np.zeros((K,self.h, self.o), np.float)
cishu=0
for single_o in os:
os_length=len(single_o)
alpha, log_likelihood, scale = self.forward_with_scale(single_o)
beta = self.backward_with_scale(single_o, scale)
gamma = self.computer_gamma(os_length, alpha, beta)
xi = self.computer_xi(single_o, alpha, beta)
# 算出每一个学生的新的pi, 最后大for循环结束的时候,更新pi的值
for i in range(self.h):
multi_pi[cishu][i]=gamma[0][i]
# 算出A每一个学生的分子 分母,最后结束的时候累加,相除
for i in range(self.h):
denominator_A = 0.0
for t in range(os_length-1):
denominator_A += gamma[t][i]
#denominator_A
for j in range(self.h):
numerator_A = 0.0
for t in range(os_length-1):
numerator_A += xi[t][i][j]
#numerator_A*=1/math.exp(log_likelihood)
multi_A_numerator[cishu][i][j]=numerator_A*math.exp(log_likelihood)
multi_A_denominator[cishu][i][j]=denominator_A*math.exp(log_likelihood)
denominator_B = denominator_A + gamma[os_length-1][i]
for o in range(self.o):
numerator_B = 0.0
for t in range(os_length):
if single_o[t] == o:
numerator_B += gamma[t][i]
multi_B_denominator[cishu][i][o]=denominator_B*math.exp(log_likelihood)
multi_B_numerator[cishu][i][o]=numerator_B*math.exp(log_likelihood)
cishu+=1
for j in range(self.h):
self.pi[j]=sum(multi_pi[:,j])/K
for i in range(self.h):
for j in range(self.h):
sum_fenzi=0
sum_fenmu=0
for k in range(K):
sum_fenzi+=multi_A_numerator[k][i][j]
sum_fenmu+=multi_A_denominator[k][i][j]
self.hh[i][j]=sum_fenzi/sum_fenmu
for i in range(self.h):
for j in range(self.o):
sum_fenzi=0
sum_fenmu=0
for k in range(K):
sum_fenzi+=multi_B_numerator[k][i][j]
sum_fenmu+=multi_B_denominator[k][i][j]
self.ho[i][j]=sum_fenzi/sum_fenmu
if self.ho[0][1]>0.5:
self.ho[0][0]=init_ho[0][0]
self.ho[0][1]=init_ho[0][1]
if self.ho[1][0]>0.5:
self.ho[1][0]=init_ho[1][0]
self.ho[1][1]=init_ho[1][1]
L0 = self.pi[1]
T = self.hh[0][1]
S = self.ho[1][0]
F = self.hh[1][0]
G = self.ho[0][1]
predict_last_one = []
predict_prob = []
predict_right = []
predict_wrong = []
for single_o in os:
real = single_o.copy()
chushi = single_o.copy()
chushi[0] = L0
j = 0
for i in single_o:
if i == 0:
# 实际的知识掌握程度
real[j] = S * L0 / (S * L0 + (1 - G) * (1 - L0))
# 经过学习后,下一次答题之前实际掌握知识的概率
if (j + 1) == len(single_o):
# 如果已经是最后一题了,就不用更新经过学习之后的状态了
break
else:
L0 = real[j] * (1 - F) + (1 - real[j]) * T
# theta[0]=L0
j += 1
chushi[j] = L0
else:
real[j] = (1 - S) * L0 / ((1 - S) * L0 + G * (1 - L0))
if (j + 1) == len(single_o):
break
else:
L0 = real[j] * (1 - F) + (1 - real[j]) * T
# theta[0]=L0
j += 1
chushi[j] = L0
# 计算 最后一个要预测的初始pi
L0 = real[len(real) - 1] * (1 - F) + (1 - real[len(real) - 1]) * T
po = L0 * (1 - S) + (1 - L0) * G
predict_prob.append(po)
if (single_o[-1] == 1):
if po < 0.5:
predict_right.append(0)
else:
predict_right.append(1)
if (single_o[-1] == 0):
if po > 0.5:
predict_wrong.append(0)
else:
predict_wrong.append(1)
if po > 0.5:
predict_last_one.append(1)
else:
predict_last_one.append(0)
# predict_last_one.append(po)
print(predict_last_one)
count = 0
for i in range(len(test)):
if test[i] == predict_last_one[i]:
count += 1
accuracy = count / len(test)
sum_mse = 0
sum_mae = 0
for i in range(len(test)):
sum_mse += (test[i] - predict_prob[i]) * (test[i] - predict_prob[i])
sum_mae += abs(test[i] - predict_prob[i])
MSE = sum_mse / len(test)
RMSE = MSE ** 0.5
MAE = sum_mae / len(test)
actual_prob = sum(predict_prob) / len(predict_prob)
racc = sum(predict_right) / len(predict_right)
wacc = sum(predict_wrong) / len(predict_wrong)
print(racc,wacc)
return logm,iteration_number
test里面是不是包含一个名称为delta的属性,如果是,尝试把参数delta改成别的名称