14 #ifndef MLPACK_METHODS_CF_DECOMPOSITION_POLICIES_SVDPLUSPLUS_METHOD_HPP
15 #define MLPACK_METHODS_CF_DECOMPOSITION_POLICIES_SVDPLUSPLUS_METHOD_HPP
52 const double alpha = 0.001,
53 const double lambda = 0.1) :
54 maxIterations(maxIterations),
73 void Apply(
const arma::mat& data,
76 const size_t maxIterations,
83 arma::mat implicitDenseData = data.submat(0, 0, 1, data.n_cols - 1);
84 svdpp.
CleanData(implicitDenseData, implicitData, data);
87 svdpp.
Apply(data, implicitDenseData, rank, w, h, p, q, y);
96 double GetRating(
const size_t user,
const size_t item)
const
100 arma::vec userVec(h.n_rows, arma::fill::zeros);
101 arma::sp_mat::const_iterator it = implicitData.begin_col(user);
102 arma::sp_mat::const_iterator it_end = implicitData.end_col(user);
103 size_t implicitCount = 0;
104 for (; it != it_end; ++it)
106 userVec += y.col(it.row());
109 if (implicitCount != 0)
110 userVec /= std::sqrt(implicitCount);
111 userVec += h.col(user);
114 arma::as_scalar(w.row(item) * userVec) + p(item) + q(user);
128 arma::vec userVec(h.n_rows, arma::fill::zeros);
129 arma::sp_mat::const_iterator it = implicitData.begin_col(user);
130 arma::sp_mat::const_iterator it_end = implicitData.end_col(user);
131 size_t implicitCount = 0;
132 for (; it != it_end; ++it)
134 userVec += y.col(it.row());
137 if (implicitCount != 0)
138 userVec /= std::sqrt(implicitCount);
139 userVec += h.col(user);
141 rating = w * userVec + p + q(user);
156 template<
typename NeighborSearchPolicy>
158 const size_t numUsersForSimilarity,
159 arma::Mat<size_t>& neighborhood,
160 arma::mat& similarities)
const
164 arma::mat query(h.n_rows, users.n_elem);
166 for (
size_t i = 0; i < users.n_elem; ++i)
167 query.col(i) = h.col(users(i));
169 NeighborSearchPolicy neighborSearch(h);
170 neighborSearch.Search(
171 query, numUsersForSimilarity, neighborhood, similarities);
175 const arma::mat&
W()
const {
return w; }
177 const arma::mat&
H()
const {
return h; }
179 const arma::vec&
Q()
const {
return q; }
181 const arma::vec&
P()
const {
return p; }
183 const arma::mat&
Y()
const {
return y; }
193 double Alpha()
const {
return alpha; }
205 template<
typename Archive>
208 ar & BOOST_SERIALIZATION_NVP(maxIterations);
209 ar & BOOST_SERIALIZATION_NVP(alpha);
210 ar & BOOST_SERIALIZATION_NVP(lambda);
211 ar & BOOST_SERIALIZATION_NVP(w);
212 ar & BOOST_SERIALIZATION_NVP(h);
213 ar & BOOST_SERIALIZATION_NVP(p);
214 ar & BOOST_SERIALIZATION_NVP(q);
215 ar & BOOST_SERIALIZATION_NVP(y);
216 ar & BOOST_SERIALIZATION_NVP(implicitData);
221 size_t maxIterations;
237 arma::sp_mat implicitData;