Ejemplo n.º 1
0
shared_ptr<mat> filtering(const mat& mrating, mpq& msim){
    cout<<"collaborative filtering..."<<endl;

    shared_ptr<mat> pm_predict(new mat(mrating));
    mat& m_predict = *pm_predict;


    int max_row_index = base ? nitem : nuser;

    for(mpq_i i=msim.begin(); i!=msim.end(); ++i){

        cout<<(i->first+1) * 100 / max_row_index<<"%\r"; cout.flush();

        // get current row
        row ri(m_predict, i->first);
        pq& q = i->second;

        // pop all sim rows
        for(;!q.empty(); q.pop()){

            int index = q.top().first;
            double sim   = q.top().second;

            crow rj(mrating, index);

            switch(sim_summing){
            case 0:
                ri += rj * sim;
                break;
            case 1:
                for(crow::const_iterator j=rj.begin(); j!=rj.end(); ++j){

                    int col = j.index();

                    double v = 1 - ( 1 - ri(col) ) * ( 1 - *j * sim );
                    if(v)   ri(col) = v;
                }
                break;
            default:
                break;
            }
        }
    }
    cout<<endl;

    if(vm.count("verbose")) cout<<"prediction matrix:\n"<<m_predict<<endl;
    
    return pm_predict;
}