{"id":368,"date":"2017-04-24T01:45:06","date_gmt":"2017-04-23T17:45:06","guid":{"rendered":"http:\/\/vinta.ws\/code\/?p=368"},"modified":"2026-02-18T01:20:36","modified_gmt":"2026-02-17T17:20:36","slug":"recommender-system-matrix-factorization","status":"publish","type":"post","link":"https:\/\/vinta.ws\/code\/recommender-system-matrix-factorization.html","title":{"rendered":"Recommender System: Matrix Factorization"},"content":{"rendered":"<h2>Singular Value Decomposition (SVD) \u5947\u7570\u503c\u5206\u89e3<\/h2>\n<pre class=\"line-numbers\"><code class=\"language-txt\">        item_a  item_b  item_c\nuser_1  2       -       -\nuser_2  -       1       -\nuser_3  3       3       -\nuser_4  -       2       2<\/code><\/pre>\n<p>\u5c0d m x n \u7684\u8a55\u5206\u77e9\u9663\u505a\u77e9\u9663\u5206\u89e3\uff0c\u77e9\u9663\u5206\u89e3\u5e38\u7528\u7684\u65b9\u6cd5\u4e4b\u4e00\u662f SVD \u5947\u7570\u503c\u5206\u89e3\uff0c\u628a\u8a55\u5206\u77e9\u9663\u5206\u89e3\u6210\u4e09\u500b\u77e9\u9663 U S V*\u3002<\/p>\n<p>SVD \u5728\u63a8\u8350\u7cfb\u7edf\u4e2d\u7684\u5e94\u7528<br \/>\n<a href=\"http:\/\/yanyiwu.com\/work\/2012\/09\/10\/SVD-application-in-recsys.html\">http:\/\/yanyiwu.com\/work\/2012\/09\/10\/SVD-application-in-recsys.html<\/a><\/p>\n<p>\u5947\u5f02\u503c\u5206\u89e3 (SVD) \u539f\u7406\u4e0e\u5728\u964d\u7ef4\u4e2d\u7684\u5e94\u7528<br \/>\n<a href=\"http:\/\/www.cnblogs.com\/pinard\/p\/6251584.html\">http:\/\/www.cnblogs.com\/pinard\/p\/6251584.html<\/a><\/p>\n<h2>Alternating Least Squares (ALS) \u4ea4\u66ff\u6700\u5c0f\u4e8c\u4e58\u6cd5<\/h2>\n<p>\u56e0\u70ba SVD \u8981\u6c42\u77e9\u9663\u662f\u7a20\u5bc6\u7684\uff0c\u63a8\u85a6\u7cfb\u7d71\u4e2d\u7684\u8a55\u5206\u77e9\u9663\u901a\u5e38\u662f\u4e00\u500b\u5f88\u5927\u7684\u7a00\u758f\u77e9\u9663\uff0c\u6240\u4ee5\u5be6\u52d9\u4e0a\u90fd\u6703\u4f7f\u7528 SVD \u7684\u8b8a\u7a2e\uff1aFunk-SVD\uff0cFunk-SVD \u4e5f\u7a31\u70ba Latent Factor Model (LFM) \u96b1\u8a9e\u610f\u6a21\u578b\uff1a\u628a m x n \u7684\u8a55\u5206\u77e9\u9663 R \u5206\u89e3\u6210 U I \u5169\u500b\u77e9\u9663\uff0c\u5206\u5225\u662f m x k \u7684 users \u77e9\u9663\u548c k x n \u7684 items \u77e9\u9663\uff0c\u5404\u81ea\u90fd\u6709 k \u7dad\u7684\u7279\u5fb5\uff0c\u8a08\u7b97\u6642\u53ea\u8003\u616e\u8a55\u5206\u4e0d\u70ba 0 \u7684\u9805\u76ee\u3002<\/p>\n<p>ALS \u5c31\u662f\u6c42\u51fa U I \u77e9\u9663\u7684\u4e00\u7a2e\u6c42\u89e3\u65b9\u6cd5\u3002\u5176\u4ed6\u7684\u65b9\u5f0f\u9084\u6709 Stochastic Gradient Descent (SGD)\u3002<\/p>\n<p>ALS \u5728 Spark MLlib \u4e2d\u7684\u5b9e\u73b0<br \/>\n<a href=\"http:\/\/www.csdn.net\/article\/2015-05-07\/2824641\">http:\/\/www.csdn.net\/article\/2015-05-07\/2824641<\/a><\/p>\n<p>\u77e9\u9635\u5206\u89e3\u5728\u534f\u540c\u8fc7\u6ee4\u63a8\u8350\u7b97\u6cd5\u4e2d\u7684\u5e94\u7528<br \/>\n<a href=\"http:\/\/www.cnblogs.com\/pinard\/p\/6351319.html\">http:\/\/www.cnblogs.com\/pinard\/p\/6351319.html<\/a><\/p>\n<p>\u57fa\u4e8e\u77e9\u9635\u5206\u89e3\u7684\u9690\u56e0\u5b50\u6a21\u578b<br \/>\n<a href=\"http:\/\/www.voidcn.com\/blog\/winone361\/article\/p-5031282.html\">http:\/\/www.voidcn.com\/blog\/winone361\/article\/p-5031282.html<\/a><\/p>\n<h2>ALS for implicit feedbacks<\/h2>\n<p>\u9019\u7a2e\u6a21\u578b\u4e5f\u7a31\u70ba Weighted Regularized Matrix Factorization (WRMF)\u3002<\/p>\n<pre class=\"line-numbers\"><code class=\"language-txt\">        item_a  item_b  item_c\nuser_1  1       -       -\nuser_2  -       1       -\nuser_3  1       1       -\nuser_4  -       1       1<\/code><\/pre>\n<p>\u7b26\u865f\u8aaa\u660e\uff1a<\/p>\n<ul>\n<li>Rui = User u's interaction on Item i<\/li>\n<li>Xu = User u's vector<\/li>\n<li>Yi = Item i's vector<\/li>\n<li>Pui = 1 if Rui &gt; 0 else 0<\/li>\n<li>Cui = 1 + alpha x Rui<\/li>\n<\/ul>\n<p>\u53c3\u6578\u8aaa\u660e\uff1a<\/p>\n<ul>\n<li>iteration \u8fed\u4ee3\u6b21\u6578<\/li>\n<li>rank \u96b1\u542b\u7279\u5fb5\u6578<\/li>\n<li>lambda \u6b63\u5247\u5316\u53c3\u6578<\/li>\n<li>alpha \u7f6e\u4fe1\u5ea6\u6b0a\u91cd<\/li>\n<\/ul>\n<p>\u8ddf Explicit ALS \u4e00\u6a23\uff0c\u628a m x n \u7684\u96b1\u5f0f\u53cd\u994b\u77e9\u9663 R \u5206\u89e3\u6210 X Y \u5169\u500b\u77e9\u9663\uff0c\u5206\u5225\u662f m x k \u7684 user latent factors \u77e9\u9663\u548c k x n \u7684 item latent factors \u77e9\u9663\u3002\u4e0d\u540c\u7684\u662f\uff0c\u9084\u984d\u5916\u5f15\u5165\u4e86\u5169\u500b\u77e9\u9663\uff1am x n \u7684 P \u77e9\u9663\uff0cbinary preference\uff0cPui \u8868\u793a\u7528\u6236\u662f\u4e0d\u662f\u5c0d\u8a72\u7269\u54c1\u611f\u8208\u8da3\uff1bm x n \u7684 C \u77e9\u9663\uff0cconfidence \u7f6e\u4fe1\u5ea6\uff08\u6216\u8005\u60f3\u6210\u662f strength \u5f37\u5ea6\uff09\uff0cCui \u8868\u793a\u6709\u591a\u78ba\u5b9a\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u611f\u8208\u8da3\u3002\u6574\u500b\u6f14\u7b97\u6cd5\u7684\u76ee\u6a19\u4ecd\u820a\u662f\u8a08\u7b97\u51fa users \u548c items \u77e9\u9663\uff0c\u8ddf Explicit ALS \u7684\u5dee\u5225\u5728\u65bc loss function \u591a\u52a0\u5165\u4e86 Cui \u548c Pui\uff0c\u800c\u4e14\u6703\u8003\u616e\u6240\u6709\u7684 user-item pair\uff0c\u5305\u542b missing value \/ non-observed value\uff08Rui = 0\uff09\u3002<\/p>\n<p>\u53ea\u8981\u7528\u6236\u5c0d\u7269\u54c1\u6709\u904e\u884c\u70ba\uff08Rui &gt; 0\uff09\uff0c\u6211\u5011\u5c31\u5047\u8a2d\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6709\u504f\u597d\uff08Pui = 1\uff09\uff0c\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u7684\u884c\u70ba\u8d8a\u591a\uff08Rui \u8d8a\u5927\uff09\uff0cCui \u5c31\u6703\u8d8a\u5927\uff0c\u8868\u793a\u7f6e\u4fe1\u5ea6\u8d8a\u9ad8\uff0c\u5047\u8a2d\u8d8a\u53ef\u4fe1\uff1b\u5982\u679c\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6c92\u6709\u884c\u70ba\uff08Rui = 0\uff09\uff0c\u5c31\u5047\u8a2d\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6c92\u6709\u504f\u597d\uff08Pui = 0\uff09\uff0c\u4f46\u662f\u56e0\u70ba Cui = 1 + alpha x 0\uff0c\u6240\u4ee5\u9019\u500b\u5047\u8a2d\u76f8\u5c0d\u4f86\u8aaa\u7f6e\u4fe1\u5ea6\u8f03\u4f4e\uff0c\u6bd4\u8f03\u4e0d\u53ef\u4fe1\u3002<\/p>\n<p>Explicit ALS \u662f\u8981\u9810\u6e2c\u7528\u6236\u5c0d\u67d0\u500b\u7269\u54c1\u7684\u8a55\u5206\uff1bImplicit ALS \u5247\u662f\u8981\u9810\u6e2c\u7528\u6236\u6703\u4e0d\u6703\u5c0d\u67d0\u500b\u7269\u54c1\u611f\u8208\u8da3\uff1aPui = Xu x Yi.T\uff0c\u4e5f\u5c31\u662f\u8aaa Implicit ALS \u8f38\u51fa\u7684 prediction \u5176\u5be6\u662f\u7528 X x Y.T \u6240\u91cd\u5efa\u51fa\u4f86\u7684 P \u77e9\u9663\u3002\u9019\u4e9b prediction \u7684\u503c\u57fa\u672c\u4e0a\u6703\u843d\u5728 [0, 1] \u4e4b\u9593\uff0c\u4f46\u662f\u4e5f\u53ef\u80fd\u5927\u65bc 1 \u6216\u662f\u5c0f\u65bc 0\uff0c\u503c\u8d8a\u5927\u8868\u793a\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6709\u8d8a\u5f37\u70c8\u7684\u504f\u597d\uff0c\u8d8a\u5c0f\u5247\u53cd\u4e4b\u3002<\/p>\n<p>\u56e0\u70ba ALS \u5c6c\u65bc collaborative filtering\uff0c\u6240\u4ee5\u4e5f\u6709 cold start \u7684\u554f\u984c\uff0c\u7121\u6cd5\u5c0d\u65b0\u7528\u6236\u548c\u65b0\u7269\u54c1\u505a\u51fa\u63a8\u85a6\u3002\u9664\u6b64\u4e4b\u5916\uff0cALS \u7684\u7f3a\u9ede\u662f\u7f3a\u4e4f\u89e3\u91cb\u6027\u800c\u4e14\u96e3\u4ee5\u52a0\u5165 side information\uff08user \u548c item \u672c\u8eab\u7684 features\uff0c\u4f8b\u5982\u6027\u5225\u3001\u66f2\u98a8\u3001\u985e\u578b\u4e4b\u985e\u7684\uff09\u3002\u4e0d\u904e\u56e0\u70ba matrix factorization \u5176\u5be6\u96b1\u542b\u4e86 clustering \u7684\u529f\u80fd\uff0c\u76f8\u5c0d\u65bc\u5176\u4ed6\u65b9\u5f0f\u4f86\u8aaa\uff0c\u5177\u6709\u6297\u96dc\u8a0a\u7684\u80fd\u529b\u3002<\/p>\n<p>Collaborative Filtering for Implicit Feedback Datasets<br \/>\n<a href=\"http:\/\/yifanhu.net\/PUB\/cf.pdf\">http:\/\/yifanhu.net\/PUB\/cf.pdf<\/a><\/p>\n<p>A Gentle Introduction to Recommender Systems with Implicit Feedback<br \/>\n<a href=\"https:\/\/jessesw.com\/Rec-System\/\">https:\/\/jessesw.com\/Rec-System\/<\/a><\/p>\n<p>Intro to Implicit Matrix Factorization: Classic ALS<br \/>\n<a href=\"http:\/\/blog.ethanrosenthal.com\/2016\/10\/19\/implicit-mf-part-1\/\">http:\/\/blog.ethanrosenthal.com\/2016\/10\/19\/implicit-mf-part-1\/<\/a><\/p>\n<p>Spark ML \u7b97\u6cd5\u539f\u7406\u5256\u6790<br \/>\n<a href=\"https:\/\/github.com\/endymecy\/spark-ml-source-analysis\">https:\/\/github.com\/endymecy\/spark-ml-source-analysis<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u53ea\u8981\u7528\u6236\u5c0d\u7269\u54c1\u6709\u904e\u884c\u70ba\uff08Rui > 0\uff09\uff0c\u6211\u5011\u5c31\u5047\u8a2d\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6709\u504f\u597d\uff08Pui = 1\uff09\uff0c\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u7684\u884c\u70ba\u8d8a\u591a\uff08Rui \u8d8a\u5927\uff09\uff0cCui \u5c31\u6703\u8d8a\u5927\uff0c\u8868\u793a\u7f6e\u4fe1\u5ea6\u8d8a\u9ad8\uff0c\u5047\u8a2d\u8d8a\u53ef\u4fe1\uff1b\u5982\u679c\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6c92\u6709\u884c\u70ba\uff08Rui = 0\uff09\uff0c\u5c31\u5047\u8a2d\u7528\u6236\u5c0d\u8a72\u7269\u54c1\u6c92\u6709\u504f\u597d\uff08Pui = 0\uff09\uff0c\u4f46\u662f\u56e0\u70ba Cui = 1 + alpha x 0\uff0c\u6240\u4ee5\u9019\u500b\u5047\u8a2d\u76f8\u5c0d\u4f86\u8aaa\u7f6e\u4fe1\u5ea6\u8f03\u4f4e\uff0c\u6bd4\u8f03\u4e0d\u53ef\u4fe1\u3002<\/p>\n","protected":false},"author":1,"featured_media":369,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[98,104],"class_list":["post-368","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-about-ai","tag-machine-learning","tag-recommender-system"],"_links":{"self":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":0,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media\/369"}],"wp:attachment":[{"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vinta.ws\/code\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}