首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python vs. C++。差异结果

Python vs. C++。差异结果
EN

Stack Overflow用户
提问于 2011-12-28 19:12:28
回答 1查看 516关注 0票数 0

我有一个来自http://www.albertauyeung.com/mf.php的python代码,但我不知道任何关于Python编程来改进和更改这段代码的知识。无论如何,我开始用Qt用C++重新编写它,但我的结果是如此不同。Python代码:

代码语言:javascript
运行
复制
import numpy

def matrix_factorisation(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02):
Q = Q.T
for step in xrange(steps):
    for i in xrange(len(R)):
        for j in xrange(len(R[i])):
            if R[i][j] > 0:
                eij = R[i][j] - numpy.dot(P[i,:],Q[:,j])
                for k in xrange(K):
                    P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k])
                    Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j])
    eR = numpy.dot(P,Q)
    e = 0
    for i in xrange(len(R)):
        for j in xrange(len(R[i])):
            if R[i][j] > 0:
                e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2)
                for k in xrange(K):
                    e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2))
    if e < 0.001:
        break
return P, Q.T

if __name__ == "__main__":
R = [
 [5,3,0,1],
 [4,0,0,1],
 [1,1,0,5],
 [1,0,0,4],
 [0,1,5,4],
]

R = numpy.array(R)

N = len(R)
M = len(R[0])
K = 2

P = numpy.random.rand(N,K)
Q = numpy.random.rand(M,K)

nP, nQ = matrix_factorisation(R, P, Q, K)
nR = numpy.dot(nP, nQ.T)

=================================================================================和C++代码:

代码语言:javascript
运行
复制
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

//=============preliminary=================
long double R[5][4]={5,3,0,1,
                4,0,0,1,
                1,1,0,5,
                1,0,0,4,
                0,1,5,4},newR[5][4]={0};
int n=5, m=4,k=2;
long double Q[2][4],P[5][2];

for (int i=0;i<k;i++){
    for (int j=0;j<n;j++){
        P[j][i]=random2(0,1);
    }
    for(int l=0;l<m;l++){
        Q[i][l]=random2(0,1);
    }
}



//  =============  MatrixFactorization(R,P,Q,k)=======================
long double eij=0,sigmaPQ=0;
long double e;
long double alpha=0.0002, beta=0.02;
int t;
for(long  step=0;step <5000;step++){
    t=step;
    for (int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(R[i][j]>0){
                sigmaPQ=0;
                for (int z=0;z<k;z++){
                    sigmaPQ += P[i][z]*Q[z][j];
                }
                eij=R[i][j]-sigmaPQ;

                for (int z=0;z<k;z++){
                    P[i][z] += alpha*(2*eij*Q[z][j]-beta*P[i][z]);
                    Q[z][j] += alpha*(2*eij*P[i][z]-beta*Q[z][j]);
                }
            }
        }
    }
    e=0;
    for (int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(R[i][j]>0){
                sigmaPQ=0;
                for (int z=0;z<k;z++){
                    sigmaPQ += P[i][z]*Q[z][j];
                }                   
                for (int z=0;z<k;z++){
                    e+=(beta/2)*(qPow( P[i][z],2)+qPow(Q[z][j],2));                        
                }
                e=qSqrt(e);
            }                
        }
    }       
    if(e<0.001)
        break;

}    
//=========== calculate approximate R =============
long double temp;
for (int i=0;i<n;i++){
    for(int j=0;j<m;j++){
        temp=0;
        for(int z=0;z<k;z++){
            temp+=P[i][z]*Q[z][j];
        }
        newR[i][j]=temp;
    }
}
}

Python代码是正确的答案。我应该怎么做,来修复这个C++代码?

EN

回答 1

Stack Overflow用户

发布于 2012-01-06 11:00:45

将其分解为多个步骤,并检查每个步骤的输出。print和printf是你的朋友。:)或者学习足够的Python语言来创建一个可以翻译成C++的伪代码版本。

在调试大型代码段时,我经常只监控流程中每个逻辑步骤的数据。Python通过在关键位置插入print语句简化了这一过程。

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

https://stackoverflow.com/questions/8655161

复制
相关文章

相似问题

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