我有一个原始矩阵
originalOD = np.array([[1,2,4], [3,2,3], [4,2,2]])
#### Now we can sum productions and attractions####
originalD=np.sum(originalOD,axis=0)
originalO=np.sum(originalOD,axis=1)并希望将原创和原创融合在一起:
targetD=np.array([16,9,9])
targetO=np.array([14,8,12])我正在尝试使用一些收敛条件在循环中完成此操作:
Convergence=0
while True:
xD=targetD/originalD
newOD=originalOD*xD
newD=np.sum(newOD,axis=0)
xO=targetO/originalO
newOD=originalOD*xO
newO=np.sum(newOD,axis=1)
Convergence = (sum(newO)/sum(targetO)+sum(newD)/sum(targetD))/2
print('Converged:', Convergence)
if Convergence<1.01 and Convergence>0.99:
break
else:
continue它正在运行,但似乎xD和xO在随后的循环中没有变化,即
Converged: 1.0220588235294117
Converged: 1.0220588235294117
Converged: 1.0220588235294117
Converged: 1.0220588235294117对代码中需要修改的地方有什么想法吗?
发布于 2020-01-13 05:19:53
看起来您未能在while循环中更新矩阵(OD)以及起始和目标总计,因此,当前在每个循环中,您只是应用了从原始矩阵派生的相同因子。尝试以下操作:
newOD=originalOD
newD=np.sum(newOD,axis=0)
newO=np.sum(newOD,axis=1)
Convergence=0
while True:
xD=targetD/newD
newOD=newOD*xD
newD=np.sum(newOD,axis=0)
xO=targetO/newO
newOD=newOD*xO
newO=np.sum(newOD,axis=1)
Convergence = (sum(newO)/sum(targetO)+sum(newD)/sum(targetD))/2
print('Converged:', Convergence)
if Convergence<1.01 and Convergence>0.99:
break
else:
continue您还可以考虑将最大迭代次数添加到计算中,因为不能保证速度收敛,特别是在矩阵稀疏的情况下。
https://stackoverflow.com/questions/57903289
复制相似问题