首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中使用循环中的收敛条件来细化矩阵

如何在Python中使用循环中的收敛条件来细化矩阵
EN

Stack Overflow用户
提问于 2019-09-12 17:04:27
回答 1查看 906关注 0票数 1

我有一个原始矩阵

代码语言:javascript
复制
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)

并希望将原创和原创融合在一起:

代码语言:javascript
复制
targetD=np.array([16,9,9])
targetO=np.array([14,8,12])

我正在尝试使用一些收敛条件在循环中完成此操作:

代码语言:javascript
复制
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在随后的循环中没有变化,即

代码语言:javascript
复制
Converged: 1.0220588235294117
Converged: 1.0220588235294117
Converged: 1.0220588235294117
Converged: 1.0220588235294117

对代码中需要修改的地方有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-13 05:19:53

看起来您未能在while循环中更新矩阵(OD)以及起始和目标总计,因此,当前在每个循环中,您只是应用了从原始矩阵派生的相同因子。尝试以下操作:

代码语言:javascript
复制
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

您还可以考虑将最大迭代次数添加到计算中,因为不能保证速度收敛,特别是在矩阵稀疏的情况下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57903289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档