mlpack 3.4.2
svd_incomplete_method.hpp
Go to the documentation of this file.
1
14#ifndef MLPACK_METHODS_CF_DECOMPOSITION_POLICIES_SVD_INCOMPLETE_METHOD_HPP
15#define MLPACK_METHODS_CF_DECOMPOSITION_POLICIES_SVD_INCOMPLETE_METHOD_HPP
16
17#include <mlpack/prereqs.hpp>
22
23namespace mlpack {
24namespace cf {
25
45{
46 public:
59 template<typename MatType>
60 void Apply(const MatType& /* data */,
61 const arma::sp_mat& cleanedData,
62 const size_t rank,
63 const size_t maxIterations,
64 const double minResidue,
65 const bool mit)
66 {
67 if (mit)
68 {
69 amf::MaxIterationTermination iter(maxIterations);
70
71 // Do singular value decomposition using incomplete incremental method.
74
75 svdici.Apply(cleanedData, rank, w, h);
76 }
77 else
78 {
79 amf::SimpleResidueTermination srt(minResidue, maxIterations);
80
81 // Do singular value decomposition using incomplete incremental method
82 // using cleaned data in form of sparse matrix.
84
85 svdici.Apply(cleanedData, rank, w, h);
86 }
87 }
88
95 double GetRating(const size_t user, const size_t item) const
96 {
97 double rating = arma::as_scalar(w.row(item) * h.col(user));
98 return rating;
99 }
100
107 void GetRatingOfUser(const size_t user, arma::vec& rating) const
108 {
109 rating = w * h.col(user);
110 }
111
124 template<typename NeighborSearchPolicy>
125 void GetNeighborhood(const arma::Col<size_t>& users,
126 const size_t numUsersForSimilarity,
127 arma::Mat<size_t>& neighborhood,
128 arma::mat& similarities) const
129 {
130 // We want to avoid calculating the full rating matrix, so we will do
131 // nearest neighbor search only on the H matrix, using the observation that
132 // if the rating matrix X = W*H, then d(X.col(i), X.col(j)) = d(W H.col(i),
133 // W H.col(j)). This can be seen as nearest neighbor search on the H
134 // matrix with the Mahalanobis distance where M^{-1} = W^T W. So, we'll
135 // decompose M^{-1} = L L^T (the Cholesky decomposition), and then multiply
136 // H by L^T. Then we can perform nearest neighbor search.
137 arma::mat l = arma::chol(w.t() * w);
138 arma::mat stretchedH = l * h; // Due to the Armadillo API, l is L^T.
139
140 // Temporarily store feature vector of queried users.
141 arma::mat query(stretchedH.n_rows, users.n_elem);
142 // Select feature vectors of queried users.
143 for (size_t i = 0; i < users.n_elem; ++i)
144 query.col(i) = stretchedH.col(users(i));
145
146 NeighborSearchPolicy neighborSearch(stretchedH);
147 neighborSearch.Search(
148 query, numUsersForSimilarity, neighborhood, similarities);
149 }
150
152 const arma::mat& W() const { return w; }
154 const arma::mat& H() const { return h; }
155
159 template<typename Archive>
160 void serialize(Archive& ar, const unsigned int /* version */)
161 {
162 ar & BOOST_SERIALIZATION_NVP(w);
163 ar & BOOST_SERIALIZATION_NVP(h);
164 }
165
166 private:
168 arma::mat w;
170 arma::mat h;
171};
172
173} // namespace cf
174} // namespace mlpack
175
176#endif
This class implements AMF (alternating matrix factorization) on the given matrix V.
Definition: amf.hpp:79
double Apply(const MatType &V, const size_t r, arma::mat &W, arma::mat &H)
Apply Alternating Matrix Factorization to the provided matrix.
This termination policy only terminates when the maximum number of iterations has been reached.
This initialization rule for AMF simply fills the W and H matrices with uniform random noise in [0,...
Definition: random_init.hpp:26
This class computes SVD using incomplete incremental batch learning, as described in the following pa...
This class implements a simple residue-based termination policy.
Implementation of the SVD incomplete incremental to act as a wrapper when accessing SVD incomplete in...
double GetRating(const size_t user, const size_t item) const
Return predicted rating given user ID and item ID.
void GetNeighborhood(const arma::Col< size_t > &users, const size_t numUsersForSimilarity, arma::Mat< size_t > &neighborhood, arma::mat &similarities) const
Get the neighborhood and corresponding similarities for a set of users.
void Apply(const MatType &, const arma::sp_mat &cleanedData, const size_t rank, const size_t maxIterations, const double minResidue, const bool mit)
Apply Collaborative Filtering to the provided data set using the SVD incomplete incremental method.
const arma::mat & W() const
Get the Item Matrix.
const arma::mat & H() const
Get the User Matrix.
void GetRatingOfUser(const size_t user, arma::vec &rating) const
Get predicted ratings for a user.
void serialize(Archive &ar, const unsigned int)
Serialization.
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
The core includes that mlpack expects; standard C++ includes and Armadillo.