@mhg/blog
Version:
1 lines • 254 kB
HTML
<!DOCTYPE html><html lang="zh-CN"><head hexo-theme="https://github.com/volantis-x/hexo-theme-volantis/#6.0.0-alpha.0"><meta name="generator" content="Hexo 6.3.0"><meta name="Volantis" content="6.0.0-alpha.0"><meta charset="utf-8"><link rel="canonical" href="https://blog.mhuig.top/notes/spark/als.html"><meta http-equiv="x-dns-prefetch-control" content="on"><link rel="dns-prefetch" href="https://static.mhuig.top"><link rel="preconnect" href="https://static.mhuig.top" crossorigin><meta name="renderer" content="webkit"><meta name="force-rendering" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="HandheldFriendly" content="True"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=5"><meta content="black-translucent" name="apple-mobile-web-app-status-bar-style"><meta content="telephone=no" name="format-detection"><script>function registerServiceWorker(e){"localhost"!=window.location.hostname&&"serviceWorker"in navigator&&navigator.serviceWorker.register(`${e}`).then((function(e){"localhost"==window.location.hostname&&(e.onupdatefound=function(){var r=e.installing;r.onstatechange=function(){switch(r.state){case"installed":navigator.serviceWorker.controller?console.log("Updated Service Worker."):console.log("Service Worker Sucess!");break;case"redundant":console.log("The installing service worker became redundant.")}}})})).catch((function(e){console.error("Error during service worker registration:",e),"undefined"==typeof swinstallretry&&(swinstallretry=1,registerServiceWorker("/jquery.js?v=0258ff4f79"))}))}registerServiceWorker("/jquery.js?v=0258ff4f79")</script><link rel="apple-touch-icon" sizes="180x180" href="/lib/favicon/apple-touch-icon.png?v=e035908f18"><link rel="icon" type="image/png" sizes="32x32" href="/lib/favicon/favicon-32x32.png?v=b9d9ae54cc"><link rel="icon" type="image/png" sizes="192x192" href="/lib/favicon/android-chrome-192x192.png?v=8bf02188e3"><link rel="icon" type="image/png" sizes="144x144" href="/lib/favicon/android-chrome-144x144.png?v=5c8eadcbb7"><link rel="icon" type="image/png" sizes="16x16" href="/lib/favicon/favicon-16x16.png?v=f896f2f634"><link rel="manifest" href="/lib/favicon/site.webmanifest?v=f138de5899"><link rel="mask-icon" href="/lib/favicon/safari-pinned-tab.svg?v=87d61e51a5" color="#5bbad5"><meta name="apple-mobile-web-app-title" content="MHuiG's Blog"><meta name="application-name" content="MHuiG's Blog"><meta name="msapplication-TileColor" content="#87ceeb"><meta name="msapplication-TileImage" content="/lib/favicon/mstile-144x144.png"><meta name="theme-color" content="#87ceeb" media="(prefers-color-scheme: light)"><meta name="theme-color" content="#21232f" media="(prefers-color-scheme: dark)"><link href="/opensearch.xml?v=2f4fd4e7e0" rel="search" title="MHuiG's Blog" type="application/opensearchdescription+xml"><link rel="preload" href="/css/style.css?v=2d24f6fe3e" as="style"><link rel="preload" href="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous"><link rel="alternate" href="/atom.xml?v=fe8205151a" title="MHuiG" type="application/atom+xml"><link rel="alternate" href="/rss2.xml?v=6b8706d024" title="MHuiG" type="application/rss+xml"><title>Spark: 基于Audioscrobbler数据集的音乐推荐(pyspark) - MHuiG</title><meta name="keywords" content=",,,Blog, IT, BigData, MHuiG, @MHuiG, iMHuiG, 博客, 梦幻岛, Neverland, 技术博客"><meta desc name="description" content="基于Audioscrobbler数据集的音乐推荐(pyspark) 根据用户播放次数数据使用协同过滤算法完成音乐推荐。 - MHuiG - MHuiG"><meta property="og:type" content="website"><meta property="og:title" content="MHuiG"><meta property="og:url" content="https://blog.mhuig.top/notes/Spark/als"><meta property="og:site_name" content="MHuiG"><meta property="og:description" content="基于Audioscrobbler数据集的音乐推荐(pyspark) 根据用户播放次数数据使用协同过滤算法完成音乐推荐。"><meta property="og:locale" content="zh_CN"><meta property="og:image" content="https://blog.mhuig.top/lib/favicon/android-chrome-192x192.png"><meta property="article:published_time" content="2020-08-02T07:34:00.000Z"><meta property="article:modified_time" content="2022-05-10T02:09:00.000Z"><meta property="article:author" content="MHuiG"><meta property="article:tag" content="Spark"><meta property="article:tag" content="推荐系统"><meta property="article:tag" content="Data mining"><meta name="twitter:card" content="summary"><meta name="twitter:image" content="https://blog.mhuig.top/lib/favicon/android-chrome-192x192.png"><meta name="twitter:creator" content="@iMHuiG"><meta name="twitter:site" content="@iMHuiG"><style>#safearea{display:none}.post-story+.post-story{content-visibility:auto;contain-intrinsic-size:10px 500px}:root{--color-site-body:#87ceeb;--color-site-bg:#87ceeb;--color-site-inner:#555;--color-site-footer:#666;--color-card:#fff;--color-text:#444;--color-block:#f6f6f6;--color-inlinecode:#d56d28;--color-codeblock:#fff7ea;--color-h1:#3a3a3a;--color-h2:#3a3a3a;--color-h3:#333;--color-h4:#444;--color-h5:#555;--color-h6:#666;--color-p:#444;--color-list:#666;--color-list-hl:#1a78c2;--color-meta:#888;--color-read-bkg:#e0d8c8;--color-read-post:#f8f1e2;--color-copyright-bkg:#f5f5f5}*{box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;outline:0;margin:0;padding:0}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track-piece{background:0 0}::-webkit-scrollbar-thumb{background:#2196f3;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}::-webkit-scrollbar-thumb:hover{background:#ff5722}html{color:var(--color-text);width:100%;height:100%;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Menlo,Monaco,monospace,sans-serif;font-size:16px}html>::-webkit-scrollbar{height:4px;width:4px}html>::-webkit-scrollbar-track-piece{background:0 0}html>::-webkit-scrollbar-thumb{background:#2196f3;cursor:pointer;border-radius:2px;-webkit-border-radius:2px}html>::-webkit-scrollbar-thumb:hover{background:#ff5722}body{background-color:var(--color-site-body);text-rendering:optimizelegibility;-webkit-tap-highlight-color:transparent;line-height:1.6;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body.modal-active{overflow:hidden}@media screen and (max-width:680px){body.modal-active{position:fixed;top:0;right:0;bottom:0;left:0}}a{color:#2196f3;cursor:pointer;text-decoration:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}a:hover{color:#ff5722}a:active,a:hover{outline:0}ol,ul{padding-left:0}ol li,ul li{list-style:none}header{display:-webkit-box;display:-moz-box;display:block}img{border:0;background:0 0;max-width:100%}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;height:0;border:0;border-radius:1px;-webkit-border-radius:1px;border-bottom:1px solid rgba(68,68,68,.1)}button,input{color:inherit;font:inherit;margin:0}button{overflow:visible;text-transform:none;-webkit-appearance:button;cursor:pointer}@supports (backdrop-filter:blur(20px)){.blur{background:rgba(255,255,255,.9)!important;backdrop-filter:saturate(200%) blur(20px)}}.shadow{box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.shadow.floatable{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.shadow.floatable:hover{box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.1),0 4px 8px 0 rgba(0,0,0,.1),0 8px 16px 0 rgba(0,0,0,.1)}#l_cover{min-height:64px}.cover-wrapper{top:0;left:0;max-width:100%;height:100vh;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;align-self:center;align-content:center;color:var(--color-site-inner);padding:0 16px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;position:relative;overflow:hidden;margin-bottom:-100px}.cover-wrapper .cover-bg{position:absolute;width:100%;height:100%;background-position:center;background-size:cover;-webkit-background-size:cover;-moz-background-size:cover}.cover-wrapper .cover-bg.lazyload:not(.loaded){opacity:0;-webkit-opacity:0;-moz-opacity:0}.cover-wrapper .cover-bg.lazyload.loaded{animation-delay:0s;animation-duration:.5s;animation-fill-mode:forwards;animation-timing-function:ease-out;animation-name:fadeIn}@-moz-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-webkit-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-o-keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@keyframes fadeIn{0%{opacity:0;-webkit-opacity:0;-moz-opacity:0;filter:blur(12px);transform:scale(1.02);-webkit-transform:scale(1.02);-khtml-transform:scale(1.02);-moz-transform:scale(1.02);-o-transform:scale(1.02);-ms-transform:scale(1.02)}100%{opacity:1;-webkit-opacity:1;-moz-opacity:1}}.cover-wrapper .cover-body{z-index:1;position:relative;width:100%;height:100%}.cover-wrapper#full{height:calc(100vh + 100px);padding-bottom:100px}.cover-wrapper#half{max-height:640px;min-height:400px;height:calc(36vh - 64px + 200px)}.cover-wrapper #scroll-down{width:100%;height:64px;position:absolute;bottom:100px;text-align:center;cursor:pointer}.cover-wrapper #scroll-down .scroll-down-effects{color:#fff;font-size:24px;line-height:64px;position:absolute;width:24px;left:calc(50% - 12px);text-shadow:0 1px 2px rgba(0,0,0,.1);animation:scroll-down-effect 1.5s infinite;-webkit-animation:scroll-down-effect 1.5s infinite;-khtml-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite}@-moz-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-webkit-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@-o-keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}@keyframes scroll-down-effect{0%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}50%{top:-16px;opacity:.4;-webkit-opacity:0.4;-moz-opacity:0.4}100%{top:0;opacity:1;-webkit-opacity:1;-moz-opacity:1}}.cover-wrapper .cover-body{margin-top:64px;margin-bottom:100px}.cover-wrapper .cover-body,.cover-wrapper .cover-body .bottom,.cover-wrapper .cover-body .top{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;max-width:100%}.cover-wrapper .cover-body .bottom{margin-top:32px}.cover-wrapper .cover-body .title{font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Helvetica,monospace;font-size:3.125rem;line-height:1.2;text-shadow:0 1px 2px rgba(0,0,0,.1)}.cover-wrapper .cover-body .subtitle{font-size:20px}.cover-wrapper .cover-body .logo{max-height:120px;max-width:calc(100% - 4 * 16px)}@media screen and (min-height:1024px){.cover-wrapper .cover-body .title{font-size:3rem}.cover-wrapper .cover-body .subtitle{font-size:1.05rem}.cover-wrapper .cover-body .logo{max-height:150px}}.cover-wrapper .cover-body .m_search{position:relative;max-width:calc(100% - 16px);width:320px;vertical-align:middle}.cover-wrapper .cover-body .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:block;width:100%}.cover-wrapper .cover-body .m_search .icon,.cover-wrapper .cover-body .m_search .input{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.cover-wrapper .cover-body .m_search .icon{position:absolute;display:-webkit-box;display:-moz-box;display:block;line-height:2.5rem;width:32px;top:0;left:5px;color:rgba(68,68,68,.75)}.cover-wrapper .cover-body .m_search .input{display:-webkit-box;display:-moz-box;display:block;height:2.5rem;width:100%;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;font-size:.875rem;-webkit-appearance:none;padding-left:36px;border-radius:1.4rem;-webkit-border-radius:1.4rem;background:rgba(255,255,255,.6);backdrop-filter:blur(10px);border:none;color:var(--color-text)}@media screen and (max-width:500px){.cover-wrapper .cover-body .m_search .input{padding-left:36px}}.cover-wrapper .cover-body .m_search .input:hover{background:rgba(255,255,255,.8)}.cover-wrapper .cover-body .m_search .input:focus{background:#fff}.cover-wrapper .list-h{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;flex-wrap:wrap;-webkit-flex-wrap:wrap;-khtml-flex-wrap:wrap;-moz-flex-wrap:wrap;-o-flex-wrap:wrap;-ms-flex-wrap:wrap;align-items:stretch;border-radius:4px;-webkit-border-radius:4px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cover-wrapper .list-h a{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 0;-ms-flex:1 0;flex:1 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;font-weight:600}.cover-wrapper .list-h a img{display:-webkit-box;display:-moz-box;display:block;border-radius:2px;-webkit-border-radius:2px;margin:4px;min-width:40px;max-width:44px}@media screen and (max-width:768px){.cover-wrapper .list-h a img{min-width:36px;max-width:40px}}@media screen and (max-width:500px){.cover-wrapper .list-h a img{margin:2px 4px;min-width:32px;max-width:36px}}@media screen and (max-width:375px){.cover-wrapper .list-h a img{min-width:28px;max-width:32px}}.cover-wrapper{max-width:100%}.cover-wrapper.search .bottom .menu{margin-top:16px}.cover-wrapper.search .bottom .menu .list-h a{white-space:nowrap;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;align-items:baseline;padding:2px;margin:4px;color:var(--color-site-inner);opacity:.75;-webkit-opacity:0.75;-moz-opacity:0.75;text-shadow:0 1px 2px rgba(0,0,0,.05);border-bottom:2px solid transparent}.cover-wrapper.search .bottom .menu .list-h a i{margin-right:4px}.cover-wrapper.search .bottom .menu .list-h a p{font-size:.9375rem}.cover-wrapper.search .bottom .menu .list-h a.active,.cover-wrapper.search .bottom .menu .list-h a:active,.cover-wrapper.search .bottom .menu .list-h a:hover{opacity:1;-webkit-opacity:1;-moz-opacity:1;border-bottom:2px solid var(--color-site-inner)}.cover-wrapper.dock .menu,.cover-wrapper.featured .menu,.cover-wrapper.focus .menu{border-radius:6px;-webkit-border-radius:6px}.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;align-items:center;padding:12px;line-height:24px;border-radius:4px;-webkit-border-radius:4px;border-bottom:none;text-align:center;align-content:flex-end;color:rgba(68,68,68,.7);font-size:1.5rem}@media screen and (max-width:500px){.cover-wrapper.dock .menu .list-h a,.cover-wrapper.featured .menu .list-h a,.cover-wrapper.focus .menu .list-h a{padding:12px 8px}}.cover-wrapper.dock .menu .list-h a i,.cover-wrapper.featured .menu .list-h a i,.cover-wrapper.focus .menu .list-h a i{margin:8px}.cover-wrapper.dock .menu .list-h a p,.cover-wrapper.featured .menu .list-h a p,.cover-wrapper.focus .menu .list-h a p{font-size:.875rem}.cover-wrapper.dock .menu .list-h a.active,.cover-wrapper.featured .menu .list-h a.active,.cover-wrapper.focus .menu .list-h a.active{background:var(--color-card);backdrop-filter:none}.cover-wrapper.dock .menu .list-h a.active i,.cover-wrapper.dock .menu .list-h a.active i+p,.cover-wrapper.featured .menu .list-h a.active i,.cover-wrapper.featured .menu .list-h a.active i+p,.cover-wrapper.focus .menu .list-h a.active i,.cover-wrapper.focus .menu .list-h a.active i+p{color:#2196f3}.cover-wrapper.dock .menu .list-h a.active img+p,.cover-wrapper.featured .menu .list-h a.active img+p,.cover-wrapper.focus .menu .list-h a.active img+p{color:var(--color-text)}.cover-wrapper.dock .menu .list-h a:hover,.cover-wrapper.featured .menu .list-h a:hover,.cover-wrapper.focus .menu .list-h a:hover{background:var(--color-card)}.cover-wrapper.featured .menu .list-h{margin:-2px}.cover-wrapper.featured .menu .list-h a{margin:2px;background:rgba(255,255,255,.5)}@supports (backdrop-filter:blur(20px)){.cover-wrapper.featured .menu .list-h a{background:rgba(255,255,255,.5);backdrop-filter:saturate(200%) blur(20px)}}@media (prefers-color-scheme:dark){:root{--color-mode:'dark'}:root:not([color-scheme]){--color-site-body:#121212;--color-read-bkg:#21232f;--color-read-post:#252d38;--color-site-bg:#21232f;--color-site-inner:#efefef;--color-site-footer:#666;--color-card:#252d38;--color-text:rgba(238,238,238,0.871);--color-block:rgba(68,68,68,0.65);--color-codeblock:rgba(68,68,68,0.65);--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#4dabf5;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}:root:not([color-scheme]) img{filter:brightness(70%)!important}:root:not([color-scheme]) .blur{background:rgba(33,35,47,.9)!important}:root:not([color-scheme]) .white-box.blur{background:rgba(37,45,56,.9)!important}:root:not([color-scheme]) .nav-main .u-search-input{background:var(--color-card)!important}:root:not([color-scheme]) #l_main .article .prev-next>a{background:var(--color-block)!important}:root:not([color-scheme]) #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}:root:not([color-scheme]) .article blockquote{background:var(--color-block)!important}:root:not([color-scheme]) .article-title a{color:var(--color-h1)!important}:root:not([color-scheme]) details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}:root:not([color-scheme]) #u-search .modal,:root:not([color-scheme]) #u-search .modal-body,:root:not([color-scheme]) #u-search .modal-header{background:var(--color-card)!important}:root:not([color-scheme]) #u-search .modal-body .modal-results .result:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:hover{background:var(--color-block)!important}:root:not([color-scheme]) .u-search-input:focus{background:var(--color-site-body)!important}}[color-scheme=dark]{--color-site-body:#121212;--color-read-bkg:#21232f;--color-read-post:#252d38;--color-site-bg:#21232f;--color-site-inner:#efefef;--color-site-footer:#666;--color-card:#252d38;--color-text:rgba(238,238,238,0.871);--color-block:rgba(68,68,68,0.65);--color-codeblock:rgba(68,68,68,0.65);--color-inlinecode:#d56d28;--color-h1:rgba(255,255,255,0.871);--color-h2:rgba(255,255,255,0.871);--color-h3:rgba(255,255,255,0.6);--color-h4:rgba(255,255,255,0.6);--color-h5:rgba(255,255,255,0.6);--color-h6:rgba(255,255,255,0.6);--color-p:rgba(217,217,217,0.871);--color-list:rgba(217,217,217,0.871);--color-list-hl:#4dabf5;--color-meta:rgba(191,191,191,0.871);--color-link:rgba(191,191,191,0.871);--color-copyright-bkg:#21252b}[color-scheme=dark] img{filter:brightness(70%)!important}[color-scheme=dark] .blur{background:rgba(33,35,47,.9)!important}[color-scheme=dark] .white-box.blur{background:rgba(37,45,56,.9)!important}[color-scheme=dark] .nav-main .u-search-input{background:var(--color-card)!important}[color-scheme=dark] #l_main .article .prev-next>a{background:var(--color-block)!important}[color-scheme=dark] #l_main .article .prev-next>a:hover{background:var(--color-site-bg)!important}[color-scheme=dark] .article blockquote{background:var(--color-block)!important}[color-scheme=dark] .article-title a{color:var(--color-h1)!important}[color-scheme=dark] details>summary{color:var(--color-p)!important;background:var(--color-site-bg)!important}[color-scheme=dark] details{border:1px solid var(--color-site-bg)!important;background:var(--color-site-bg)!important}[color-scheme=dark] #u-search .modal,[color-scheme=dark] #u-search .modal-body,[color-scheme=dark] #u-search .modal-header{background:var(--color-card)!important}[color-scheme=dark] #u-search .modal-body .modal-results .result:hover{background:var(--color-block)!important}[color-scheme=dark] .u-search-input:hover{background:var(--color-block)!important}[color-scheme=dark] .u-search-input:focus{background:var(--color-site-body)!important}@media screen and (max-width:500px){[color-scheme=dark] .l_header .m_search{background:var(--color-site-bg)!important}}@font-face{font-family:'Varela Round';src:url("");font-weight:'normal';font-style:'normal';font-display:swap}@font-face{font-family:'Varela Round';src:url("https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/fonts/VarelaRound/VarelaRound-Regular.ttf");font-weight:'normal';font-style:'normal';font-display:swap}.l_header{position:fixed;z-index:1000;top:0;width:100%;height:64px;background:var(--color-card);box-shadow:0 1px 2px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.l_header.auto{transition:opacity .4s ease;-webkit-transition:opacity .4s ease;-khtml-transition:opacity 0.4s ease;-moz-transition:opacity .4s ease;-o-transition:opacity .4s ease;-ms-transition:opacity .4s ease;visibility:hidden}.l_header.auto.show{opacity:1!important;-webkit-opacity:1!important;-moz-opacity:1!important;visibility:visible}.l_header .container{margin-left:16px;margin-right:16px}.l_header #wrapper{height:100%;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.l_header #wrapper .nav-main,.l_header #wrapper .nav-sub{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-khtml-flex-wrap:nowrap;-moz-flex-wrap:nowrap;-o-flex-wrap:nowrap;-ms-flex-wrap:nowrap;justify-content:space-between;-webkit-justify-content:space-between;-khtml-justify-content:space-between;-moz-justify-content:space-between;-o-justify-content:space-between;-ms-justify-content:space-between;align-items:center}.l_header #wrapper .nav-main{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header #wrapper.sub .nav-main{transform:translateY(-64px);-webkit-transform:translateY(-64px);-khtml-transform:translateY(-64px);-moz-transform:translateY(-64px);-o-transform:translateY(-64px);-ms-transform:translateY(-64px)}.l_header #wrapper .nav-sub{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;opacity:0;-webkit-opacity:0;-moz-opacity:0;height:64px;width:calc(100% - 2 * 16px);position:absolute}.l_header #wrapper .nav-sub ::-webkit-scrollbar{display:-webkit-box;display:-moz-box;display:none}@media screen and (min-width:2048px){.l_header #wrapper .nav-sub{max-width:55vw;margin:auto}}.l_header #wrapper.sub .nav-sub{opacity:1;-webkit-opacity:1;-moz-opacity:1}.l_header #wrapper .title{position:relative;color:var(--color-text);padding-left:24px;max-height:64px}.l_header #wrapper .nav-main .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;line-height:64px;padding:0 24px;font-size:1.25rem;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Helvetica,monospace}.l_header #wrapper .nav-main .title img{height:64px}.l_header .nav-sub{max-width:1080px;margin:auto}.l_header .nav-sub .title{font-weight:700;font-family:"Varela Round","PingFang SC","Microsoft YaHei",Helvetica,Arial,Menlo,Monaco,monospace,sans-serif;line-height:1.2;max-height:64px;white-space:normal;flex-shrink:1}.l_header .switcher{display:-webkit-box;display:-moz-box;display:none;line-height:64px;align-items:center}.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:none}@media screen and (max-width:768px){.l_header .switcher .s-toc{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex}}.l_header .switcher>li{height:48px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;margin:2px}@media screen and (max-width:500px){.l_header .switcher>li{margin:0 1px;height:48px}}.l_header .switcher>li>a{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;align-items:center;width:48px;height:48px;padding:.85em 1.1em;border-radius:100px;-webkit-border-radius:100px;border:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;color:#2196f3}.l_header .switcher>li>a:hover{border:none}.l_header .switcher>li>a.active,.l_header .switcher>li>a:active{border:none;background:var(--color-site-bg)}@media screen and (max-width:500px){.l_header .switcher>li>a{width:36px;height:48px}}.l_header .nav-sub .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex}.l_header .m_search{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;height:64px;width:240px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (max-width:1024px){.l_header .m_search{width:44px;min-width:44px}.l_header .m_search input::placeholder{opacity:0;-webkit-opacity:0;-moz-opacity:0}.l_header .m_search:hover{width:240px}.l_header .m_search:hover input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media screen and (min-width:500px){.l_header .m_search:hover .input{width:100%}.l_header .m_search:hover .input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}@media screen and (max-width:500px){.l_header .m_search{min-width:0}.l_header .m_search input::placeholder{opacity:1;-webkit-opacity:1;-moz-opacity:1}}.l_header .m_search .form{position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;width:100%;align-items:center}.l_header .m_search .icon{position:absolute;width:36px;left:5px;color:var(--color-meta)}@media screen and (max-width:500px){.l_header .m_search .icon{display:-webkit-box;display:-moz-box;display:none}}.l_header .m_search .input{display:-webkit-box;display:-moz-box;display:block;padding-top:8px;padding-bottom:8px;line-height:1.3;width:100%;color:var(--color-text);background:#fafafa;box-shadow:none;-webkit-box-shadow:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;padding-left:40px;font-size:.875rem;border-radius:8px;-webkit-border-radius:8px;border:none;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}@media screen and (min-width:500px){.l_header .m_search .input:focus{box-shadow:0 4px 8px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.1)}}@media screen and (max-width:500px){.l_header .m_search .input{background:var(--color-block);padding-left:8px;border:none}.l_header .m_search .input:focus,.l_header .m_search .input:hover{border:none}}@media (max-width:500px){.l_header .m_search{left:0;width:0;overflow:hidden;position:absolute;background:#fff;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.l_header .m_search .input{border-radius:32px;-webkit-border-radius:32px;margin-left:16px;padding-left:16px}.l_header.z_search-open .m_search{width:100%}.l_header.z_search-open .m_search .input{width:calc(100% - 120px)}}ul.m-pc>li>a{color:inherit;border-bottom:2px solid transparent}ul.m-pc>li>a.active,ul.m-pc>li>a:active{border-bottom:2px solid #2196f3}ul.list-v li:hover>ul.list-v,ul.m-pc li:hover>ul.list-v{display:-webkit-box;display:-moz-box;display:block}ul.nav-list-h{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;align-items:stretch}ul.nav-list-h>li{position:relative;justify-content:center;-webkit-justify-content:center;-khtml-justify-content:center;-moz-justify-content:center;-o-justify-content:center;-ms-justify-content:center;height:100%;line-height:2.4;border-radius:4px;-webkit-border-radius:4px}ul.nav-list-h>li>a{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:600}ul.list-v{z-index:1;display:-webkit-box;display:-moz-box;display:none;position:absolute;background:var(--color-card);box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.08),0 4px 8px 0 rgba(0,0,0,.08),0 8px 16px 0 rgba(0,0,0,.08);margin-top:-6px;border-radius:4px;-webkit-border-radius:4px;padding:8px 0}ul.list-v.show{display:-webkit-box;display:-moz-box;display:block}ul.list-v hr{margin-top:8px;margin-bottom:8px}ul.list-v>li{white-space:nowrap;word-break:keep-all}ul.list-v>li.header{font-size:.78125rem;font-weight:700;line-height:2em;color:var(--color-meta);margin:8px 16px 4px}ul.list-v>li.header i{margin-right:8px}ul.list-v>li ul{margin-left:0;display:-webkit-box;display:-moz-box;display:none;margin-top:-40px}ul.list-v .aplayer-container{min-height:64px;padding:6px 16px}ul.list-v>li>a{transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease;display:-webkit-box;display:-moz-box;display:block;color:var(--color-list);font-size:.875rem;font-weight:700;line-height:36px;padding:0 20px 0 16px;text-overflow:ellipsis;margin:0 4px;border-radius:4px;-webkit-border-radius:4px}@media screen and (max-width:1024px){ul.list-v>li>a{line-height:40px}}ul.list-v>li>a>i{margin-right:8px}ul.list-v>li>a.active,ul.list-v>li>a:active{color:var(--color-list-hl)}ul.list-v>li>a:hover{color:var(--color-list-hl);background:var(--color-site-bg)}.l_header .menu>ul>li>a{display:-webkit-box;display:-moz-box;display:block;padding:0 8px}.l_header .menu>ul>li>a>i{margin-right:4px}.l_header ul.nav-list-h>li{color:var(--color-list);line-height:64px}.l_header ul.nav-list-h>li>a{max-height:64px;overflow:hidden;color:inherit}.l_header ul.nav-list-h>li>a.active,.l_header ul.nav-list-h>li>a:active{color:#2196f3}.l_header ul.nav-list-h>li:hover>a{color:var(--color-list-hl)}.l_header ul.nav-list-h>li i.music{animation:rotate-effect 1.5s linear infinite;-webkit-animation:rotate-effect 1.5s linear infinite;-khtml-animation:rotate-effect 1.5s linear infinite;-moz-animation:rotate-effect 1.5s linear infinite;-o-animation:rotate-effect 1.5s linear infinite;-ms-animation:rotate-effect 1.5s linear infinite}@-moz-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-webkit-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@-o-keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}@keyframes rotate-effect{0%{transform:rotate(0);-webkit-transform:rotate(0);-khtml-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0)}25%{transform:rotate(90deg);-webkit-transform:rotate(90deg);-khtml-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg)}50%{transform:rotate(180deg);-webkit-transform:rotate(180deg);-khtml-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg)}75%{transform:rotate(270deg);-webkit-transform:rotate(270deg);-khtml-transform:rotate(270deg);-moz-transform:rotate(270deg);-o-transform:rotate(270deg);-ms-transform:rotate(270deg)}100%{transform:rotate(360deg);-webkit-transform:rotate(360deg);-khtml-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg)}}.menu-phone li ul.list-v{right:calc(100% - .5 * 16px)}.menu-phone li ul.list-v ul{right:calc(100% - .5 * 16px)}#wrapper{max-width:1080px;margin:auto}@media screen and (min-width:2048px){#wrapper{max-width:55vw}}#wrapper .menu{-webkit-box-flex:1;-moz-box-flex:1;-webkit-flex:1 1;-ms-flex:1 1;flex:1 1;margin:0 16px 0 0}#wrapper .menu .list-v ul{left:calc(100% - .5 * 16px)}.menu-phone{display:-webkit-box;display:-moz-box;display:none;margin-top:16px;right:8px;transition:all .28s ease;-webkit-transition:all .28s ease;-khtml-transition:all 0.28s ease;-moz-transition:all .28s ease;-o-transition:all .28s ease;-ms-transition:all .28s ease}.menu-phone ul{right:calc(100% - .5 * 16px)}@media screen and (max-width:500px){.menu-phone{display:-webkit-box;display:-moz-box;display:block}}.l_header{max-width:65vw;left:calc((100% - 65vw) * .5);border-bottom-left-radius:8px;border-bottom-right-radius:8px}@media screen and (max-width:2048px){.l_header{max-width:1112px;left:calc((100% - 1112px) * .5)}}@media screen and (max-width:1112px){.l_header{left:0;border-radius:0;-webkit-border-radius:0;max-width:100%}}@media screen and (max-width:500px){.l_header .container{margin-left:0;margin-right:0}.l_header #wrapper .nav-main .title{padding-left:16px;padding-right:16px}.l_header #wrapper .nav-sub{width:100%}.l_header #wrapper .nav-sub .title{overflow-y:scroll;margin-top:2px;padding:8px 16px}.l_header #wrapper .switcher{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;display:flex;margin-right:8px}.l_header .menu{display:-webkit-box;display:-moz-box;display:none}}@media screen and (max-width:500px){.list-v li{max-width:270px}}#u-search{display:-webkit-box;display:-moz-box;display:none;position:fixed;top:0;left:0;width:100%;height:100%;padding:60px 20px;z-index:1001}@media screen and (max-width:680px){#u-search{padding:0}}@media screen and (prefers-color-scheme:dark) and (max-width:500px){.l_header .m_search{background:var(--color-site-bg)!important}}.cover-wrapper .cover-body .subtitle{font-size:.875rem}.fa-brands.color-github,.fa-duotone.color-github,.fa-light.color-github,.fa-regular.color-github,.fa-solid.color-github,.fa-thin.color-github,.fa.color-github,.fad.color-github,.fal.color-github,.far.color-github,.fas.color-github,.iziToast>.iziToast-body .iziToast-icon.color-github{color:#000}.fa-brands.color-friends,.fa-duotone.color-friends,.fa-light.color-friends,.fa-regular.color-friends,.fa-solid.color-friends,.fa-thin.color-friends,.fa.color-friends,.fad.color-friends,.fal.color-friends,.far.color-friends,.fas.color-friends,.iziToast>.iziToast-body .iziToast-icon.color-friends{color:#d31ee9}.fa-brands.color-about,.fa-duotone.color-about,.fa-light.color-about,.fa-regular.color-about,.fa-solid.color-about,.fa-thin.color-about,.fa.color-about,.fad.color-about,.fal.color-about,.far.color-about,.fas.color-about,.iziToast>.iziToast-body .iziToast-icon.color-about{color:#0095ff}.fa-brands.color-travellings,.fa-duotone.color-travellings,.fa-light.color-travellings,.fa-regular.color-travellings,.fa-solid.color-travellings,.fa-thin.color-travellings,.fa.color-travellings,.fad.color-travellings,.fal.color-travellings,.far.color-travellings,.fas.color-travellings,.iziToast>.iziToast-body .iziToast-icon.color-travellings{color:#734ae6}</style><link rel="stylesheet" href="/css/style.css?v=2d24f6fe3e" media="print" onload="this.media="all",this.onload=null"><noscript><link rel="stylesheet" href="/css/style.css?v=2d24f6fe3e"></noscript><script>let userColorScheme=localStorage.getItem("color-scheme");userColorScheme&&document.documentElement.setAttribute("color-scheme",userColorScheme)</script><script>window.MSInputMethodContext&&document.documentMode&&document.write('<style>html{overflow-x: hidden !important;overflow-y: hidden !important;}.kill-ie{text-align:center;height: 100%;margin-top: 15%;margin-bottom: 5500%;}.kill-t{font-size: 2rem;}.kill-c{font-size: 1.2rem;}#l_header,#l_body{display: none;}</style><div class="kill-ie"><span class="kill-t"><b>抱歉,您的浏览器无法访问本站</b></span><br/><span class="kill-c">微软已经于2016年终止了对 Internet Explorer (IE) 10 及更早版本的支持,<br/>继续使用存在极大的安全隐患,请使用当代主流的浏览器进行访问。</span><br/><a target="_blank" rel="noopener" href="https://blogs.windows.com/windowsexperience/2021/05/19/the-future-of-internet-explorer-on-windows-10-is-in-microsoft-edge/"><strong>了解详情 ></strong></a></div>')</script><noscript><style>html{overflow-x:hidden!important;overflow-y:hidden!important}.kill-noscript{text-align:center;height:100%;margin-top:15%;margin-bottom:5500%}.kill-t{font-size:2rem}.kill-c{font-size:1.2rem}#l_body,#l_header{display:none}</style><div class="kill-noscript"> <span class="kill-t"><b>抱歉,您的浏览器无法访问本站</b></span><br> <span class="kill-c">本页面需要浏览器支持(启用)JavaScript</span><br> <a target="_blank" rel="external nofollow noopener noreferrer" href="https://www.baidu.com/s?wd=启用JavaScript"><strong>了解详情 ></strong></a></div></noscript><script>function volantisEventListener(e,t,o){this.type=e,this.f=t,this.ele=o}function volantisDom(e){return e||(e=document.createElement("div")),this.ele=e,this.ele.find=e=>{let t=this.ele.querySelector(e);if(t)return new volantisDom(t)},this.ele.hasClass=e=>this.ele.className.match(new RegExp("(\\s|^)"+e+"(\\s|$)")),this.ele.addClass=e=>(this.ele.classList.add(e),this.ele),this.ele.removeClass=e=>(this.ele.classList.remove(e),this.ele),this.ele.toggleClass=e=>(this.ele.hasClass(e)?this.ele.removeClass(e):this.ele.addClass(e),this.ele),this.ele.on=(e,t,o=1)=>(this.ele.addEventListener(e,t,!1),o&&volantis.EventListener.list.push(new volantisEventListener(e,t,this.ele)),this.ele),this.ele.click=(e,t)=>(this.ele.on("click",e,t),this.ele),this.ele.scroll=(e,t)=>(this.ele.on("scroll",e,t),this.ele),this.ele.html=e=>(this.ele.innerHTML=e,this.ele),this.ele.hide=e=>(this.ele.style.display="none",this.ele),this.ele.show=e=>(this.ele.style.display="block",this.ele),this.ele}function RunItem(){function e(e,t){this.name=t||e.name,this.run=()=>{try{e()}catch(e){console.log(e)}}}this.list=[],this.start=()=>{for(var e=0;e<this.list.length;e++)this.list[e].run()},this.push=(t,o,n=!0)=>{let l=t;n&&(l=()=>{volantis.requestAnimationFrame(t)});var s=new e(l,o);this.list.push(s)},this.remove=e=>{for(let t=0;t<this.list.length;t++){this.list[t].name==e&&this.list.splice(t,1)}}}function errorImgAvatar(e){e.src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/avatar/round/3442075.svg",e.onerror=null}function errorImgCover(e){e.src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/cover/76b86c0226ffd.svg",e.onerror=null}window.volantis={},volantis.debug="false",volantis.dom={},volantis.EventListener={},volantis.EventListener.list=[],volantis.EventListener.remove=()=>{volantis.EventListener.list.forEach((function(e){e.ele.removeEventListener(e.type,e.f,!1)})),volantis.EventListener.list=[]},volantis.dom.$=e=>e?new volantisDom(e):null,volantis.pjax={},volantis.pjax.method={complete:new RunItem,error:new RunItem,send:new RunItem},volantis.pjax=Object.assign(volantis.pjax,{push:volantis.pjax.method.complete.push,error:volantis.pjax.method.error.push,send:volantis.pjax.method.send.push}),volantis.rightmenu={},volantis.rightmenu.method={handle:new RunItem},volantis.rightmenu=Object.assign(volantis.rightmenu,{handle:volantis.rightmenu.method.handle.push}),volantis.dark={},volantis.dark.method={toggle:new RunItem},volantis.dark=Object.assign(volantis.dark,{push:volantis.dark.method.toggle.push}),volantis.js=(e,t)=>new Promise((o=>{setTimeout((function(){var n=document.getElementsByTagName("head")[0]||document.documentElement,l=document.createElement("script");if(l.setAttribute("type","text/javascript"),t)if(JSON.stringify(t))for(let e in t)"onload"==e?l[e]=()=>{t[e](),o()}:(l[e]=t[e],l.onload=o);else l.onload=()=>{t(),o()};else l.onload=o;l.setAttribute("src",e),n.appendChild(l)}))})),volantis.css=e=>new Promise((t=>{setTimeout((function(){var o=document.createElement("link");o.rel="stylesheet",o.href=e,o.onload=t,document.getElementsByTagName("head")[0].appendChild(o)}))})),volantis.import={jQuery:()=>"undefined"==typeof jQuery?volantis.js("https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"):new Promise((e=>{e()}))},volantis.requestAnimationFrame=e=>{window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame),window.requestAnimationFrame(e)},volantis.layoutHelper=(e,t,o)=>{function n(e,t,o){volantis.tempDiv=document.createElement("div"),volantis.tempDiv.innerHTML=t;let n=document.querySelector("#layoutHelper-"+e);n&&(o&&(n.innerHTML=""),n.append(volantis.tempDiv))}o=Object.assign({clean:!1,pjax:!0},o),n(e,t,o.clean),o.pjax&&volantis.pjax.push((()=>{n(e,t,o.clean)}),"layoutHelper-"+e)},volantis.scroll={engine:new RunItem,unengine:new RunItem},volantis.scroll=Object.assign(volantis.scroll,{push:volantis.scroll.engine.push}),volantis.scroll.getScrollTop=()=>{let e;return window.pageYOffset?e=window.pageYOffset:document.compatMode&&"BackCompat"!=document.compatMode?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e},volantis.scroll.scrollHeight=function(){return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},volantis.scroll.offsetHeight=function(){return Math.max(document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},volantis.scroll.progress=function(){return volantis.scroll.getScrollTop()/(volantis.scroll.scrollHeight()-volantis.scroll.offsetHeight())},volantis.scroll.handleScrollEvents=()=>{volantis.scroll.lastScrollTop=volantis.scroll.getScrollTop(),volantis.requestAnimationFrame((function e(){const t=volantis.scroll.getScrollTop();volantis.scroll.lastScrollTop!==t?(volantis.scroll.del=t-volantis.scroll.lastScrollTop,volantis.scroll.lastScrollTop=t,volantis.scroll.unengine.list=[],volantis.scroll.engine.start()):volantis.scroll.unengine.start(),volantis.requestAnimationFrame(e)}))},volantis.scroll.handleScrollEvents(),volantis.scroll.ele=null,volantis.scroll.to=(e,t={})=>{e&&(volantis.scroll.ele=e,opt={top:e.getBoundingClientRect().top+document.documentElement.scrollTop,behavior:"smooth"},"top"in t&&(opt.top=t.top),"behavior"in t&&(opt.behavior=t.behavior),"addTop"in t&&(opt.top+=t.addTop),"observerDic"in t||(t.observerDic=100),window.scrollTo(opt),t.observer&&setTimeout((()=>{volantis.scroll.ele==e&&volantis.scroll.unengine.push((()=>{let o=e.getBoundingClientRect().top;o>=-t.observerDic&&o<=t.observerDic||volantis.scroll.to(e,t),volantis.scroll.unengine.remove("unengineObserver")}),"unengineObserver")}),1e3))},volantis.cleanContentVisibility=()=>{document.querySelector(".post-story")&&(console.log("cleanContentVisibility"),document.querySelectorAll(".post-story").forEach((e=>{e.classList.remove("post-story")})))}</script><script>volantis.GLOBAL_CONFIG={root:"/",debug:!1,default:{avatar:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/avatar/round/3442075.svg",link:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/link/8f277b4ee0ecd.svg",cover:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/cover/76b86c0226ffd.svg",image:"https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/media/placeholder/image/2659360.svg"},lastupdate:new Date(1739832285375),cdn:{izitoast_css:"https://cdn.bootcdn.net/ajax/libs/izitoast/1.4.0/css/iziToast.min.css",izitoast_js:"https://cdn.bootcdn.net/ajax/libs/izitoast/1.4.0/js/iziToast.min.js",fancybox_css:"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/4.0.31/fancybox.min.css",fancybox_js:"https://cdn.bootcdn.net/ajax/libs/fancyapps-ui/4.0.31/fancybox.umd.min.js"},sidebar:{for_page:["blogger","navigation","webinfo"],for_post:["toc"],webinfo:{lastupd:{enable:!1,friendlyShow:!0},runtime:{data:"2019/08/19",unit:"天"}}},plugins:{message:{enable:!1,icon:{default:"fa-solid fa-info-circle light-blue",quection:"fa-solid fa-question-circle light-blue"},time:{default:5e3,quection:2e4},position:"topRight",transitionIn:"bounceInLeft",transitionOut:"fadeOutRight",titleColor:"var(--color-text)",messageColor:"var(--color-text)",backgroundColor:"var(--color-card)",zindex:2147483647,copyright:{enable:!0,title:"知识共享许可协议",message:"请遵守 CC BY-NC-SA 4.0 协议。",icon:"far fa-copyright light-blue"},aplayer:{enable:!0,play:"fa-solid fa-play",pause:"fa-solid fa-pause"},rightmenu:{enable:!0,notice:!0}},aplayer:{id:1480000098,enable:!0}},search:{dataPath:("/".endsWith("/")?"/":"//")+"content.json"},languages:{search:{hits_empty:"找不到您查询的内容:${query}",hits_stats:"找到 ${hits} 条结果,用时 ${time} 毫秒"}}}</script></head><body itemscope itemtype="http://schema.org/WebPage"><header itemscope itemtype="http://schema.org/WPHeader" id="l_header" class="l_header auto shadow floatable blur show" style="opacity:0"><div class="container"><div id="wrapper"><div class="nav-sub"><p class="title"></p><ul class="switcher nav-list-h m-phone" id="pjax-header-nav-list"><li><a id="s-comment" class="fa-solid fa-comments fa-fw" target="_self" title="comment"></a></li><li><a id="s-toc" class="s-toc fa-solid fa-list fa-fw" target="_self" title="toc"></a></li></ul></div><div class="nav-main"> <a class="title flat-box" target="_self" href="/">MHuiG's Blog</a><div class="menu navigation"><ul class="nav-list-h m-pc"><li><a class="menuitem flat-box faa-parent animated-hover" title="索引"><i class="fa-duotone fa-list-alt fa-fw"></i> 索引</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/notes/" title="便签" active-action="action-notes"><i class="fa-duotone fa-books fa-fw"></i> 便签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/categories/" title="分类" active-action="action-categories"><i class="fa-duotone fa-folder-open fa-fw"></i> 分类</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/tags/" title="标签" active-action="action-tags"><i class="fa-duotone fa-tags fa-fw"></i> 标签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/archives/" title="归档" active-action="action-archives"><i class="fa-duotone fa-archive fa-fw"></i> 归档</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/friends/" title="友链" active-action="action-pagesfriends"><i class="fa-duotone fa-link fa-fw"></i> 友链</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="https://www.travellings.cn/go-by-clouds.html" title="Travelling" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway fa-fw"></i> Travelling</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/about/" title="关于" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie fa-fw"></i> 关于</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="noopener" href="https://mhuig.top/privacy-policy/" title="隐私政策" active-action="action-https:mhuigtopprivacy-policy"><i class="fa-duotone fa-user-secret fa-fw"></i> 隐私政策</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" title="更多"><i class="fa-duotone fa-fan fa-spin fa-fw"></i> 更多</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/beer/" title="Sponsor" active-action="action-pagesbeer"><i class="fa-duotone fa-heart-square fa-fw"></i> Sponsor</a></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="博客管理"><i class="fa-duotone fa-user-shield fa-fw"></i> 博客管理</a><ul class="list-v"><li><a class="menuitem flat-box header toggle-mode-btn"><i class="fa-duotone fa-bat fa-fw"></i> 暗黑模式</a></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/rss/" title="RSS订阅" active-action="action-pagesrss"><i class="fa-duotone fa-rss fa-fw"></i> RSS订阅</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/sitemap.xml" title="站点地图" active-action="action-sitemapxml"><i class="fa-duotone fa-sitemap fa-fw"></i> 站点地图</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://mhuig.instatus.com/" title="Monitors" active-action="action-https:mhuiginstatuscom"><i class="fa-duotone fa-telescope fa-fw"></i> Monitors</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://ssl.mhuig.top/" title="SSL Status" active-action="action-https:sslmhuigtop"><i class="fa-brands fa-expeditedssl fa-fw"></i> SSL Status</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="工具箱"><i class="fa-duotone fa-tools fa-fw"></i> 工具箱</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://rssbox.mhuig.top/" title="RSS Box" active-action="action-https:rssboxmhuigtop"><i class="fa-duotone fa-conveyor-belt-boxes fa-fw"></i> RSS Box</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/havefun/Coco/" title="My Cat" active-action="action-havefunCoco"><i class="fa-duotone fa-cat fa-fw"></i> My Cat</a></li><li><a class="menuitem flat-box"><i class="fa-duotone fa-compact-disc fa-spin fa-fw music"></i> Music</a><ul class="list-v"><li><div class="aplayer-container"><div class="aplayer-local"></div></div></li></ul></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/talk/" title="碎言碎语" active-action="action-pagestalk"><i class="fa-duotone fa-comments fa-fw"></i> 碎言碎语</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" title="GitHub" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github fa-fw"></i> GitHub</a></li></ul></li></ul></div><div class="m_search"><form name="searchform" class="form u-search-form"><i class="icon fa-solid fa-search fa-fw"></i> <input type="text" class="input u-search-input" placeholder="Search..."></form></div><ul class="switcher nav-list-h m-phone"><li><a class="s-search fa-solid fa-search fa-fw" target="_self" title="search"></a></li><li><a class="s-menu fa-solid fa-bars fa-fw" target="_self" title="menu"></a><ul class="menu-phone list-v navigation white-box"><li><a class="menuitem flat-box faa-parent animated-hover" title="索引"><i class="fa-duotone fa-list-alt fa-fw"></i> 索引</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/notes/" title="便签" active-action="action-notes"><i class="fa-duotone fa-books fa-fw"></i> 便签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/categories/" title="分类" active-action="action-categories"><i class="fa-duotone fa-folder-open fa-fw"></i> 分类</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/tags/" title="标签" active-action="action-tags"><i class="fa-duotone fa-tags fa-fw"></i> 标签</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/archives/" title="归档" active-action="action-archives"><i class="fa-duotone fa-archive fa-fw"></i> 归档</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/friends/" title="友链" active-action="action-pagesfriends"><i class="fa-duotone fa-link fa-fw"></i> 友链</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="https://www.travellings.cn/go-by-clouds.html" title="Travelling" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway fa-fw"></i> Travelling</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/about/" title="关于" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie fa-fw"></i> 关于</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="noopener" href="https://mhuig.top/privacy-policy/" title="隐私政策" active-action="action-https:mhuigtopprivacy-policy"><i class="fa-duotone fa-user-secret fa-fw"></i> 隐私政策</a></li></ul></li><li><a class="menuitem flat-box faa-parent animated-hover" title="更多"><i class="fa-duotone fa-fan fa-spin fa-fw"></i> 更多</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/beer/" title="Sponsor" active-action="action-pagesbeer"><i class="fa-duotone fa-heart-square fa-fw"></i> Sponsor</a></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="博客管理"><i class="fa-duotone fa-user-shield fa-fw"></i> 博客管理</a><ul class="list-v"><li><a class="menuitem flat-box header toggle-mode-btn"><i class="fa-duotone fa-bat fa-fw"></i> 暗黑模式</a></li><li></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/rss/" title="RSS订阅" active-action="action-pagesrss"><i class="fa-duotone fa-rss fa-fw"></i> RSS订阅</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/sitemap.xml" title="站点地图" active-action="action-sitemapxml"><i class="fa-duotone fa-sitemap fa-fw"></i> 站点地图</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://mhuig.instatus.com/" title="Monitors" active-action="action-https:mhuiginstatuscom"><i class="fa-duotone fa-telescope fa-fw"></i> Monitors</a></li><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://ssl.mhuig.top/" title="SSL Status" active-action="action-https:sslmhuigtop"><i class="fa-brands fa-expeditedssl fa-fw"></i> SSL Status</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" title="工具箱"><i class="fa-duotone fa-tools fa-fw"></i> 工具箱</a><ul class="list-v"><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://rssbox.mhuig.top/" title="RSS Box" active-action="action-https:rssboxmhuigtop"><i class="fa-duotone fa-conveyor-belt-boxes fa-fw"></i> RSS Box</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/havefun/Coco/" title="My Cat" active-action="action-havefunCoco"><i class="fa-duotone fa-cat fa-fw"></i> My Cat</a></li><li><a class="menuitem flat-box faa-parent animated-hover" href="/pages/talk/" title="碎言碎语" active-action="action-pagestalk"><i class="fa-duotone fa-comments fa-fw"></i> 碎言碎语</a></li></ul></li><hr><li><a class="menuitem flat-box faa-parent animated-hover" target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" title="GitHub" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github fa-fw"></i> GitHub</a></li></ul></li></ul></li></ul></div></div></div></header><div id="l_body"><div id="l_cover"><div id="none" class="cover-wrapper docs featured" style="display:none"><div class="cover-bg lazyload placeholder" data-bg></div><div class="cover-body"><div class="top"><p class="title">MHuiG</p><p class="subtitle">「看庭前花开花落,望天上云卷云舒」</p></div><div class="bottom"><div class="menu navigation"><div class="list-h"><a target="_blank" rel="external nofollow noopener noreferrer" href="https://github.com/MHuiG" active-action="action-https:githubcomMHuiG"><i class="fa-brands fa-github color-github fa-fw"></i><p>Github</p></a><a href="/pages/friends/" active-action="action-pagesfriends"><i class="fa-duotone fa-link color-friends fa-fw"></i><p>友链</p></a><a href="/pages/about/" active-action="action-pagesabout"><i class="fa-duotone fa-user-tie color-about fa-fw"></i><p>关于</p></a><a href="https://www.travellings.cn/go-by-clouds.html" target="_blank" active-action="action-https:wwwtravellingscngo-by-cloudshtml" rel="external nofollow noopener noreferrer"><i class="fa-duotone fa-subway color-travellings fa-fw"></i><p>Travelling</p></a></div></div></div></div><div id="scroll-down" style="display:none"><i class="fa fa-chevron-down scroll-down-effects"></i></div></div></div><div id="safearea"><div class="body-wrapper"><div id="l_main" class><article itemscope itemtype="http://schema.org/Article" class="article post white-box reveal md shadow floatable blur article-type-docs" id="docs" itemprop="blogPost"><link itemprop="mainEntityOfPage" href="https://blog.mhuig.top/notes/Spark/als"><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="MHuiG"></span><span hidden itemprop="post" itemscope itemtype="http://schema.org/Post"><meta itemprop="name" content="MHuiG"><meta itemprop="description" content="MHuiG&#39;s Blog (MHuiG的博客) MHuiG&#39;s Neverland(MHuiG的梦幻岛) —— MHuiG(@MHuiG) 随便写写画画的地方 - 技术博客"></span><span hidden><meta itemprop="image" content="/lib/favicon/android-chrome-192x192.png"></span><div class="article-meta" id="top"><span hidden itemprop="name headline"></span></div><div id="layoutHelper-page-plugins"></div><div id="post-body" itemprop="articleBody"><p> <span class="p logo center large">ALS</span></p><br><h1 hidden>基于 Audioscrobbler 数据集的音乐推荐 (pyspark)</h1><p>根据用户播放次数数据使用协同过滤算法完成音乐推荐。</p><div class="story post-story"><h2 id="数据集"><a href="#数据集" class="headerlink" title="数据集"></a>数据集</h2><p>Audioscrobbler 数据集</p><span class="btn center large"><a class="button" target="_blank" rel="external nofollow noopener noreferrer" href="http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz" title="下载 Audioscrobbler 数据集"><i class="fas fa-download"></i> 下载 Audioscrobbler 数据集</a></span><h3 id="user-artist-data-txt"><a href="#user-artist-data-txt" class="headerlink" title="user_artist_data.txt"></a><strong>user_artist_data.txt</strong></h3><p>它包含 141000 个用户和 160 万个艺术家,记录了约 2420 万条用户播放艺术家歌曲的信息,其中包括播放次数信息。播放次数较多意味着该用户更喜欢对应艺术家的作品。</p><table><thead><tr><th><strong>userid</strong></th><th><strong>artistid</strong></th><th><strong>playcount</strong></th></tr></thead><tbody><tr><td> 用户 ID</td><td> 艺术家 ID</td><td> 播放次数</td></tr><tr><td> 1000002</td><td>1</td><td>55</td></tr></tbody></table><h3 id="artist-data-txt"><a href="#artist-data-txt" class="headerlink" title="artist_data.txt"></a><strong>artist_data.txt</strong></h3><p>该文件包含两列: artistid artist_name 艺术家 ID 艺术家名字。文件中给出了每个艺术家的 ID 和对应的名字。此文件用于 ID 与名字的转换。</p><table><thead><tr><th><strong>artistid</strong></th><th><strong>artist_name</strong></th></tr></thead><tbody><tr><td> 艺术家 ID</td><td> 艺术家名</td></tr><tr><td> 1134999</td><td>06Crazy Life</td></tr></tbody></table><h3 id="artist-alias-txt"><a href="#artist-alias-txt" class="headerlink" title="artist_alias.txt"></a><strong>artist_alias.txt</strong></h3><p>该文件包含两列: badid, goodid 坏 ID 好 ID 。该文件包含已知错误拼写的艺术家 ID 及其对应艺术家的正规的,用于将拼写错误的艺术家 ID 或 ID 变体对应到该艺术家正确的 ID。</p><table><thead><tr><th><strong>badid</strong></th><th><strong>goodid</strong></th></tr></thead><tbody><tr><td> 坏 ID</td><td> 好 ID</td></tr><tr><td>1092764</td><td>1000311</td></tr></tbody></table></div><div class="story post-story"><h2 id="算法"><a href="#算法" class="headerlink" title="算法"></a>算法</h2><h3 id="交替最小二乘推荐算法-Alternating-Least-Squares,ALS"><a href="#交替最小二乘推荐算法-Alternating-Least-Squares,ALS" class="headerlink" title="交替最小二乘推荐算法 (Alternating Least Squares,ALS)"></a><strong>交替最小二乘推荐算法 (Alternating Least Squares,ALS)</strong></h3><p>人们虽然经常听音乐,但很少给音乐评分。因此 Audioscrobbler 数据集覆盖了更多的用户和艺术家,也包含了更多的总体信息,虽然单条记录的信息比较少。这种类型的数据通常被称为隐式反馈数据,因为用户和艺术家的关系是通过其他行动隐含体现出来的,而不是通过显式的评分或点赞得到的。</p><p>根据两个用户的相似行为判断他们有相同的偏好,学习算法不需要用户和艺术家的属性信息。这类算法通常称为<strong>协同过滤算法</strong>。</p><p><strong>潜在因素模型</strong>:试图通过数据相对少的未被观察到的底层原因,来解释大量用户和产品之间可观察到的交互。因子分析方法背后的理论是,有关观测变量之间的相互依赖性的信息可以稍后用于减少数据集中的变量集。</p><p><strong>矩阵分解模型</strong>:数学上,算法把用户和产品数据当成一个大矩阵 R,矩阵第 i 行和第 j 列上的元素有值,代表用户 i 播放过艺术家 j 的音乐。矩阵 R 是稀疏的:R 中大多数元素都是 0,因为相对于所有可能的用户 - 艺术家组合,只有很少一部分组合会出现在数据中。算法将 R 分解为两个小矩阵 U 和 P 的乘积。矩阵 U 和矩阵 P 非常 “瘦”。因为 A 有很多行和列,但 U 和 P 的行很多而列很少(列数用 k 表示)。这 k 个列就是潜在因素,用于解释数据中的交互关系。由于 k 的值小,矩阵分解算法只能是某种近似。</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992482915/202082144833.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992482915/202082144833.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="矩阵分解模型"></p><p>为了使低秩矩阵 P 和 U 尽可能的逼近 R,可以通过最小化如下损失函数 L 来完成。</p><p><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:54.377ex"><svg style="vertical-align:-2.022ex;min-width:54.377ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="5.175ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1393.6)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1393.6) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="9939.2 -1393.6 1 2287.1"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,443.6)"><g data-mml-node="mtd"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641 191 643 191 649 191 673 202 682 204 683 217 683 271 680 344 680 485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628 387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54 478 72 522 106 564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203 583 83 557 9Q555 4 553 3T537 0 494-1Q483-1 418-1T294 0H116Q32 0 32 10 32 17 34 24 39 43 44 45 48 46 59 46H65Q92 46 125 49 139 52 144 61 147 65 216 339T285 628Q285 635 228 637Z"/></g><g data-mml-node="mo" transform="translate(681,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="mi" transform="translate(1070,0)"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mo" transform="translate(1837,0)"><path data-c="2C" d="M78 35T78 60 94 103 137 121Q165 121 187 96T210 8Q210-27 201-60T180-117 154-158 130-185 117-194Q113-194 104-185T95-172Q95-168 106-156T131-126 157-76 173-3V9L172 8Q170 7 167 6T161 3 152 1 140 0Q113 0 96 17Z"/></g><g data-mml-node="mi" transform="translate(2281.7,0)"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mo" transform="translate(3032.7,0)"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="mo" transform="translate(3699.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="munder" transform="translate(4755.2,0)"><g data-mml-node="mo"><path data-c="2211" d="M60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761 1235 809 1174 838T1033 881 882 898 699 902H574 543 251L259 891Q722 258 724 252 725 250 724 246 721 243 460-56L196-356Q196-357 407-357 459-357 548-357T676-358Q812-358 896-353T1063-332 1204-283 1307-196Q1328-170 1348-124H1388Q1388-125 1381-145T1356-210 1325-294L1267-449 666-450Q64-450 61-448 55-446 55-439 55-437 57-433L590 177Q590 178 557 222T452 366 322 544L56 909 55 924Q55 945 60 948Z"/></g><g data-mml-node="TeXAtom" transform="translate(277.9,-1100) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mo" transform="translate(345,0)"><path data-c="2C" d="M78 35T78 60 94 103 137 121Q165 121 187 96T210 8Q210-27 201-60T180-117 154-158 130-185 117-194Q113-194 104-185T95-172Q95-168 106-156T131-126 157-76 173-3V9L172 8Q170 7 167 6T161 3 152 1 140 0Q113 0 96 17Z"/></g><g data-mml-node="mi" transform="translate(623,0)"><path data-c="1D43D" d="M447 625Q447 637 354 637H329Q323 642 323 645T325 664Q329 677 335 683H352Q393 681 498 681 541 681 568 681T605 682 619 682Q633 682 633 672 633 670 630 658 626 642 623 640T604 637Q552 637 545 623 541 610 483 376 420 128 419 127 397 64 333 21T195-22Q137-22 97 8T57 88Q57 130 80 152T132 174Q177 174 182 130 182 98 164 80T123 56Q115 54 115 53T122 44Q148 15 197 15 235 15 271 47T324 130Q328 142 387 380T447 625Z"/></g></g></g><g data-mml-node="mo" transform="translate(6199.2,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msub" transform="translate(6588.2,0)"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317 38 348 53 381 73 411 99 433 132 442Q161 442 183 430T214 408 225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400 430 381 430 363 430 333 417 315T391 292 366 288Q346 288 334 299T322 328Q322 376 378 392 356 405 342 405 286 405 239 331 229 315 224 298T190 165Q156 25 151 16 138-11 108-11 95-11 87-5T76 7 74 17Q74 30 114 189T154 366Q154 405 128 405 107 405 92 377T68 316 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="TeXAtom" transform="translate(484,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(345,0)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g></g><g data-mml-node="mo" transform="translate(7879.7,0)"><path data-c="2212" d="M84 237T84 250 98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/></g><g data-mml-node="msubsup" transform="translate(8879.9,0)"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(605,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g><g data-mml-node="mi" transform="translate(605,-247) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g><g data-mml-node="msub" transform="translate(10032.7,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(675,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g><g data-mml-node="msup" transform="translate(11049.1,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="mn" transform="translate(422,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315 301 241Q265 210 201 149L142 93 218 92Q375 92 385 97 392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19 31Q50 38 56 46T86 81Q115 113 136 137 145 147 170 174T204 211 233 244 261 278 284 308 305 340 320 369 333 401 340 431 343 464Q343 527 309 573T212 619Q179 619 154 602T119 569 109 550Q109 549 114 549 132 549 151 535T170 489Q170 464 154 447T109 429Z"/></g></g><g data-mml-node="mo" transform="translate(12096.9,0)"><path data-c="2B" d="M56 237T56 250 70 270H369V420L370 570Q380 583 389 583 402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401-82 391-82H389 387Q375-82 369-68V230H70Q56 237 56 250Z"/></g><g data-mml-node="mi" transform="translate(13097.1,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644 322 629 373 486T474 207 524 67Q531 47 537 34T546 15 551 6 555 2 556-2 550-11H482Q457 3 450 18T399 152L354 277 340 262Q327 246 293 207T236 141Q211 112 174 69 123 9 111-1T83-12Q47-12 47 20 47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657 166 657 166 673Z"/></g><g data-mml-node="mo" transform="translate(13680.1,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="mo" transform="translate(14069.1,0) translate(0 -0.5)"><path data-c="7C" d="M139-249H137Q125-249 119-235V251L120 737Q130 750 139 750 152 750 159 735V-235Q151-249 141-249H139Z"/></g><g data-mml-node="msub" transform="translate(14347.1,0)"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g><g data-mml-node="msup" transform="translate(15246,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139-249H137Q125-249 119-235V251L120 737Q130 750 139 750 152 750 159 735V-235Q151-249 141-249H139Z"/></g><g data-mml-node="mn" transform="translate(311,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315 301 241Q265 210 201 149L142 93 218 92Q375 92 385 97 392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19 31Q50 38 56 46T86 81Q115 113 136 137 145 147 170 174T204 211 233 244 261 278 284 308 305 340 320 369 333 401 340 431 343 464Q343 527 309 573T212 619Q179 619 154 602T119 569 109 550Q109 549 114 549 132 549 151 535T170 489Q170 464 154 447T109 429Z"/></g></g><g data-mml-node="mo" transform="translate(16182.8,0)"><path data-c="2B" d="M56 237T56 250 70 270H369V420L370 570Q380 583 389 583 402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401-82 391-82H389 387Q375-82 369-68V230H70Q56 237 56 250Z"/></g><g data-mml-node="mo" transform="translate(17183,0) translate(0 -0.5)"><path data-c="7C" d="M139-249H137Q125-249 119-235V251L120 737Q130 750 139 750 152 750 159 735V-235Q151-249 141-249H139Z"/></g><g data-mml-node="msub" transform="translate(17461,0)"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317 40 348 55 381 75 411 101 433 134 442Q209 442 230 378L240 387Q302 442 358 442 423 442 460 395T497 281Q497 173 421 82T249-10Q227-10 210-4 199 1 187 11T168 28L161 36Q160 35 139-51T118-138Q118-144 126-145T163-148H188Q194-155 194-157T191-175Q188-187 185-190T172-194Q170-194 161-194T127-193 65-192Q-5-192-24-194H-32Q-39-187-39-183-37-156-26-148H-6Q28-147 33-136 36-130 94 103T155 350Q156 355 156 364 156 405 131 405 109 405 94 377T71 316 59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26 282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405 339 405 328 402T306 393 286 380 269 365 254 350 243 336 235 326L232 322Q232 321 229 308T218 264 204 212Q178 106 178 102Z"/></g><g data-mml-node="mi" transform="translate(536,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g><g data-mml-node="msup" transform="translate(18338.4,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139-249H137Q125-249 119-235V251L120 737Q130 750 139 750 152 750 159 735V-235Q151-249 141-249H139Z"/></g><g data-mml-node="mn" transform="translate(311,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315 301 241Q265 210 201 149L142 93 218 92Q375 92 385 97 392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19 31Q50 38 56 46T86 81Q115 113 136 137 145 147 170 174T204 211 233 244 261 278 284 308 305 340 320 369 333 401 340 431 343 464Q343 527 309 573T212 619Q179 619 154 602T119 569 109 550Q109 549 114 549 132 549 151 535T170 489Q170 464 154 447T109 429Z"/></g></g><g data-mml-node="msup" transform="translate(19052.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="mn" transform="translate(422,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315 301 241Q265 210 201 149L142 93 218 92Q375 92 385 97 392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19 31Q50 38 56 46T86 81Q115 113 136 137 145 147 170 174T204 211 233 244 261 278 284 308 305 340 320 369 333 401 340 431 343 464Q343 527 309 573T212 619Q179 619 154 602T119 569 109 550Q109 549 114 549 132 549 151 535T170 489Q170 464 154 447T109 429Z"/></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1393.6 1 2287.1"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:1" transform="translate(0,1193.6)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="31" d="M213 578 200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641 273 663Q275 666 285 666 294 666 302 660V361L303 61Q310 54 315 52T339 48 401 46H427V0H416Q395 3 257 3 121 3 100 0H88V46H114Q136 46 152 46T177 47 193 50 201 52 207 57 213 61V578Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>损失函数公式与上图对应:<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.357ex" xmlns="http://www.w3.org/2000/svg" width="2.034ex" height="1.357ex" role="img" focusable="false" viewBox="0 -442 899 599.8"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g></g></g></svg></mjx-container>表示用户 i 的偏好隐含向量,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.666ex" xmlns="http://www.w3.org/2000/svg" width="1.985ex" height="1.666ex" role="img" focusable="false" viewBox="0 -442 877.3 736.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317 40 348 55 381 75 411 101 433 134 442Q209 442 230 378L240 387Q302 442 358 442 423 442 460 395T497 281Q497 173 421 82T249-10Q227-10 210-4 199 1 187 11T168 28L161 36Q160 35 139-51T118-138Q118-144 126-145T163-148H188Q194-155 194-157T191-175Q188-187 185-190T172-194Q170-194 161-194T127-193 65-192Q-5-192-24-194H-32Q-39-187-39-183-37-156-26-148H-6Q28-147 33-136 36-130 94 103T155 350Q156 355 156 364 156 405 131 405 109 405 94 377T71 316 59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26 282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405 339 405 328 402T306 393 286 380 269 365 254 350 243 336 235 326L232 322Q232 321 229 308T218 264 204 212Q178 106 178 102Z"/></g><g data-mml-node="mi" transform="translate(536,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g></g></g></svg></mjx-container>表示艺术家 j 包含的隐含特征向量,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.666ex" xmlns="http://www.w3.org/2000/svg" width="2.419ex" height="1.666ex" role="img" focusable="false" viewBox="0 -442 1069.3 736.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317 38 348 53 381 73 411 99 433 132 442Q161 442 183 430T214 408 225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400 430 381 430 363 430 333 417 315T391 292 366 288Q346 288 334 299T322 328Q322 376 378 392 356 405 342 405 286 405 239 331 229 315 224 298T190 165Q156 25 151 16 138-11 108-11 95-11 87-5T76 7 74 17Q74 30 114 189T154 366Q154 405 128 405 107 405 92 377T68 316 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="TeXAtom" transform="translate(484,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(345,0)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g></g></g></g></svg></mjx-container>表示用户 i 对艺术家 j 的评分,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.666ex" xmlns="http://www.w3.org/2000/svg" width="4.908ex" height="2.57ex" role="img" focusable="false" viewBox="0 -841.7 2169.1 1136"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msubsup"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(605,363) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g><g data-mml-node="mi" transform="translate(605,-284.4) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g><g data-mml-node="msub" transform="translate(1152.8,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(675,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g></g></g></svg></mjx-container>是用户 i 对艺术家 j 评分的近似。其中 λ 是正则化项的系数,损失函数一般需要加入正则化项来避免过拟合等问题。</p><p>于是就简化为一个最小化损失函数 L 的优化问题。用户 - 特征矩阵<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.05ex" xmlns="http://www.w3.org/2000/svg" width="1.735ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 767 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g></g></g></svg></mjx-container>和特征 - 艺术家矩阵<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:0" xmlns="http://www.w3.org/2000/svg" width="1.699ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 751 683"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g></g></g></svg></mjx-container>的乘积的结果是对整个稠密的用户 - 艺术家相互关系矩阵<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.05ex" xmlns="http://www.w3.org/2000/svg" width="4.874ex" height="1.954ex" role="img" focusable="false" viewBox="0 -841.7 2154.3 863.7"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="msup" transform="translate(767,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,363) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g></g></g></svg></mjx-container>的完整估计。该乘积可以理解成艺术家与其属性之间的一个映射,然后按用户属性进行加权。</p><p><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.186ex" xmlns="http://www.w3.org/2000/svg" width="9.608ex" height="2.09ex" role="img" focusable="false" viewBox="0 -841.7 4246.8 923.7"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682 206 683 378 683 550 682 564 680 620 672 658 652T712 606 733 563 739 529Q739 484 710 445T643 385 576 351 538 338L545 333Q612 295 612 223 612 212 607 162T602 80V71Q602 53 603 43T614 25 640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93 755 75 731 36 693-21 641-21H632Q571-21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313 459 320 449 321T378 323H309L277 193Q244 61 244 59 244 55 245 54T252 50 269 48 302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2 146 2 117 2T71 2 50 1Q33 1 33 10 33 12 36 24 41 43 46 45 50 46 61 46H67Q94 46 127 49 141 52 146 61 149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627 385 624 352 494T319 361Q319 360 388 360 466 361 492 367 556 377 592 426 608 449 619 486T630 554Z"/></g><g data-mml-node="mo" transform="translate(1036.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="mi" transform="translate(2092.6,0)"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="msup" transform="translate(2859.6,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,363) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g></g></g></svg></mjx-container>通常没有确切的解,因为 U 和 P 通常不够大,不足以完全表示 R,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.05ex" xmlns="http://www.w3.org/2000/svg" width="4.874ex" height="1.954ex" role="img" focusable="false" viewBox="0 -841.7 2154.3 863.7"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="msup" transform="translate(767,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,363) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g></g></g></svg></mjx-container>应该尽可能逼近 R。然而不幸的是,想直接同时得到 U 和 P 的最优解是不可能的。</p><p>如果 P 已知,求 U 的最优解是非常容易的,反之亦然。但 P 和 U 事先都是未知的。</p><p>虽然 P 是未知的,但可以把 P 初始化为随机行向量矩阵。接着运用简单的线性代数,就能在给定 R 和 P 的条件下求出 U 的最优解。实际上,U 的第 i 行是 R 的第 i 行和 P 的函数。</p><p><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:27.691ex"><svg style="vertical-align:-.726ex;min-width:27.691ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.583ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -820.9)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 820.9) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="4041.7 -820.9 1 1141.7"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-70.9)"><g data-mml-node="mtd"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682 206 683 378 683 550 682 564 680 620 672 658 652T712 606 733 563 739 529Q739 484 710 445T643 385 576 351 538 338L545 333Q612 295 612 223 612 212 607 162T602 80V71Q602 53 603 43T614 25 640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93 755 75 731 36 693-21 641-21H632Q571-21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313 459 320 449 321T378 323H309L277 193Q244 61 244 59 244 55 245 54T252 50 269 48 302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2 146 2 117 2T71 2 50 1Q33 1 33 10 33 12 36 24 41 43 46 45 50 46 61 46H67Q94 46 127 49 141 52 146 61 149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627 385 624 352 494T319 361Q319 360 388 360 466 361 492 367 556 377 592 426 608 449 619 486T630 554Z"/></g><g data-mml-node="mi" transform="translate(792,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g><g data-mml-node="mi" transform="translate(1086,0)"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mo" transform="translate(1837,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msup" transform="translate(2226,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g><g data-mml-node="mi" transform="translate(3613.2,0)"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="msup" transform="translate(4364.2,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="TeXAtom" transform="translate(422,413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250 98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/></g><g data-mml-node="mn" transform="translate(778,0)"><path data-c="31" d="M213 578 200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641 273 663Q275 666 285 666 294 666 302 660V361L303 61Q310 54 315 52T339 48 401 46H427V0H416Q395 3 257 3 121 3 100 0H88V46H114Q136 46 152 46T177 47 193 50 201 52 207 57 213 61V578Z"/></g></g></g><g data-mml-node="mo" transform="translate(6017.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="msub" transform="translate(7073.4,0)"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mi" transform="translate(716,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -820.9 1 1141.7"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:2" transform="translate(0,679.1)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315 301 241Q265 210 201 149L142 93 218 92Q375 92 385 97 392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19 31Q50 38 56 46T86 81Q115 113 136 137 145 147 170 174T204 211 233 244 261 278 284 308 305 340 320 369 333 401 340 431 343 464Q343 527 309 573T212 619Q179 619 154 602T119 569 109 550Q109 549 114 549 132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>因此可以很容易分开计算 U 的每一行。因为 U 的每一行可以分开计算,所以我们可以将其并行化,而并行化是大规模计算的一大优点。</p><p>ALS 是求解<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align:-.566ex" xmlns="http://www.w3.org/2000/svg" width="6.739ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2978.7 1000"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641 191 643 191 649 191 673 202 682 204 683 217 683 271 680 344 680 485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628 387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54 478 72 522 106 564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203 583 83 557 9Q555 4 553 3T537 0 494-1Q483-1 418-1T294 0H116Q32 0 32 10 32 17 34 24 39 43 44 45 48 46 59 46H65Q92 46 125 49 139 52 144 61 147 65 216 339T285 628Q285 635 228 637Z"/></g><g data-mml-node="mo" transform="translate(681,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="mi" transform="translate(1070,0)"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mo" transform="translate(1642,0)"><path data-c="2C" d="M78 35T78 60 94 103 137 121Q165 121 187 96T210 8Q210-27 201-60T180-117 154-158 130-185 117-194Q113-194 104-185T95-172Q95-168 106-156T131-126 157-76 173-3V9L172 8Q170 7 167 6T161 3 152 1 140 0Q113 0 96 17Z"/></g><g data-mml-node="mi" transform="translate(2086.7,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317 40 348 55 381 75 411 101 433 134 442Q209 442 230 378L240 387Q302 442 358 442 423 442 460 395T497 281Q497 173 421 82T249-10Q227-10 210-4 199 1 187 11T168 28L161 36Q160 35 139-51T118-138Q118-144 126-145T163-148H188Q194-155 194-157T191-175Q188-187 185-190T172-194Q170-194 161-194T127-193 65-192Q-5-192-24-194H-32Q-39-187-39-183-37-156-26-148H-6Q28-147 33-136 36-130 94 103T155 350Q156 355 156 364 156 405 131 405 109 405 94 377T71 316 59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26 282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405 339 405 328 402T306 393 286 380 269 365 254 350 243 336 235 326L232 322Q232 321 229 308T218 264 204 212Q178 106 178 102Z"/></g><g data-mml-node="mo" transform="translate(2589.7,0)"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g></g></g></svg></mjx-container>的著名算法,固定 P 或 U 对其对应的隐含向量求偏导数并令导数为 0,得到求解公式:</p><p><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:33.407ex"><svg style="vertical-align:-.726ex;min-width:33.407ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.583ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -820.9)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 820.9) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="5305 -820.9 1 1141.7"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-70.9)"><g data-mml-node="mtd"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370 99 420 158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27 291 44 328 78L339 95Q341 99 377 247 407 367 413 387T427 416Q444 431 463 431 480 431 488 421T496 402L420 84Q419 79 419 68 419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153 551 153 551 144 550 139 549 130T540 98 523 55 498 17 462-8Q454-10 438-10 372-10 347 46 345 45 336 36T318 21 296 6 267-6 233-11Q189-11 155 7 103 38 103 113 103 170 138 262T173 379Q173 380 173 381 173 390 173 393T169 400 158 404H154Q131 404 112 385T82 344 65 302 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(605,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g><g data-mml-node="mo" transform="translate(1176.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="mo" transform="translate(2232.5,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msup" transform="translate(2621.5,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g><g data-mml-node="mi" transform="translate(4008.8,0)"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mo" transform="translate(4982,0)"><path data-c="2B" d="M56 237T56 250 70 270H369V420L370 570Q380 583 389 583 402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401-82 391-82H389 387Q375-82 369-68V230H70Q56 237 56 250Z"/></g><g data-mml-node="mi" transform="translate(5982.2,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644 322 629 373 486T474 207 524 67Q531 47 537 34T546 15 551 6 555 2 556-2 550-11H482Q457 3 450 18T399 152L354 277 340 262Q327 246 293 207T236 141Q211 112 174 69 123 9 111-1T83-12Q47-12 47 20 47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657 166 657 166 673Z"/></g><g data-mml-node="mi" transform="translate(6565.2,0)"><path data-c="1D43C" d="M43 1Q26 1 26 10 26 12 29 24 34 43 39 45 42 46 54 46H60Q120 46 136 53 137 53 138 54 143 56 149 77T198 273Q210 318 216 344 286 624 286 626 284 630 284 631 274 637 213 637H193Q184 643 189 662 193 677 195 680T209 683H213Q285 681 359 681 481 681 487 683H497Q504 676 504 672T501 655 494 639Q491 637 471 637 440 637 407 634 393 631 388 623 381 609 337 432 326 385 315 341 245 65 245 59 245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2 143 2 113 2T65 2 43 1Z"/></g><g data-mml-node="msup" transform="translate(7069.2,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="TeXAtom" transform="translate(422,413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250 98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/></g><g data-mml-node="mn" transform="translate(778,0)"><path data-c="31" d="M213 578 200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641 273 663Q275 666 285 666 294 666 302 660V361L303 61Q310 54 315 52T339 48 401 46H427V0H416Q395 3 257 3 121 3 100 0H88V46H114Q136 46 152 46T177 47 193 50 201 52 207 57 213 61V578Z"/></g></g></g><g data-mml-node="msup" transform="translate(8444.9,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mi" transform="translate(839.5,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g><g data-mml-node="msub" transform="translate(9832.1,0)"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317 38 348 53 381 73 411 99 433 132 442Q161 442 183 430T214 408 225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400 430 381 430 363 430 333 417 315T391 292 366 288Q346 288 334 299T322 328Q322 376 378 392 356 405 342 405 286 405 239 331 229 315 224 298T190 165Q156 25 151 16 138-11 108-11 95-11 87-5T76 7 74 17Q74 30 114 189T154 366Q154 405 128 405 107 405 92 377T68 316 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(484,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369 98 420 158 442Q197 442 223 419T250 357Q250 340 236 301T196 196 154 83Q149 61 149 51 149 26 166 26 175 26 185 29T208 43 235 78 260 137Q263 149 265 151T282 153Q302 153 302 143 302 135 293 112T268 61 223 11 161-11Q129-11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281 56 279 53 278 49 278 41 278H27Q21 284 21 287Z"/></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -820.9 1 1141.7"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:3" transform="translate(0,679.1)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664 351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336 375 315Q457 262 457 175 457 96 395 37T238-22Q158-22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94 148 82 136 74 126 70 118 67L114 66Q165 21 238 21 293 21 321 74 338 107 338 175V195Q338 290 274 322 259 328 213 329L171 330 168 332Q166 335 166 348 166 366 174 366 202 366 232 371 266 376 294 413T322 525V533Q322 590 287 612 265 626 240 626 208 626 181 615T143 592 132 580H135Q138 579 143 578T153 573 165 566 175 555 183 540 186 520Q186 498 172 481T127 463Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:33.569ex"><svg style="vertical-align:-.776ex;min-width:33.569ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.683ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -843)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 843) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="5340.7 -843 1 1186"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-48.7)"><g data-mml-node="mtd"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317 40 348 55 381 75 411 101 433 134 442Q209 442 230 378L240 387Q302 442 358 442 423 442 460 395T497 281Q497 173 421 82T249-10Q227-10 210-4 199 1 187 11T168 28L161 36Q160 35 139-51T118-138Q118-144 126-145T163-148H188Q194-155 194-157T191-175Q188-187 185-190T172-194Q170-194 161-194T127-193 65-192Q-5-192-24-194H-32Q-39-187-39-183-37-156-26-148H-6Q28-147 33-136 36-130 94 103T155 350Q156 355 156 364 156 405 131 405 109 405 94 377T71 316 59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26 282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405 339 405 328 402T306 393 286 380 269 365 254 350 243 336 235 326L232 322Q232 321 229 308T218 264 204 212Q178 106 178 102Z"/></g><g data-mml-node="mi" transform="translate(536,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g><g data-mml-node="mo" transform="translate(1155.1,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="mo" transform="translate(2210.9,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msup" transform="translate(2599.9,0)"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mi" transform="translate(854.2,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g><g data-mml-node="mi" transform="translate(4001.9,0)"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mo" transform="translate(4991.1,0)"><path data-c="2B" d="M56 237T56 250 70 270H369V420L370 570Q380 583 389 583 402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401-82 391-82H389 387Q375-82 369-68V230H70Q56 237 56 250Z"/></g><g data-mml-node="mi" transform="translate(5991.3,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644 322 629 373 486T474 207 524 67Q531 47 537 34T546 15 551 6 555 2 556-2 550-11H482Q457 3 450 18T399 152L354 277 340 262Q327 246 293 207T236 141Q211 112 174 69 123 9 111-1T83-12Q47-12 47 20 47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657 166 657 166 673Z"/></g><g data-mml-node="mi" transform="translate(6574.3,0)"><path data-c="1D43C" d="M43 1Q26 1 26 10 26 12 29 24 34 43 39 45 42 46 54 46H60Q120 46 136 53 137 53 138 54 143 56 149 77T198 273Q210 318 216 344 286 624 286 626 284 630 284 631 274 637 213 637H193Q184 643 189 662 193 677 195 680T209 683H213Q285 681 359 681 481 681 487 683H497Q504 676 504 672T501 655 494 639Q491 637 471 637 440 637 407 634 393 631 388 623 381 609 337 432 326 385 315 341 245 65 245 59 245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2 143 2 113 2T65 2 43 1Z"/></g><g data-mml-node="msup" transform="translate(7078.3,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g><g data-mml-node="TeXAtom" transform="translate(422,413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250 98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/></g><g data-mml-node="mn" transform="translate(778,0)"><path data-c="31" d="M213 578 200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641 273 663Q275 666 285 666 294 666 302 660V361L303 61Q310 54 315 52T339 48 401 46H427V0H416Q395 3 257 3 121 3 100 0H88V46H114Q136 46 152 46T177 47 193 50 201 52 207 57 213 61V578Z"/></g></g></g><g data-mml-node="msup" transform="translate(8454,0)"><g data-mml-node="mi"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mi" transform="translate(854.2,413) scale(0.707)"><path data-c="1D447" d="M40 437Q21 437 21 445 21 450 37 501T71 602L88 651Q93 669 101 677H569 659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437 640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631 469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46 418 46 427 45T436 36Q436 31 433 22 429 4 424 1L422 0Q419 0 415 0 410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83 94Q174 46 189 55 190 56 191 56 196 59 201 76T241 233Q258 301 269 344 339 619 339 625 339 630 310 630H279Q212 630 191 624 146 614 121 583T67 467Q60 445 57 441T43 437H40Z"/></g></g><g data-mml-node="msub" transform="translate(9856,0)"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317 38 348 53 381 73 411 99 433 132 442Q161 442 183 430T214 408 225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400 430 381 430 363 430 333 417 315T391 292 366 288Q346 288 334 299T322 328Q322 376 378 392 356 405 342 405 286 405 239 331 229 315 224 298T190 165Q156 25 151 16 138-11 108-11 95-11 87-5T76 7 74 17Q74 30 114 189T154 366Q154 405 128 405 107 405 92 377T68 316 57 280Q55 278 41 278H27Q21 284 21 287Z"/></g><g data-mml-node="mi" transform="translate(484,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405 240 405 220 393T185 362 161 325 144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432 341 418 354 401T367 348V332L318 133Q267-67 264-75 246-125 194-164T75-204Q25-204 7-183T-12-137Q-12-110 7-91T53-71Q70-71 82-81T95-112Q95-148 63-167 69-168 77-168 111-168 139-140T182-74L193-32Q204 11 219 72T251 197 278 308 289 365Q289 372 288 376Z"/></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -843 1 1186"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:4" transform="translate(0,701.3)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="34" d="M462 0Q444 3 333 3 217 3 199 0H190V46H221Q241 46 248 46T265 48 279 53 286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675 336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212 183 211H293Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>随机对 P、Q 初始化,随后交替进行优化直到收敛。收敛标准是均方误差小于预定义阈值,或者到达最大迭代次数。</p><h3 id="推荐质量评价指标AUC"><a href="#推荐质量评价指标AUC" class="headerlink" title="推荐质量评价指标AUC"></a><strong>推荐质量评价指标 AUC</strong></h3><p>AUC 指标是一个 [0,1] 之间的实数,代表如果随机挑选一个正样本和一个负样本,分类算法将这个正样本排在负样本前面的概率。值越大,表示分类算法更有可能将正样本排在前面,也即算法准确性越好。</p><p>随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。<br><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:36.927ex"><svg style="vertical-align:-.643ex;min-width:36.927ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.417ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -784.1)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 784.1) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="6082.9 -784.1 1 1068.2"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,34.1)"><g data-mml-node="mtd"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46 272 46 272 35 272 34 270 22 267 8 264 4T251 0Q249 0 239 0T205 1 141 2Q70 2 50 0H42Q35 7 35 11 37 38 48 46H62Q132 49 164 96 170 102 345 401T523 704Q530 716 547 716H555 572Q578 707 578 706L606 383Q634 60 636 57 641 46 701 46 726 46 726 36 726 34 723 22 720 7 718 4T704 0Q701 0 690 0T651 1 578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260 413 259Q516 259 516 260Z"/></g><g data-mml-node="mi" transform="translate(750,0)"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mi" transform="translate(1517,0)"><path data-c="1D436" d="M50 252Q50 367 117 473T286 641 490 704Q580 704 633 653 642 643 648 636T656 626L657 623Q660 623 684 649 691 655 699 663T715 679 725 690L740 705H746Q760 705 760 698 760 694 728 561 692 422 692 421 690 416 687 415T669 413H653Q647 419 647 422 647 423 648 429T650 449 651 481Q651 552 619 605T510 659Q484 659 454 652T382 628 299 572 226 479Q194 422 175 346T156 222Q156 108 232 58 280 24 350 24 441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248 648 243 647 239 618 132 523 55T319-22Q206-22 128 53T50 252Z"/></g><g data-mml-node="mo" transform="translate(2554.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="mi" transform="translate(3610.6,0)"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="mo" transform="translate(4361.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msub" transform="translate(4750.6,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="TeXAtom" transform="translate(675,-176.7) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">正</text></g><g data-mml-node="mi" transform="translate(1000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">样</text></g><g data-mml-node="mi" transform="translate(2000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">本</text></g></g></g><g data-mml-node="mo" transform="translate(7874.7,0)"><path data-c="3E" d="M84 520Q84 528 88 533T96 539L99 540Q106 540 253 471T544 334L687 265Q694 260 694 250T687 235Q685 233 395 96L107-40H101Q83-38 83-20 83-19 83-17 82-10 98-1 117 9 248 71 326 108 378 132L626 250 378 368Q90 504 86 509 84 513 84 520Z"/></g><g data-mml-node="msub" transform="translate(8930.4,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="TeXAtom" transform="translate(675,-176.7) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">负</text></g><g data-mml-node="mi" transform="translate(1000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">样</text></g><g data-mml-node="mi" transform="translate(2000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">本</text></g></g></g><g data-mml-node="mo" transform="translate(11776.8,0)"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -784.1 1 1068.2"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:5" transform="translate(0,784.1)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22 294 22 326 82 345 115 345 210 345 313 318 349 292 382 260 382H254Q176 382 136 314 132 307 129 306T114 304Q97 304 95 310 93 314 93 485V614Q93 664 98 664 100 666 102 666 103 666 123 658T178 642 253 634Q324 634 389 662 397 666 402 666 410 666 410 648V635Q328 538 205 538 174 538 149 544L139 546V374Q158 388 169 396T205 412 256 420Q337 420 393 355T449 201Q449 109 385 44T229-22Q148-22 99 32T50 154Q50 178 61 192T84 210 107 214Q132 214 148 197T164 157Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container><br>在有 M 个正样本,N 个负样本的数据集里。一共有 M×N 对样本(一对样本,一个正样本与一个负样本)。统计这 M×N 对样本里,正样本的预测概率大于负样本的预测概率的个数。<br><mjx-container class="MathJax" jax="SVG" display="true" width="full" style="min-width:38.119ex"><svg style="vertical-align:-1.939ex;min-width:38.119ex" xmlns="http://www.w3.org/2000/svg" width="100%" height="5.009ex" role="img" focusable="false"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -1357.1)"><g data-mml-node="math"><g data-mml-node="mtable" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 1357.1) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="6346.3 -1357.1 1 2214.2"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-171.1)"><g data-mml-node="mtd"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46 272 46 272 35 272 34 270 22 267 8 264 4T251 0Q249 0 239 0T205 1 141 2Q70 2 50 0H42Q35 7 35 11 37 38 48 46H62Q132 49 164 96 170 102 345 401T523 704Q530 716 547 716H555 572Q578 707 578 706L606 383Q634 60 636 57 641 46 701 46 726 46 726 36 726 34 723 22 720 7 718 4T704 0Q701 0 690 0T651 1 578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260 413 259Q516 259 516 260Z"/></g><g data-mml-node="mi" transform="translate(750,0)"><path data-c="1D448" d="M107 637Q73 637 71 641 70 643 70 649 70 673 81 682 83 683 98 683 139 681 234 681 268 681 297 681T342 682 362 682Q378 682 378 672 378 670 376 658 371 641 366 638H364Q362 638 359 638T352 638 343 637 334 637Q295 636 284 634T266 623Q265 621 238 518T184 302 154 169Q152 155 152 140 152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606 599 633 535 637 511 637 511 648 511 650 513 660 517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672 767 650 759 642 756 637 737 637 666 633 648 597 646 592 598 404 557 235 548 205 515 105 433 42T263-22Q171-22 116 34T60 167V183Q60 201 115 421 164 622 164 628 164 635 107 637Z"/></g><g data-mml-node="mi" transform="translate(1517,0)"><path data-c="1D436" d="M50 252Q50 367 117 473T286 641 490 704Q580 704 633 653 642 643 648 636T656 626L657 623Q660 623 684 649 691 655 699 663T715 679 725 690L740 705H746Q760 705 760 698 760 694 728 561 692 422 692 421 690 416 687 415T669 413H653Q647 419 647 422 647 423 648 429T650 449 651 481Q651 552 619 605T510 659Q484 659 454 652T382 628 299 572 226 479Q194 422 175 346T156 222Q156 108 232 58 280 24 350 24 441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248 648 243 647 239 618 132 523 55T319-22Q206-22 128 53T50 252Z"/></g><g data-mml-node="mo" transform="translate(2554.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347 722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153 722 140 707 133H70Q56 140 56 153Z"/></g><g data-mml-node="mfrac" transform="translate(3610.6,0)"><g data-mml-node="mrow" transform="translate(220,778.2)"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533 999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709 186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149-187Q149-188 362-188 388-188 436-188T506-189Q679-189 778-162T936-43Q946-27 959 6H999L913-249 489-250Q65-250 62-248 56-246 56-239 56-234 118-161 186-81 245-11L428 206Q428 207 242 462L57 717 56 728Q56 744 61 748Z"/></g><g data-mml-node="mi" transform="translate(1222.7,0)"><path data-c="1D43C" d="M43 1Q26 1 26 10 26 12 29 24 34 43 39 45 42 46 54 46H60Q120 46 136 53 137 53 138 54 143 56 149 77T198 273Q210 318 216 344 286 624 286 626 284 630 284 631 274 637 213 637H193Q184 643 189 662 193 677 195 680T209 683H213Q285 681 359 681 481 681 487 683H497Q504 676 504 672T501 655 494 639Q491 637 471 637 440 637 407 634 393 631 388 623 381 609 337 432 326 385 315 341 245 65 245 59 245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2 143 2 113 2T65 2 43 1Z"/></g><g data-mml-node="mo" transform="translate(1726.7,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/></g><g data-mml-node="msub" transform="translate(2115.7,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="TeXAtom" transform="translate(675,-176.7) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">正</text></g><g data-mml-node="mi" transform="translate(1000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">样</text></g><g data-mml-node="mi" transform="translate(2000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">本</text></g></g></g><g data-mml-node="mo" transform="translate(4962,0)"><path data-c="2C" d="M78 35T78 60 94 103 137 121Q165 121 187 96T210 8Q210-27 201-60T180-117 154-158 130-185 117-194Q113-194 104-185T95-172Q95-168 106-156T131-126 157-76 173-3V9L172 8Q170 7 167 6T161 3 152 1 140 0Q113 0 96 17Z"/></g><g data-mml-node="msub" transform="translate(5406.7,0)"><g data-mml-node="mi"><path data-c="1D443" d="M287 628Q287 635 230 637 206 637 199 638T192 648Q192 649 194 659 200 679 203 681T397 683Q587 682 600 680 664 669 707 631T751 530Q751 453 685 389 616 321 507 303 500 302 402 301H307L277 182Q247 66 247 59 247 55 248 54T255 50 272 48 305 46H336Q342 37 342 35 342 19 335 5 330 0 319 0 316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11 33 13 36 25 40 41 44 43T67 46Q94 46 127 49 141 52 146 61 149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597 609 619 560 635Q553 636 480 637 463 637 445 637T416 636 404 636Q391 635 386 627 384 621 367 550T332 412 314 344Q314 342 395 342H407 430Q542 342 590 392 617 419 631 471T645 554Z"/></g><g data-mml-node="TeXAtom" transform="translate(675,-176.7) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">负</text></g><g data-mml-node="mi" transform="translate(1000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">样</text></g><g data-mml-node="mi" transform="translate(2000,0)"><text data-variant="normal" transform="scale(1,-1)" font-size="884px" font-family="serif">本</text></g></g></g><g data-mml-node="mo" transform="translate(8253,0)"><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z"/></g></g><g data-mml-node="mrow" transform="translate(2960.3,-686)"><g data-mml-node="mi"><path data-c="1D440" d="M289 629Q289 635 232 637 208 637 201 638T194 648Q194 649 196 659 197 662 198 666T199 671 201 676 203 679 207 681 212 683 220 683 232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117 510 154Q534 190 574 254T662 394Q837 673 839 675 840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673 1051 668 1048 656T1045 643Q1041 637 1008 637 968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50 822 48 855 46H886Q892 37 892 35 892 19 885 5 880 0 869 0 864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11 592 13 594 25 598 41 602 43T625 46Q652 46 685 49 699 52 704 61 706 65 742 207T813 490 848 631L654 322Q458 10 453 5 451 4 449 3 444 0 433 0 418 0 415 7 413 11 374 317L335 624 267 354Q200 88 200 79 206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1 274 0 267 0 265 0 255 0T221 1 157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46 135 46 154 86 158 92 223 354T289 629Z"/></g><g data-mml-node="mo" transform="translate(1273.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9 604 9 587 25T493 118L389 222 284 117Q178 13 175 11 171 9 168 9 160 9 154 15T147 29Q147 36 161 51T255 146L359 250 255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489 178 487 284 383L389 278 493 382Q570 459 587 475T609 491Q630 491 630 471 630 464 620 453T522 355L418 250 522 145Q606 61 618 48T630 29Z"/></g><g data-mml-node="mi" transform="translate(2273.4,0)"><path data-c="1D441" d="M234 637Q231 637 226 637 201 637 196 638T191 649Q191 676 202 682 204 683 299 683 376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606 723 633 659 637 635 637 635 648 635 650 637 660 641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672 888 650 880 642 878 637 858 637 787 633 769 597L620 7Q618 0 599 0 585 0 582 2 579 5 453 305L326 604 261 344Q196 88 196 79 201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2 123 2 100 2T63 2 46 1Q31 1 31 10 31 14 34 26T39 40Q41 46 62 46 130 49 150 85 154 91 221 362L289 634Q287 635 234 637Z"/></g></g><rect width="8842" height="60" x="120" y="220"/></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -1357.1 1 2214.2"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:6" transform="translate(0,578.9)"><text data-id-align="true"/><g data-idbox="true" transform="translate(0,-750)"><g data-mml-node="mtext"><path data-c="28" d="M94 250Q94 319 104 381T127 488 164 576 202 643 244 695 277 729 302 750H315 319Q333 750 333 741 333 738 316 720T275 667 226 581 184 443 167 250 184 58 225-81 274-167 316-220 333-241Q333-250 318-250H315 302L274-226Q180-141 137-14T94 250Z"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601 351 623 311 626 240 626 194 566 147 500 147 364L148 360Q153 366 156 373 197 433 263 433H267Q313 433 348 414 372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149 440 90 387 34T253-22Q225-22 199-14T143 16 92 75 56 172 42 313ZM257 397Q227 397 205 380T171 335 154 278 148 216Q148 133 160 97T198 39Q222 21 251 21 302 21 329 59 342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(389,0)"/><path data-c="29" d="M60 749 64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12 224-76 186-143 145-194 113-227 90-246Q87-249 86-250H74Q66-250 63-250T58-247 55-238Q56-237 66-225 221-64 221 250T66 725Q56 737 55 738 55 746 60 749Z" transform="translate(889,0)"/></g></g></g></g></svg></g></g></g></g></svg></mjx-container><br>其中,</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992541062/202082151944.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992541062/202082151944.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="推荐质量评价指标AUC"></p></div><div class="story post-story"><h2 id="实验过程"><a href="#实验过程" class="headerlink" title="实验过程"></a>实验过程</h2><h3 id="数据预处理"><a href="#数据预处理" class="headerlink" title="数据预处理"></a>数据预处理</h3><p><strong>artist_data.txt</strong> 文件</p><p>数据最终处理成以逗号分割</p><p><strong>artist_data.txt</strong> 文件</p><p>两列之间的间隔有的是空格有的是 Tab,第二列数据中包含空格</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992773903/202082145015.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992773903/202082145015.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="第二列数据中包含空格"></p><p>因第二列数据中含有逗号和空格,数据最终处理成以 Tab 分割</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992810226/20208214518.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992810226/20208214518.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="数据最终处理成以Tab分割"></p><p>去除第一列不是数字的行</p><p><strong>artist_alias.txt</strong> <strong>文件</strong></p><p>将拼写错误的艺术家 ID 或 ID 变体对应到该艺术家的规范 ID</p><p>两列之间的间隔有的是空格有的是 Tab</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992843714/202082145144.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992843714/202082145144.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="两列之间的间隔有的是空格有的是Tab"></p><p>包含数据缺失的列</p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992871540/20208214526.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992871540/20208214526.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="包含数据缺失的列"></p><p>在数据处理时对拼写错误 ID 进行映射,用别名数据集将所有的艺术家 ID 转换成正规 ID。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">aa={}</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/artist_alias.txt"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> line = f.readline()</span><br><span class="line"> <span class="keyword">while</span> line:</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(line.split())==<span class="number">2</span>:</span><br><span class="line"> aa[line.split()[<span class="number">0</span>]]=line.split()[<span class="number">1</span>]</span><br><span class="line"> line = f.readline()</span><br><span class="line"></span><br><span class="line">f3=<span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/user_artist_data.txt.data"</span>,<span class="string">"w+"</span>)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/user_artist_data.txt"</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> line = f2.readline()</span><br><span class="line"> <span class="keyword">while</span> line:</span><br><span class="line"> it=line.split()</span><br><span class="line"> <span class="keyword">if</span> it[<span class="number">1</span>] <span class="keyword">in</span> aa:</span><br><span class="line"> it[<span class="number">1</span>]=aa[it[<span class="number">1</span>]]</span><br><span class="line"> <span class="built_in">print</span>(it[<span class="number">0</span>]+<span class="string">","</span>+it[<span class="number">1</span>]+<span class="string">","</span>+it[<span class="number">2</span>],file=f3)</span><br><span class="line"> line = f2.readline()</span><br><span class="line">f3.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">f5=<span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/artist_data.txt.data"</span>,<span class="string">"w+"</span>)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/artist_data.txt"</span>) <span class="keyword">as</span> f4:</span><br><span class="line"> line = f4.readline()</span><br><span class="line"> <span class="keyword">while</span> line:</span><br><span class="line"> it=line.split()</span><br><span class="line"> s=<span class="string">""</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(it)):</span><br><span class="line"> s+=it[i]</span><br><span class="line"> <span class="keyword">if</span> i==<span class="number">0</span>:</span><br><span class="line"> s+=<span class="string">" "</span></span><br><span class="line"> <span class="keyword">elif</span> i==<span class="built_in">len</span>(it)-<span class="number">1</span>:</span><br><span class="line"> s+=<span class="string">""</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> s+=<span class="string">" "</span></span><br><span class="line"> <span class="built_in">print</span>(s,file=f5)</span><br><span class="line"> line = f4.readline()</span><br><span class="line"></span><br><span class="line">f7=<span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/artist_data.txt.data2"</span>,<span class="string">"w+"</span>)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"/export/work/F/1/data/artist_data.txt.data"</span>) <span class="keyword">as</span> f6:</span><br><span class="line"> line = f6.readline()</span><br><span class="line"> <span class="keyword">while</span> line:</span><br><span class="line"> it=line.split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> a=<span class="built_in">int</span>(it[<span class="number">0</span>])</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">str</span>(a)+<span class="string">" "</span>+it[<span class="number">1</span>],file=f7,end=<span class="string">""</span>)</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> line = f6.readline()</span><br></pre></td></tr></tbody></table></figure><p><strong>预处理后得到的数据集</strong></p><p><strong>artist_data</strong></p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992906605/202082145243.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992906605/202082145243.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="artist_data"></p><p><strong>user_artist_data</strong></p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992933044/202082145314.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992933044/202082145314.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="user_artist_data"></p><h3 id="获取数据文件,并上传至HDFS"><a href="#获取数据文件,并上传至HDFS" class="headerlink" title="获取数据文件,并上传至HDFS"></a>获取数据文件,并上传至 HDFS</h3><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992959556/202082145341.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992959556/202082145341.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="获取数据文件,并上传至HDFS"></p><p><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651992991812/20208214544.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651992991812/20208214544.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="获取数据文件,并上传至HDFS"></p><h3 id="读入数据,转换成DataFrame备用"><a href="#读入数据,转换成DataFrame备用" class="headerlink" title="读入数据,转换成DataFrame备用"></a>读入数据,转换成 DataFrame 备用</h3><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> Row</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StructType</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StructField</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.types <span class="keyword">import</span> StringType,IntegerType</span><br><span class="line"><span class="keyword">from</span> pyspark.conf <span class="keyword">import</span> SparkConf</span><br><span class="line"><span class="keyword">from</span> pyspark <span class="keyword">import</span> SparkContext</span><br><span class="line"><span class="keyword">from</span> pyspark.sql.session <span class="keyword">import</span> SparkSession</span><br><span class="line"><span class="comment"># 转换成DataFrame</span></span><br><span class="line">name1=[<span class="string">"user"</span>, <span class="string">"item"</span>, <span class="string">"rating"</span>]</span><br><span class="line">name2=[<span class="string">"id"</span>,<span class="string">"name"</span>]</span><br><span class="line"></span><br><span class="line">conf = SparkConf().setAppName(<span class="string">"applicaiton"</span>).<span class="built_in">set</span>(<span class="string">"spark.executor.heartbeatInterval"</span>,<span class="string">"500000"</span>).<span class="built_in">set</span>(<span class="string">"spark.network.timeout"</span>,<span class="string">"500000"</span>)</span><br><span class="line">sc = SparkContext.getOrCreate(conf)</span><br><span class="line">spark = SparkSession(sc)</span><br><span class="line">uaRDD = sc.textFile(<span class="string">"/1/user_artist_data.txt.data"</span>)</span><br><span class="line">fields = <span class="built_in">list</span>(<span class="built_in">map</span>( <span class="keyword">lambda</span> fieldName : StructField(fieldName, IntegerType(), nullable = <span class="literal">True</span>), name1))</span><br><span class="line">schema = StructType(fields)</span><br><span class="line">rowRDD = uaRDD.<span class="built_in">map</span>(<span class="keyword">lambda</span> line : line.split(<span class="string">","</span>)).<span class="built_in">map</span>(<span class="keyword">lambda</span> attr : Row(<span class="built_in">int</span>(attr[<span class="number">0</span>]),<span class="built_in">int</span>(attr[<span class="number">1</span>]),<span class="built_in">int</span>(attr[<span class="number">2</span>])))</span><br><span class="line">uaDF = spark.createDataFrame(rowRDD, schema)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aRDD = sc.textFile(<span class="string">"/1/artist_data.txt.data2"</span>)</span><br><span class="line">fields = <span class="built_in">list</span>(<span class="built_in">map</span>( <span class="keyword">lambda</span> fieldName : StructField(fieldName, IntegerType(), nullable = <span class="literal">True</span>) <span class="keyword">if</span> fieldName==<span class="string">"id"</span> <span class="keyword">else</span> StructField(fieldName, StringType(), nullable = <span class="literal">True</span>) , name2))</span><br><span class="line">schema = StructType(fields)</span><br><span class="line">rowRDD =aRDD.<span class="built_in">map</span>(<span class="keyword">lambda</span> line : line.split(<span class="string">" "</span>)).<span class="built_in">map</span>(<span class="keyword">lambda</span> attr : Row(<span class="built_in">int</span>(attr[<span class="number">0</span>]),attr[<span class="number">1</span>]))</span><br><span class="line">aDF = spark.createDataFrame(rowRDD, schema)</span><br></pre></td></tr></tbody></table></figure><h3 id="展示数据格式基本统计信息"><a href="#展示数据格式基本统计信息" class="headerlink" title="展示数据格式基本统计信息"></a>展示数据格式基本统计信息</h3><p>数据格式</p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">uaDF.show()</span><br><span class="line"></span><br><span class="line">+-------+-------+------+</span><br><span class="line">| user| item|rating|</span><br><span class="line">+-------+-------+------+</span><br><span class="line">|1000002| 1| 55|</span><br><span class="line">|1000002|1000006| 33|</span><br><span class="line">|1000002|1000007| 8|</span><br><span class="line">|1000002|1000009| 144|</span><br><span class="line">|1000002|1000010| 314|</span><br><span class="line">|1000002|1000013| 8|</span><br><span class="line">|1000002|1000014| 42|</span><br><span class="line">|1000002|1000017| 69|</span><br><span class="line">|1000002|1000024| 329|</span><br><span class="line">|1000002|1000025| 1|</span><br><span class="line">|1000002|1000028| 17|</span><br><span class="line">|1000002|1000031| 47|</span><br><span class="line">|1000002|1000033| 15|</span><br><span class="line">|1000002|1000042| 1|</span><br><span class="line">|1000002|1000045| 1|</span><br><span class="line">|1000002|1000054| 2|</span><br><span class="line">|1000002|1000055| 25|</span><br><span class="line">|1000002|1000056| 4|</span><br><span class="line">|1000002|1000059| 2|</span><br><span class="line">|1000002|1000062| 71|</span><br><span class="line">+-------+-------+------+</span><br><span class="line">only showing top 20 rows</span><br></pre></td></tr></tbody></table></figure><h3 id="基本统计信息"><a href="#基本统计信息" class="headerlink" title="基本统计信息"></a>基本统计信息</h3><p><strong>用户数</strong></p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">a=uaDF.select(uaDF.user).distinct().count()</span><br><span class="line">print(a)</span><br><span class="line"></span><br><span class="line">148111</span><br></pre></td></tr></tbody></table></figure><p><strong>艺术家数目</strong></p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">b=uaDF.select(uaDF.item).distinct().count()</span><br><span class="line">print(b)</span><br><span class="line"></span><br><span class="line">1568126</span><br></pre></td></tr></tbody></table></figure><p><strong>每用户平均播放次数</strong></p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">uaDF.drop("item").groupBy("user").agg({"rating":"mean"}).show()</span><br><span class="line"></span><br><span class="line">+-------+------------------+</span><br><span class="line">| user| avg(rating)|</span><br><span class="line">+-------+------------------+</span><br><span class="line">|1000190|55.355432780847146|</span><br><span class="line">|1001043|6.0131578947368425|</span><br><span class="line">|1001129| 12.32748538011696|</span><br><span class="line">|1001139| 8.652557319223986|</span><br><span class="line">|1002431|12.833333333333334|</span><br><span class="line">|1002605|3.5392670157068062|</span><br><span class="line">|1004666| 9.79409594095941|</span><br><span class="line">|1005158|1.9245283018867925|</span><br><span class="line">|1005439|28.333333333333332|</span><br><span class="line">|1005697|11.733333333333333|</span><br><span class="line">|1005853| 2.5|</span><br><span class="line">|1007007| 2.443396226415094|</span><br><span class="line">|1007847|14.333333333333334|</span><br><span class="line">|1008081|31.232876712328768|</span><br><span class="line">|1008233| 90.0|</span><br><span class="line">|1008804| 9.0|</span><br><span class="line">|1009408| 4.666666666666667|</span><br><span class="line">|1012261|3.2887640449438202|</span><br><span class="line">|1015587| 9.46|</span><br><span class="line">|1016416| 8.241935483870968|</span><br><span class="line">+-------+------------------+</span><br><span class="line">only showing top 20 rows</span><br></pre></td></tr></tbody></table></figure><p><strong>每艺术家平均播放次数</strong></p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">uaDF.drop("user").groupBy("item").agg({"rating":"mean"}).show()</span><br><span class="line"></span><br><span class="line">+-------+------------------+</span><br><span class="line">| item| avg(rating)|</span><br><span class="line">+-------+------------------+</span><br><span class="line">|1001129|10.578309692671395|</span><br><span class="line">|1003373|2.3333333333333335|</span><br><span class="line">|1007972|18.156831042845596|</span><br><span class="line">|1029443| 20.54196642685851|</span><br><span class="line">|1076507| 2.969264544456641|</span><br><span class="line">|1318111|5.6902654867256635|</span><br><span class="line">| 833| 9.483282674772036|</span><br><span class="line">|1239413| 3.821794871794872|</span><br><span class="line">|1000636| 2.0|</span><br><span class="line">|1002431|1.7142857142857142|</span><br><span class="line">|1005697| 3.5|</span><br><span class="line">|1040360| 1.0|</span><br><span class="line">|1043263|1.9166666666666667|</span><br><span class="line">|1245208|19.613390928725703|</span><br><span class="line">| 463| 34.3479262672811|</span><br><span class="line">|1043126|14.580645161290322|</span><br><span class="line">|1001601| 3.573529411764706|</span><br><span class="line">|1091589| 2.5|</span><br><span class="line">|1004021| 6.96403785488959|</span><br><span class="line">|1012885| 4.744927536231884|</span><br><span class="line">+-------+------------------+</span><br><span class="line">only showing top 20 rows</span><br></pre></td></tr></tbody></table></figure><h3 id="构建ALS模型"><a href="#构建ALS模型" class="headerlink" title="构建ALS模型"></a>构建 ALS 模型</h3><p>构建 ALS 模型,并记录所耗时间。初始参数:Rank 10, maxiter 15, RegParm 0.01 Alpha 1.0。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pyspark.ml.recommendation <span class="keyword">import</span> ALS,ALSModel</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line">als = ALS(rank=<span class="number">10</span>,maxIter=<span class="number">15</span>,regParam=<span class="number">0.01</span>,alpha=<span class="number">1.0</span>,seed=<span class="built_in">int</span>(random.random()*<span class="number">100</span>))</span><br><span class="line">model=als.fit(uaDF)</span><br><span class="line">end = time.time()</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"时间:"</span>+<span class="built_in">str</span>(end-start))</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">时间:<span class="number">785.1817960739136</span></span><br></pre></td></tr></tbody></table></figure><p>这样我们就构建了一个 ALSModel 模型。</p><p>模型用两个不同的 DataFrame,它们分别表示 “用户 - 特征” 和 “产品 - 特征” 这两个大型矩阵。</p><h3 id="检查推荐结果"><a href="#检查推荐结果" class="headerlink" title="检查推荐结果"></a>检查推荐结果</h3><p>依据构建的模型,选择部分 ID 检查推荐结果。</p><p>看看模型给出的艺术家推荐直观上是否合理,检查一下用户播放过的艺术家,然后看看模型向用户推荐的艺术家。具体来看看用户 2093760 的例子。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">userID = <span class="number">2093760</span></span><br><span class="line">a=uaDF.rdd.<span class="built_in">filter</span>(<span class="keyword">lambda</span> x:x[<span class="number">0</span>]==userID).collect()</span><br></pre></td></tr></tbody></table></figure><p>查看用户输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[</span><br><span class="line">Row(user=<span class="number">2093760</span>, item=<span class="number">1180</span>, rating=<span class="number">1</span>), </span><br><span class="line">Row(user=<span class="number">2093760</span>, item=<span class="number">1255340</span>, rating=<span class="number">3</span>), </span><br><span class="line">Row(user=<span class="number">2093760</span>, item=<span class="number">378</span>, rating=<span class="number">1</span>), </span><br><span class="line">Row(user=<span class="number">2093760</span>, item=<span class="number">813</span>, rating=<span class="number">2</span>), </span><br><span class="line">Row(user=<span class="number">2093760</span>, item=<span class="number">942</span>, rating=<span class="number">7</span>)</span><br><span class="line">] </span><br></pre></td></tr></tbody></table></figure><p>获取艺术家 ID:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">artistid=[]</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> a:</span><br><span class="line"> artistid.append(i.item)</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[<span class="number">1180</span>, <span class="number">1255340</span>, <span class="number">378</span>, <span class="number">813</span>, <span class="number">942</span>] </span><br></pre></td></tr></tbody></table></figure><p>要提取该用户收听过的艺术家 ID 并打印他们的名字,这意味着先在输入数据中搜索该用户收听过的艺术家的 ID,然后用这些 ID 对艺术家集合进行过滤,这样我们就可以获取并按序打印这些艺术家的名字:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">b=aDF.rdd.<span class="built_in">filter</span>(**<span class="keyword">lambda</span>** x: x[<span class="number">0</span>] **<span class="keyword">in</span>** artistid).collect() </span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">[Row(<span class="built_in">id</span>=<span class="number">1180</span>, name=<span class="string">'David Gray'</span>), </span><br><span class="line"></span><br><span class="line">Row(<span class="built_in">id</span>=<span class="number">378</span>, name=<span class="string">'Blackalicious'</span>), </span><br><span class="line"></span><br><span class="line">Row(<span class="built_in">id</span>=<span class="number">813</span>, name=<span class="string">'Jurassic 5'</span>), </span><br><span class="line"></span><br><span class="line">Row(<span class="built_in">id</span>=<span class="number">1255340</span>, name=<span class="string">'The Saw Doctors'</span>), </span><br><span class="line"></span><br><span class="line">Row(<span class="built_in">id</span>=<span class="number">942</span>, name=<span class="string">'Xzibit'</span>)] </span><br></pre></td></tr></tbody></table></figure><p>用户播放过的艺术家既有大众流行音乐风格的也有嘻哈风格的。</p><p> 使用 Spark2.4.6 自带的 recommendForUserSubset 方法,对所有艺术家评分,并返回向用户 2093760 推荐其中分值最高的前 5 位。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">d=sc.parallelize([(<span class="number">2093760</span>,<span class="number">1</span>)]).toDF([<span class="string">'user'</span>]) </span><br><span class="line"></span><br><span class="line">t=model.recommendForUserSubset(d,<span class="number">5</span>) </span><br><span class="line"></span><br><span class="line">t.show() </span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">+-------+--------------------+ </span><br><span class="line">| user| recommendations|</span><br><span class="line">+-------+--------------------+</span><br><span class="line">|<span class="number">2093760</span>|[[<span class="number">6674945</span>, <span class="number">4997.0</span>...|</span><br><span class="line">+-------+--------------------+</span><br></pre></td></tr></tbody></table></figure><p>遍历打印一下:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">t.select(<span class="string">"recommendations"</span>).rdd.foreach(**<span class="keyword">lambda</span>** x:**<span class="built_in">print</span>**(x)) </span><br></pre></td></tr></tbody></table></figure><p>输出:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">Row(recommendations=[</span><br><span class="line"> Row(item=<span class="number">6674945</span>, rating=<span class="number">4997.056640625</span>), </span><br><span class="line"> Row(item=<span class="number">1170225</span>, rating=<span class="number">1805.596435546875</span>), </span><br><span class="line"> Row(item=<span class="number">1153293</span>, rating=<span class="number">1753.0908203125</span>), </span><br><span class="line"> Row(item=<span class="number">6730413</span>, rating=<span class="number">1233.61767578125</span>), </span><br><span class="line"> Row(item=<span class="number">183</span>, rating=<span class="number">1169.90234375</span>)</span><br><span class="line">])</span><br></pre></td></tr></tbody></table></figure><p>结果全部是嘻哈风格。能看出,这些推荐都不怎么样。虽然推荐的艺术家都受人欢迎,但好像并没有针对用户的收听习惯进行个性化。</p><h3 id="训练-验证切分"><a href="#训练-验证切分" class="headerlink" title="训练-验证切分"></a>训练 - 验证切分</h3><p>训练 - 验证切分,采用初始参数,重新训练模型。</p><p>为了利用输入数据,需要把它分成训练集和验证集。训练集只用于训练 ALS 模型,验证集用于评估模型。这里将 90% 的数据用于训练,剩余的 10% 用于交叉验证:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">train,test=uaDF.randomSplit([<span class="number">0.9</span>,<span class="number">0.1</span>])</span><br><span class="line">als = ALS(rank=<span class="number">10</span>,maxIter=<span class="number">15</span>,regParam=<span class="number">0.01</span>,alpha=<span class="number">1.0</span>,seed=<span class="built_in">int</span>(random.random()*<span class="number">100</span>),implicitPrefs=<span class="literal">True</span>)</span><br><span class="line">model=als.fit(train)</span><br><span class="line">train.cache()</span><br><span class="line">test.cache()</span><br></pre></td></tr></tbody></table></figure><h3 id="计算AUC"><a href="#计算AUC" class="headerlink" title="计算AUC"></a>计算 AUC</h3><p>接受一个交叉验证集和一个预测函数,交叉验证集代表每个用户对应的 “正面的” 或 “好的” 艺术家。预测函数把每个包含 “用户 - 艺术家” 对的 DataFrame 转换为一个同时包含 “用户 - 艺术家” 和 “预测” 的 DataFrame,“预测” 表示 “用户” 与 “艺术家” 之间关联的强度值,这个值越高,代表推荐的排名越高。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">allArtistIDs = uaDF.select(<span class="string">"item"</span>).distinct().collect()</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> numpy</span><br><span class="line">allArtistID = []</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(allArtistIDs)):</span><br><span class="line"> allArtistID.append(allArtistIDs[i][<span class="string">"item"</span>])</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f</span>(<span class="params">a,b</span>):</span><br><span class="line"> posItemIDSet = <span class="built_in">set</span>(<span class="built_in">list</span>(b))</span><br><span class="line"> negative = []</span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> (i < <span class="built_in">len</span>(allArtistID)) <span class="keyword">and</span> (<span class="built_in">len</span>(negative) < <span class="built_in">len</span>(posItemIDSet)):</span><br><span class="line"> artistID = allArtistID[numpy.random.randint(<span class="number">1</span>, high=<span class="built_in">len</span>(allArtistID), size=<span class="literal">None</span>, dtype=<span class="string">'l'</span>)]</span><br><span class="line"> <span class="keyword">if</span> artistID <span class="keyword">not</span> <span class="keyword">in</span> posItemIDSet:</span><br><span class="line"> negative.append(artistID)</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> s=<span class="built_in">list</span>()</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> negative:</span><br><span class="line"> s.append((a,i))</span><br><span class="line"> <span class="keyword">return</span> s</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算AUC</span></span><br><span class="line"><span class="keyword">import</span> pyspark.sql.functions <span class="keyword">as</span> func</span><br><span class="line"><span class="keyword">def</span> <span class="title function_">areaUnderCurve</span>(<span class="params">positiveData,allArtistIDs,predictFunction</span>):</span><br><span class="line"> positivePredictions = predictFunction(positiveData.select(<span class="string">"user"</span>, <span class="string">"item"</span>)).withColumnRenamed(<span class="string">"prediction"</span>, <span class="string">"positivePrediction"</span>)</span><br><span class="line"> negativeDatatmp = positiveData.select(<span class="string">"user"</span>, <span class="string">"item"</span>).rdd.groupByKey().<span class="built_in">map</span>(<span class="keyword">lambda</span> x: f(x[<span class="number">0</span>],x[<span class="number">1</span>])).collect()</span><br><span class="line"> negativeDatalist=[]</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> negativeDatatmp:</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> i:</span><br><span class="line"> negativeDatalist.append(j) </span><br><span class="line"> negativeData=spark.createDataFrame(negativeDatalist,[<span class="string">'user'</span>,<span class="string">'item'</span>])</span><br><span class="line"> negativePredictions = predictFunction(negativeData.select(<span class="string">"user"</span>, <span class="string">"item"</span>)).withColumnRenamed(<span class="string">"prediction"</span>, <span class="string">"negativePrediction"</span>)</span><br><span class="line"> joinedPredictions = positivePredictions.join(negativePredictions, <span class="string">"user"</span>).select(<span class="string">"user"</span>, <span class="string">"positivePrediction"</span>, <span class="string">"negativePrediction"</span>)</span><br><span class="line"> allCounts = joinedPredictions.groupBy(<span class="string">"user"</span>).agg(func.count(func.lit(<span class="number">1</span>)).alias(<span class="string">"total"</span>)).select(<span class="string">"user"</span>, <span class="string">"total"</span>)</span><br><span class="line"> correctCounts = joinedPredictions.<span class="built_in">filter</span>(joinedPredictions[<span class="string">"positivePrediction"</span>] > joinedPredictions[<span class="string">"negativePrediction"</span>]).groupBy(<span class="string">"user"</span>).agg(func.count(<span class="string">"user"</span>).alias(<span class="string">"correct"</span>)).select(<span class="string">"user"</span>, <span class="string">"correct"</span>)</span><br><span class="line"> meanAUCtemp = allCounts.join(correctCounts, <span class="string">"user"</span>, <span class="string">"left_outer"</span>)</span><br><span class="line"> meanAUC = meanAUCtemp.select(<span class="string">"user"</span>, (meanAUCtemp[<span class="string">"correct"</span>] / meanAUCtemp[<span class="string">"total"</span>]).alias(<span class="string">"auc"</span>)).agg(func.mean(<span class="string">"auc"</span>)).first()</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> joinedPredictions.unpersist()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"> <span class="keyword">return</span> meanAUC</span><br><span class="line"> </span><br><span class="line">mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"><span class="built_in">print</span>(mostListenedAUC)</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">Row(avg(auc)=<span class="number">0.9098560946043145</span>) </span><br></pre></td></tr></tbody></table></figure><p>有必要把上述方法和一个更简单方法做一个基准比对。举个例子,考虑下面的推荐方法:向每个用户推荐播放最多的艺术家。这个策略一点儿都不个性化,但它很简单,也可能有效。定义这个简单预测函数并评估它的 AUC 得分:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">predictMostListened</span>(<span class="params">data</span>):</span><br><span class="line"> listenCounts = train.groupBy(<span class="string">"item"</span>).agg({<span class="string">"rating"</span>:<span class="string">"sum"</span>}).withColumnRenamed(<span class="string">"sum(rating)"</span>, <span class="string">"prediction"</span>).select(<span class="string">"item"</span>, <span class="string">"prediction"</span>)</span><br><span class="line"> uaDF.join(listenCounts, [<span class="string">"item"</span>], <span class="string">"left_outer"</span>).select(<span class="string">"user"</span>, <span class="string">"item"</span>, <span class="string">"prediction"</span>)</span><br><span class="line"> listenCounts = uaDF.groupBy(<span class="string">"item"</span>).agg({<span class="string">"rating"</span>:<span class="string">"sum"</span>}).withColumnRenamed(<span class="string">"sum(rating)"</span>, <span class="string">"prediction"</span>).select(<span class="string">"item"</span>, <span class="string">"prediction"</span>)</span><br><span class="line"> <span class="keyword">return</span> data.join(listenCounts, [<span class="string">"item"</span>], <span class="string">"left_outer"</span>).select(<span class="string">"user"</span>, <span class="string">"item"</span>, <span class="string">"prediction"</span>)</span><br><span class="line">mostListenedAUC = areaUnderCurve(test, allArtistIDs, predictMostListened)</span><br><span class="line"><span class="built_in">print</span>(mostListenedAUC)</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">Row(avg(auc)=<span class="number">0.9578054887285846</span>) </span><br></pre></td></tr></tbody></table></figure><p>结果得分大约是 0.96。这意味着,对 AUC 这个指标,非个性化的推荐表现已经不错了。然而,我们想要的是得分更高,也就是更为 “个性化” 的推荐。显然这个模型还有待改进。调整超参数,使推荐结果更合理。</p><h3 id="选择超参数"><a href="#选择超参数" class="headerlink" title="选择超参数"></a>选择超参数</h3><p>Rank 可选(5,30)RegParam 可选(4.0,0.0001),alpha 可选(1.0,40.0)。合计 8 种参数组合。</p><p>可以把 rank、regParam 和 alpha 看作模型的超参数。(maxIter 更像是对分解过程使用的资源的一种约束。)这些值不会体现在 ALSModel 的内部矩阵中,这些矩阵只是参数,其值由算法选定。超参数则是构建过程本身的参数。</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">TrainALS</span>(<span class="params">rank,regParam,alpha,<span class="built_in">dir</span></span>):</span><br><span class="line"> als = ALS(rank=rank,maxIter=<span class="number">15</span>,regParam=regParam,alpha=alpha,seed=<span class="built_in">int</span>(random.random()*<span class="number">100</span>),implicitPrefs=<span class="literal">True</span>)</span><br><span class="line"> model=als.fit(train)</span><br><span class="line"> model.save(<span class="string">"/model/ALS/Try2/"</span>+<span class="built_in">str</span>(<span class="built_in">dir</span>))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> model.userFactors.unpersist()</span><br><span class="line"> model.itemFactors.unpersist()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></tbody></table></figure><p> 构建模型</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">dir</span>=<span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> rank <span class="keyword">in</span> [<span class="number">5</span>,<span class="number">30</span>]:</span><br><span class="line"> <span class="keyword">for</span> regParam <span class="keyword">in</span> [<span class="number">4.0</span>,<span class="number">0.0001</span>]:</span><br><span class="line"> <span class="keyword">for</span> alpha <span class="keyword">in</span> [<span class="number">1.0</span>,<span class="number">40.0</span>]:</span><br><span class="line"> <span class="built_in">dir</span>=<span class="built_in">dir</span>+<span class="number">1</span></span><br><span class="line"> TrainALS(rank,regParam,alpha,<span class="built_in">dir</span>)</span><br></pre></td></tr></tbody></table></figure><p>加载模型计算 AUC 得分:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/1"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">5</span>,<span class="number">4.0</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">5</span>,<span class="number">4.0</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/2"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">5</span>,<span class="number">4.0</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">5</span>,<span class="number">4.0</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/3"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">5</span>,<span class="number">0.0001</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">5</span>,<span class="number">0.0001</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/4"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">5</span>,<span class="number">0.0001</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">5</span>,<span class="number">0.0001</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/5"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">30</span>,<span class="number">4.0</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">30</span>,<span class="number">4.0</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/6"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">30</span>,<span class="number">4.0</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">30</span>,<span class="number">4.0</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/7"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">30</span>,<span class="number">0.0001</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">30</span>,<span class="number">0.0001</span>,<span class="number">1.0</span>)))</span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> model=ALSModel.load(<span class="string">"/model/ALS/Try2/8"</span>)</span><br><span class="line"> mostListenedAUC = areaUnderCurve(test, allArtistIDs, model.transform)</span><br><span class="line"> <span class="built_in">print</span>((mostListenedAUC,(<span class="number">30</span>,<span class="number">0.0001</span>,<span class="number">40.0</span>)))</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>((<span class="string">"ERROR"</span>,(<span class="number">30</span>,<span class="number">0.0001</span>,<span class="number">40.0</span>)))</span><br></pre></td></tr></tbody></table></figure><p>输出结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">(Row(avg(auc)=<span class="number">0.9122637924972641</span>), (<span class="number">5</span>, <span class="number">4.0</span>, <span class="number">1.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9154223563144587</span>), (<span class="number">5</span>, <span class="number">4.0</span>, <span class="number">40.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9057761909633262</span>), (<span class="number">5</span>, <span class="number">0.0001</span>, <span class="number">1.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9146676967584815</span>), (<span class="number">5</span>, <span class="number">0.0001</span>, <span class="number">40.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9230010545570864</span>), (<span class="number">30</span>, <span class="number">4.0</span>, <span class="number">1.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9275148741094371</span>), (<span class="number">30</span>, <span class="number">4.0</span>, <span class="number">40.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9125799456221803</span>), (<span class="number">30</span>, <span class="number">0.0001</span>, <span class="number">1.0</span>))</span><br><span class="line">(Row(avg(auc)=<span class="number">0.9265221600644649</span>), (<span class="number">30</span>, <span class="number">0.0001</span>, <span class="number">40.0</span>))</span><br></pre></td></tr></tbody></table></figure><p>可以看出 rank=30,regParam=4.0,alpha=40.0 时取得了最优的结果 avg (auc)=0.9275148741094371.</p><p>虽然这些值的绝对差很小,但对于 AUC 值来说,仍然具有一定的意义。有意思的是,参数 alpha 取 40 的时候看起来总是比取 1 表现好。这说明了模型在强调用户听过什么时的表现要比强调用户没听过什么时要好。</p><h3 id="产生推荐"><a href="#产生推荐" class="headerlink" title="产生推荐"></a>产生推荐</h3><p>选取 10 个用户展示推荐结果</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">model=ALSModel.load(<span class="string">"/model/ALS/Try2/6"</span>)</span><br><span class="line">d=sc.parallelize([(<span class="number">2093760</span>,<span class="number">1</span>),(<span class="number">1000002</span>,<span class="number">1</span>),(<span class="number">1006277</span>,<span class="number">1</span>),(<span class="number">1006282</span>,<span class="number">1</span>),(<span class="number">1006283</span>,<span class="number">1</span>),(<span class="number">1006285</span>,<span class="number">1</span>),(<span class="number">1041207</span>,<span class="number">1</span>),(<span class="number">1071489</span>,<span class="number">1</span>),(<span class="number">2025005</span>,<span class="number">1</span>),(<span class="number">2025007</span>,<span class="number">1</span>),]).toDF([<span class="string">'user'</span>])</span><br><span class="line">t=model.recommendForUserSubset(d,<span class="number">5</span>)</span><br><span class="line">t.select(<span class="string">"recommendations"</span>).rdd.foreach(<span class="keyword">lambda</span> x:<span class="built_in">print</span>(x))</span><br></pre></td></tr></tbody></table></figure><p>输出推荐结果:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">Row(recommendations=[Row(item=<span class="number">1010991</span>, rating=<span class="number">1.1815389394760132</span>), Row(item=<span class="number">1245226</span>, rating=<span class="number">1.139704942703247</span>), Row(item=<span class="number">4629</span>, rating=<span class="number">1.1092422008514404</span>), Row(item=<span class="number">1113701</span>, rating=<span class="number">1.1066040992736816</span>), Row(item=<span class="number">1019715</span>, rating=<span class="number">1.10056471824646</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1010921</span>, rating=<span class="number">1.225757122039795</span>), Row(item=<span class="number">1166169</span>, rating=<span class="number">1.1972994804382324</span>), Row(item=<span class="number">1183949</span>, rating=<span class="number">1.184556007385254</span>), Row(item=<span class="number">1082446</span>, rating=<span class="number">1.178223729133606</span>), Row(item=<span class="number">3892</span>, rating=<span class="number">1.1580229997634888</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1028958</span>, rating=<span class="number">1.146733283996582</span>), Row(item=<span class="number">1086774</span>, rating=<span class="number">1.1434733867645264</span>), Row(item=<span class="number">1037761</span>, rating=<span class="number">1.1272671222686768</span>), Row(item=<span class="number">1184419</span>, rating=<span class="number">1.1093372106552124</span>), Row(item=<span class="number">1148170</span>, rating=<span class="number">1.1065270900726318</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1010295</span>, rating=<span class="number">1.2554553747177124</span>), Row(item=<span class="number">3722</span>, rating=<span class="number">1.2187168598175049</span>), Row(item=<span class="number">1024674</span>, rating=<span class="number">1.2044183015823364</span>), Row(item=<span class="number">1009445</span>, rating=<span class="number">1.099776268005371</span>), Row(item=<span class="number">1018746</span>, rating=<span class="number">1.0894378423690796</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1002068</span>, rating=<span class="number">0.9575374126434326</span>), Row(item=<span class="number">1005288</span>, rating=<span class="number">0.9533681273460388</span>), Row(item=<span class="number">2430</span>, rating=<span class="number">0.9476644992828369</span>), Row(item=<span class="number">1002270</span>, rating=<span class="number">0.9428261518478394</span>), Row(item=<span class="number">3909</span>, rating=<span class="number">0.9334102869033813</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1034635</span>, rating=<span class="number">0.606441080570221</span>), Row(item=<span class="number">1000107</span>, rating=<span class="number">0.6010327935218811</span>), Row(item=<span class="number">1000024</span>, rating=<span class="number">0.59807950258255</span>), Row(item=<span class="number">4154</span>, rating=<span class="number">0.5966558456420898</span>), Row(item=<span class="number">1000157</span>, rating=<span class="number">0.5944067239761353</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1034635</span>, rating=<span class="number">0.290438175201416</span>), Row(item=<span class="number">930</span>, rating=<span class="number">0.2857869565486908</span>), Row(item=<span class="number">4267</span>, rating=<span class="number">0.2853849530220032</span>), Row(item=<span class="number">1205</span>, rating=<span class="number">0.2830250561237335</span>), Row(item=<span class="number">1000113</span>, rating=<span class="number">0.2829856276512146</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1002909</span>, rating=<span class="number">1.2324668169021606</span>), Row(item=<span class="number">1653</span>, rating=<span class="number">1.1938585042953491</span>), Row(item=<span class="number">988</span>, rating=<span class="number">1.1880080699920654</span>), Row(item=<span class="number">1003367</span>, rating=<span class="number">1.1807997226715088</span>), Row(item=<span class="number">1009545</span>, rating=<span class="number">1.1761128902435303</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1017017</span>, rating=<span class="number">0.8724791407585144</span>), Row(item=<span class="number">1032349</span>, rating=<span class="number">0.8424116373062134</span>), Row(item=<span class="number">1028433</span>, rating=<span class="number">0.8259942531585693</span>), Row(item=<span class="number">1240603</span>, rating=<span class="number">0.8185747265815735</span>), Row(item=<span class="number">1029602</span>, rating=<span class="number">0.8147093653678894</span>)])</span><br><span class="line">Row(recommendations=[Row(item=<span class="number">1013187</span>, rating=<span class="number">1.2516499757766724</span>), Row(item=<span class="number">1098360</span>, rating=<span class="number">1.2394661903381348</span>), Row(item=<span class="number">1289948</span>, rating=<span class="number">1.2353206872940063</span>), Row(item=<span class="number">1129243</span>, rating=<span class="number">1.2332189083099365</span>), Row(item=<span class="number">1245184</span>, rating=<span class="number">1.1997216939926147</span>)])</span><br></pre></td></tr></tbody></table></figure><p>按照用户顺序将最喜欢的推荐结果输出到文件</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">getp</span>(<span class="params">x</span>):</span><br><span class="line"> f=<span class="built_in">open</span>(<span class="string">"/export/work/result"</span>,<span class="string">"a+"</span>)</span><br><span class="line"> <span class="built_in">print</span>(x,file=f)</span><br><span class="line">u=uaDF.select(<span class="string">"user"</span>).distinct()</span><br><span class="line">t=model.recommendForUserSubset(u,<span class="number">1</span>)</span><br><span class="line">t.rdd.foreach(<span class="keyword">lambda</span> x:getp(x))</span><br></pre></td></tr></tbody></table></figure><p>推荐输出详见 result 文件,以下为部分推荐输出:</p><figure class="highlight python"><table><tbody><tr><td class="code"><pre><span class="line">Row(user=<span class="number">1000092</span>, recommendations=[Row(item=<span class="number">1002400</span>, rating=<span class="number">1.2386927604675293</span>)]) </span><br><span class="line">Row(user=<span class="number">1000144</span>, recommendations=[Row(item=<span class="number">5221</span>, rating=<span class="number">1.1728830337524414</span>)]) </span><br><span class="line">Row(user=<span class="number">3175</span>, recommendations=[Row(item=<span class="number">1022207</span>, rating=<span class="number">0.282743901014328</span>)]) </span><br><span class="line">Row(user=<span class="number">1000164</span>, recommendations=[Row(item=<span class="number">1034635</span>, rating=<span class="number">0.36578264832496643</span>)]) </span><br><span class="line">Row(user=<span class="number">7340</span>, recommendations=[Row(item=<span class="number">1007903</span>, rating=<span class="number">0.8722475171089172</span>)]) </span><br></pre></td></tr></tbody></table></figure></div></div><div class="footer"></div><div class="article-meta" id="bottom"><div class="new-meta-box"></div></div><div class="prev-next"><a class="prev" href="/notes/Spark/streaming-kafka"><p class="title"><i class="fa-solid fa-chevron-left" aria-hidden="true"></i>SparkStreaming 整合 Kafka</p><p class="content"> Streaming & Kafka SparkStreaming 整合 Kafka SparkStreaming 整合 Kafkakafka 的两个重要版本 Kafka-0...</p></a><a class="next" href="/notes/Spark/k-means"><p class="title">基于K均值聚类的网络流量异常检测(pyspark)<i class="fa-solid fa-chevron-right" aria-hidden="true"></i></p><p class="content"> K-Means 基于 K 均值聚类的网络流量异常检测 (pyspark) 异常检测常用于检测欺诈、网络攻击、服务器及传感设备故障。在这些应用中,我们要能够找出以前从未见过的新型异常,如...</p></a></div><div class="recommended-article"><div class="recommended-article-header"><i class="fa-solid fa-bookmark fa-fw" aria-hidden="true"></i> <span>推荐阅读</span></div><div class="recommended-article-group"> <a class="recommended-article-item" href="/p/110850a/" title="手把手教你用 Python 开始第一个机器学习项目" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/7.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/7.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="手把手教你用 Python 开始第一个机器学习项目"> <span class="title">手把手教你用 Python 开始第一个机器学习项目</span></a> <a class="recommended-article-item" href="/notes/Spark/k-means.html" title="基于K均值聚类的网络流量异常检测(pyspark)" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/19.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/19.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="基于K均值聚类的网络流量异常检测(pyspark)"> <span class="title">基于K均值聚类的网络流量异常检测(pyspark)</span></a> <a class="recommended-article-item" href="/p/48f700eb/" title="BERT 预训练模型及其应用案例" rel="bookmark"><img src="https://static.mhuig.top/npm/mhgoos@0.0.1651974150318/2020116102430.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/mhgoos@0.0.1651974150318/2020116102430.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="BERT 预训练模型及其应用案例"> <span class="title">BERT 预训练模型及其应用案例</span></a> <a class="recommended-article-item" href="/notes/Spark/rdd.html" title="Spark RDD 编程" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/45.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/45.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Spark RDD 编程"> <span class="title">Spark RDD 编程</span></a> <a class="recommended-article-item" href="/notes/51/temperature-humidity.html" title="AT89S52 或 STC89C52RC 串口发送温湿度数据" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/13.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/13.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="AT89S52 或 STC89C52RC 串口发送温湿度数据"> <span class="title">AT89S52 或 STC89C52RC 串口发送温湿度数据</span></a> <a class="recommended-article-item" href="/p/f0765214/" title="特征向量和特征值的几何本质" rel="bookmark"><img src="https://static.mhuig.top/npm/imbox@0.0.15/c/111.webp" class="lazyload" data-srcset="https://static.mhuig.top/npm/imbox@0.0.15/c/111.webp" srcset="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="特征向量和特征值的几何本质"> <span class="title">特征向量和特征值的几何本质</span></a></div></div></article><article class="post white-box shadow floatable blur" id="comments"><span hidden><meta itemprop="discussionUrl" content="/notes/Spark/als#comments"></span><p ct><i class="fa-duotone fa-comments"></i> 留言区</p><div id="layoutHelper-comments"></div></article></div><aside id="l_side" itemscope itemtype="http://schema.org/WPSideBar"><section class="widget text desktop mobile pjax"><header><a href="/notes/"><i class="fa-duotone fa-book fa-fw" aria-hidden="true"></i> <span class="name">Notes</span></a></header><div class="content"></div></section><section class="widget list group desktop mobile pjax"><header><i class="fa-duotone fa-comet fa-fw" aria-hidden="true"></i> <span class="name">Spark</span></header><div class="content"><ul class="list entry navigation"><li><a class="flat-box" title="/notes/Spark/" href="/notes/Spark/" active-action="action-notesSpark"><div class="name"> Welcome</div></a></li><li><a class="flat-box" title="/notes/Spark/env" href="/notes/Spark/env" active-action="action-notesSparkenv"><div class="name"> Environment Deployment</div></a></li><li><a class="flat-box" title="/notes/Spark/rdd" href="/notes/Spark/rdd" active-action="action-notesSparkrdd"><div class="name"> RDD</div></a></li><li><a class="flat-box" title="/notes/Spark/streaming" href="/notes/Spark/streaming" active-action="action-notesSparkstreaming"><div class="name"> Streaming</div></a></li><li><a class="flat-box" title="/notes/Spark/streaming-kafka" href="/notes/Spark/streaming-kafka" active-action="action-notesSparkstreaming-kafka"><div class="name"> Kafka</div></a></li><li><a class="flat-box" title="/notes/Spark/als" href="/notes/Spark/als" active-action="action-notesSparkals"><div class="name"> ALS</div></a></li><li><a class="flat-box" title="/notes/Spark/k-means" href="/notes/Spark/k-means" active-action="action-notesSparkk-means"><div class="name"> K-Means</div></a></li></ul></div></section><div class="widget-sticky pjax"><section class="widget toc-wrapper desktop mobile" id="toc-div"><header><i class="fa-duotone fa-list fa-fw" aria-hidden="true"></i> <span class="name">本文目录</span></header><div class="content"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E9%9B%86"><span class="toc-text">数据集</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#user-artist-data-txt"><span class="toc-text">user_artist_data.txt</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#artist-data-txt"><span class="toc-text">artist_data.txt</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#artist-alias-txt"><span class="toc-text">artist_alias.txt</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%AE%97%E6%B3%95"><span class="toc-text">算法</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BA%A4%E6%9B%BF%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95-Alternating-Least-Squares%EF%BC%8CALS"><span class="toc-text">交替最小二乘推荐算法 (Alternating Least Squares,ALS)</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8E%A8%E8%8D%90%E8%B4%A8%E9%87%8F%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87AUC"><span class="toc-text">推荐质量评价指标 AUC</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AE%9E%E9%AA%8C%E8%BF%87%E7%A8%8B"><span class="toc-text">实验过程</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86"><span class="toc-text">数据预处理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E4%B8%8A%E4%BC%A0%E8%87%B3HDFS"><span class="toc-text">获取数据文件,并上传至 HDFS</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%AF%BB%E5%85%A5%E6%95%B0%E6%8D%AE%EF%BC%8C%E8%BD%AC%E6%8D%A2%E6%88%90DataFrame%E5%A4%87%E7%94%A8"><span class="toc-text">读入数据,转换成 DataFrame 备用</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B1%95%E7%A4%BA%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%E5%9F%BA%E6%9C%AC%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF"><span class="toc-text">展示数据格式基本统计信息</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%9F%BA%E6%9C%AC%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF"><span class="toc-text">基本统计信息</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%9E%84%E5%BB%BAALS%E6%A8%A1%E5%9E%8B"><span class="toc-text">构建 ALS 模型</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%A3%80%E6%9F%A5%E6%8E%A8%E8%8D%90%E7%BB%93%E6%9E%9C"><span class="toc-text">检查推荐结果</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%AE%AD%E7%BB%83-%E9%AA%8C%E8%AF%81%E5%88%87%E5%88%86"><span class="toc-text">训练 - 验证切分</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%AE%A1%E7%AE%97AUC"><span class="toc-text">计算 AUC</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%80%89%E6%8B%A9%E8%B6%85%E5%8F%82%E6%95%B0"><span class="toc-text">选择超参数</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BA%A7%E7%94%9F%E6%8E%A8%E8%8D%90"><span class="toc-text">产生推荐</span></a></li></ol></li></ol></div></section></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div><div class="pjax"></div></aside><pjax><script>window.pdata={},pdata.ispage=!1,pdata.commentPath="",pdata.commentPlaceholder="",pdata.commentConfig={};var l_header=document.getElementById("l_header");l_header.classList.add("show");var cover_wrapper=document.querySelector("#l_cover .cover-wrapper"),scroll_down=document.getElementById("scroll-down");cover_wrapper.id="none",cover_wrapper.style.display="none",scroll_down.style.display="none"</script></pjax></div><footer class="footer clearfix" itemscope itemtype="http://schema.org/WPFooter"><br><br><div class="aplayer-container"><div class="aplayer-local"></div></div><br><div class="social-wrapper" itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/atom.xml" class="social fa-duotone fa-rss flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://mhuig.top/contact/" class="social fa-duotone fa-envelope flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://github.com/MHuiG" class="social fa-brands fa-github flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a><a href="https://t.me/MHuiG" class="social fa-brands fa-telegram flat-btn" target="_blank" rel="external nofollow noopener noreferrer" itemprop="url"></a></div><div><p>博客内容遵循 <a target="_blank" rel="external nofollow noopener noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议</a></p></div><div class="copyright"><p><a href="https://icp.gov.moe" target="_blank" rel="external nofollow noopener noreferrer">萌ICP备</a> <a href="https://icp.gov.moe/?keyword=2020012138" target="_blank" rel="external nofollow noopener noreferrer">2020012138号</a><br><a target="_blank" rel="noopener" href="https://mhuig.top/">Copyright © Since 2018 MHuiG</a></p></div></footer><a id="s-top" class="fa-solid fa-arrow-up fa-fw" title="top"></a></div></div><div><script>volantis.dom.bodyAnchor=volantis.dom.$(document.getElementById("safearea")),volantis.dom.topBtn=volantis.dom.$(document.getElementById("s-top")),volantis.dom.wrapper=volantis.dom.$(document.getElementById("wrapper")),volantis.dom.coverAnchor=volantis.dom.$(document.querySelector("#l_cover .cover-wrapper")),volantis.dom.switcher=volantis.dom.$(document.querySelector("#l_header .switcher .s-search")),volantis.dom.header=volantis.dom.$(document.getElementById("l_header")),volantis.dom.search=volantis.dom.$(document.querySelector("#l_header .m_search")),volantis.dom.mPhoneList=volantis.dom.$(document.querySelectorAll("#l_header .m-phone .list-v"))</script><script>volantis.css("https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/libs/@fortawesome/fontawesome-pro/css/all.min.css")</script><script src="/js/app.js?v=196690b6a0"></script><script>const rootElement=document.documentElement,darkModeStorageKey="color-scheme",rootElementDarkModeAttributeName="color-scheme",setLS=(e,t)=>{localStorage.setItem(e,t)},removeLS=e=>{localStorage.removeItem(e)},getLS=e=>localStorage.getItem(e),getModeFromCSSMediaQuery=()=>window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light",resetRootDarkModeAttributeAndLS=()=>{rootElement.removeAttribute("color-scheme"),removeLS("color-scheme")},validColorModeKeys={dark:!0,light:!0},applyCustomDarkModeSettings=e=>{const t=e||getLS("color-scheme");getCustomDarkMode(),t===getModeFromCSSMediaQuery()?resetRootDarkModeAttributeAndLS():validColorModeKeys[t]?rootElement.setAttribute("color-scheme",t):resetRootDarkModeAttributeAndLS()},invertDarkModeObj={dark:"light",light:"dark"},getCustomDarkMode=()=>{let e=getLS("color-scheme");if(validColorModeKeys[e])e=invertDarkModeObj[e];else{if(null!==e)return;e=invertDarkModeObj[getModeFromCSSMediaQuery()]}volantis.dark.mode="dark"==e?"light":"dark"},toggleCustomDarkMode=()=>{let e=getLS("color-scheme");if(validColorModeKeys[e])e=invertDarkModeObj[e];else{if(null!==e)return;e=invertDarkModeObj[getModeFromCSSMediaQuery()]}return setLS("color-scheme",e),e};function bindToggleButton(){document.querySelectorAll("#wrapper .toggle-mode-btn,#rightmenu-wrapper .toggle-mode-btn").forEach((function(e){volantis.dom.$(e).on("click",volantis.dark.toggle)}))}volantis.dark.toggle=()=>{const e=toggleCustomDarkMode();applyCustomDarkModeSettings(e),volantis.dark.method.toggle.start()},applyCustomDarkModeSettings(),document.addEventListener("DOMContentLoaded",(()=>{volantis.requestAnimationFrame(bindToggleButton)})),volantis.pjax.push(bindToggleButton);const darkModelListeners={dark:e=>{e.matches&&(volantis.dark.mode="dark"),volantis.dark.method.toggle.start()},light:e=>{e.matches&&(volantis.dark.mode="light"),volantis.dark.method.toggle.start()}};window.matchMedia("(prefers-color-scheme: dark)").addListener(darkModelListeners.dark),window.matchMedia("(prefers-color-scheme: light)").addListener(darkModelListeners.light)</script><script>function loadIssuesJS(){null!=document.getElementById("sites-api")&&"undefined"==typeof SitesJS&&volantis.js("/js/plugins/tags/sites.js?v=a7e55dacdf");null!=document.getElementById("friends-api")&&"undefined"==typeof FriendsJS&&volantis.js("/js/plugins/tags/friends.js?v=187f37f894");null!=document.getElementById("contributors-api")&&"undefined"==typeof ContributorsJS&&volantis.js("/js/plugins/tags/contributors.js?v=16e248333a")}loadIssuesJS(),volantis.pjax.push((()=>{loadIssuesJS()}))</script><script defer="defer" src="https://cdn.bootcdn.net/ajax/libs/vanilla-lazyload/17.1.0/lazyload.min.js"></script><script>window.lazyLoadOptions={elements_selector:".lazyload",threshold:0},window.addEventListener("LazyLoad::Initialized",(function(n){window.lazyLoadInstance=n.detail.instance}),!1),document.addEventListener("DOMContentLoaded",(function(){lazyLoadInstance.update()})),document.addEventListener("pjax:complete",(function(){lazyLoadInstance.update()}))</script><script>window.FPConfig={delay:0,ignoreKeywords:["#"],maxRPS:6,hoverDelay:0}</script><script defer="defer" src="https://static.mhuig.top/npm/volantis-static@0.0.1660614606622/libs/flying-pages/flying-pages.min.js"></script><script type="text/javascript">function pjax_scrollrebeal(){ScrollReveal().reveal("#l_main .reveal",{distance:"32px",duration:"800",interval:"20",scale:"1",easing:"ease-out"})}function init_scrollrebeal(){"undefined"==typeof ScrollReveal?volantis.requestAnimationFrame(init_scrollrebeal):pjax_scrollrebeal()}volantis.js("https://cdn.bootcdn.net/ajax/libs/scrollReveal.js/4.0.9/scrollreveal.min.js"),document.addEventListener("DOMContentLoaded",init_scrollrebeal),volantis.pjax.push(pjax_scrollrebeal,"pjax_scrollrebeal",setRequestAnimationFrame=!1)</script><script>volantis.css("https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/aplayer/1.10.1/APlayer.min.js").then((()=>{document.querySelectorAll(".aplayer-local").forEach((e=>{new APlayer({container:e,fixed:!1,order:"list",volume:"0.7",autoplay:!1,loop:"all",theme:"#1BCDFC",listMaxHeight:"320px",listFolded:"true",preload:"auto",lrcType:3,audio:[{name:"虹之间",artist:"钢琴版伴奏",url:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.mp3",lrc:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.lrc",cover:"https://blog.mhuig.top/music-Archive/BetweenTheRainbow.jpg"},{name:"Avem",artist:"Alan Walker",url:"https://blog.mhuig.top/music-Archive/Avem.mp3",lrc:"https://blog.mhuig.top/music-Archive/Avem.lrc",cover:"https://blog.mhuig.top/music-Archive/Avem.jpg"},{name:"Fly",artist:"Marshmello / Leau Culver",url:"https://blog.mhuig.top/music-Archive/fly.mp3",lrc:"https://blog.mhuig.top/music-Archive/fly.lrc",cover:"https://blog.mhuig.top/music-Archive/fly.jpg"},{name:"Alone",artist:"Marshmello",url:"https://blog.mhuig.top/music-Archive/alone.mp3",lrc:"https://blog.mhuig.top/music-Archive/alone.lrc",cover:"https://blog.mhuig.top/music-Archive/alone.jpg"}]})}))}))</script><script>function check_giscus(){return"dark"===volantis.dark.mode?volantis.giscus.Theme="dark":volantis.giscus.Theme="light",document.getElementById("giscus_container")}function pjax_giscus(){const t=check_giscus();if(!t)return;let s=Object.assign({theme:{light:"light",dark:"dark"},repo:"MHuiG/talk","repo-id":"MDEwOlJlcG9zaXRvcnkyODQ4NDg1NTg=",category:"Giscus","category-id":"DIC_kwDOEPpxrs4B_X67",mapping:"pathname","reactions-enabled":"1","emit-metadata":"1",lang:"zh-CN","input-position":"top"},pdata.commentConfig);const e=document.createElement("script");e.setAttribute("src","https://giscus.app/client.js"),Object.keys(s).forEach((t=>{"theme"!=t&&e.setAttribute("data-"+t,s[t])})),e.setAttribute("data-theme",volantis.giscus.Theme),e.setAttribute("crossorigin","anonymous"),t.appendChild(e)}function dark_giscus(){if(!check_giscus())return;const t={setConfig:{theme:volantis.giscus.Theme}};document.querySelector("iframe.giscus-frame").contentWindow.postMessage({giscus:t},"https://giscus.app")}volantis.layoutHelper("comments",'<div id="giscus_container"></div>'),volantis.giscus={},pjax_giscus(),volantis.pjax.push(pjax_giscus),volantis.dark.push(dark_giscus)</script><script>async function loadSearchScript(){return volantis.js("/js/search/hexo.js?v=e2a1e6a8d9");}function loadSearchService(){loadSearchScript(),document.querySelectorAll(".input.u-search-input").forEach((e=>{e.removeEventListener("focus",loadSearchService,!1)})),document.querySelectorAll(".u-search-form").forEach((e=>{e.addEventListener("submit",(e=>{e.preventDefault()}),!1)}))}function OpenSearch(e){"undefined"==typeof SearchService?loadSearchScript().then((()=>{SearchService.setQueryText(e),SearchService.search()})):(SearchService.setQueryText(e),SearchService.search())}if(window.location.search&&/^\?s=/g.test(window.location.search)){OpenSearch(decodeURI(window.location.search).replace(/\ /g,"-").replace(/^\?s=/g,""))}document.querySelectorAll(".input.u-search-input").forEach((e=>{e.addEventListener("focus",loadSearchService,!1)}))</script><script>function pjax_highlightjs_copyCode(){(document.querySelector(".highlight .code pre")||document.querySelector(".article pre code"))&&VolantisApp.utilCopyCode(".highlight .code pre, .article pre code")}volantis.requestAnimationFrame(pjax_highlightjs_copyCode),volantis.pjax.push(pjax_highlightjs_copyCode)</script><script>function load_swiper(){document.querySelectorAll(".swiper-container")[0]&&(volantis.css("https://cdn.bootcdn.net/ajax/libs/Swiper/8.3.2/swiper-bundle.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/Swiper/8.3.2/swiper-bundle.min.js").then((()=>{pjax_swiper()})))}function pjax_swiper(){volantis.swiper=new Swiper(".swiper-container",{slidesPerView:"auto",spaceBetween:8,centeredSlides:!0,loop:!0,pagination:{el:".swiper-pagination",clickable:!0},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"}})}load_swiper(),volantis.pjax.push((()=>{document.querySelectorAll(".swiper-container")[0]&&(void 0===volantis.swiper?load_swiper():pjax_swiper())}))</script><script>volantis.css("https://cdn.bootcdn.net/ajax/libs/pace/1.2.4/themes/blue/pace-theme-minimal.min.css"),volantis.js("https://cdn.bootcdn.net/ajax/libs/pace/1.2.4/pace.min.js").then((()=>{Pace.options.restartOnPushState=!1,volantis.pjax.send(Pace.restart),volantis.scroll.push((()=>{Pace.stop(),Pace.trigger("start"),Pace.bar.update(100*volantis.scroll.progress()),document.body.className=document.body.className.replaceAll("pace-running ","")}),"阅读进度")}))</script><pjax></pjax><script>function listenSidebarTOC(){const t=document.querySelectorAll(".toc li");if(!t.length)return;const e=[];Array.from(t).forEach((t=>{const n=t.querySelector(".toc-link"),i=document.getElementById(n.getAttribute("href")?decodeURI(n.getAttribute("href")).replace("#",""):n.getAttribute("toc-action").split("toc-")[1]);return e.push(i),n.getAttribute("href")&&(n.setAttribute("toc-action","toc-"+decodeURI(n.getAttribute("href")).replace("#","")),n.removeAttribute("href")),i&&i.id&&n.addEventListener("click",(t=>{t.preventDefault(),volantis.scroll.to(i,{addTop:5,observer:!0}),history.pushState(null,document.title,"#"+i.id)})),i}));function n(t){if(t.classList.contains("active-current"))return;document.querySelectorAll(".toc .active").forEach((t=>{t.classList.remove("active","active-current")})),t.classList.add("active","active-current");let e=t.parentNode;for(;!e.matches(".toc");)e.matches("li")&&e.classList.add("active"),e=e.parentNode}volantis.activateNavIndex=0,n(t[volantis.activateNavIndex]),e[0]&&volantis.scroll.push((()=>{if(e[0].getBoundingClientRect().top>=0)volantis.activateNavIndex=0;else if(e[e.length-1].getBoundingClientRect().top<0)volantis.activateNavIndex=e.length-1;else for(let t=0;t<e.length;t++){const n=e[t],i=e[(t+1)%e.length];if(n.getBoundingClientRect().top<0&&i.getBoundingClientRect().top>=0){volantis.activateNavIndex=t;break}}n(t[volantis.activateNavIndex])}))}document.addEventListener("DOMContentLoaded",(()=>{volantis.requestAnimationFrame(listenSidebarTOC)})),volantis.pjax.push(listenSidebarTOC)</script><script>try{let e=(e,t,n=2)=>Math.abs(e-t)<=n,t=(t,n)=>!e(t.width,n.width)||!e(t.height,n.height),n=new WeakMap,i=(e,i=e.getClientBoundingRect())=>{let o=n.get(e);o&&!t(o,i)||(n.set(e,i),e.style["contain-intrinsic-size"]=`${i.width}px ${i.height}px`)},o=new IntersectionObserver(((e,t)=>{e.forEach((e=>{i(e.target,e.boundingClientRect)}))}),{rootMargin:"500px 0px 500px 0px"}),r=new ResizeObserver(((e,t)=>{e.forEach((e=>{i(e.target,e.contentRect)}))})),s=e=>{let t=document.querySelectorAll(e);t.length&&(t.forEach((e=>{o.observe(e),r.observe(e)})),requestAnimationFrame((()=>{requestAnimationFrame((()=>{t[0].style["content-visibility"]="auto"}))})))},a=()=>{"content-visibility"in document.documentElement.style&&s(".post-story")};a(),volantis.pjax.push(a)}catch(e){console.log(e)}</script><script>document.onreadystatechange=function(){if("complete"==document.readyState){const{saveData:e,effectiveType:t}=navigator.connection||navigator.mozConnection||navigator.webkitConnection||{};("none"==getComputedStyle(document.querySelector("#safearea"),null).display||e||/2g/.test(t))&&(document.querySelectorAll(".reveal").forEach((function(e){e.style.opacity="1"})),document.querySelector("#safearea").style.display="block")}}</script><script type="application/ld+json">[{"@context":"http://schema.org","@type":"Organization","name":"MHuiG's Blog","url":"https://blog.mhuig.top/","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3","width":192,"height":192}},{"@context":"http://schema.org","@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3"},"url":"https://blog.mhuig.top/","sameAs":["https://github.com/MHuiG","https://twitter.com/iMHuiG","https://t.me/MHuiG","https://keybase.io/MHuiG"],"description":"「Be Yourself, Make a Difference.」"},{"@context":"http://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://blog.mhuig.top/","name":"MHuiG"}},{"@type":"ListItem","position":2,"item":{"@id":"https://blog.mhuig.top/categories/大数据/","name":"大数据"}},{"@type":"ListItem","position":2,"item":{"@id":"https://blog.mhuig.top/categories/大数据/Spark/","name":"Spark"}},{"@type":"ListItem","position":3,"item":{"@id":"https://blog.mhuig.top/notes/Spark/als.html","name":"基于Audioscrobbler数据集的音乐推荐(pyspark)"}}]},{"@context":"http://schema.org","@type":"WebSite","name":"MHuiG's Blog","url":"https://blog.mhuig.top/","keywords":"Blog, IT, BigData, MHuiG, @MHuiG, iMHuiG, 博客, 梦幻岛, Neverland, 技术博客","description":"MHuiG&#39;s Blog (MHuiG的博客) MHuiG&#39;s Neverland(MHuiG的梦幻岛) —— MHuiG(@MHuiG) 随便写写画画的地方 - 技术博客","author":{"@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3"},"url":"https://blog.mhuig.top/","description":"「Be Yourself, Make a Difference.」"},"publisher":{"@type":"Organization","name":"MHuiG's Blog","url":"https://blog.mhuig.top/","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3","width":192,"height":192}},"potentialAction":{"@type":"SearchAction","name":"Coco | The Cat of MHuiG","target":{"@type":"EntryPoint","urlTemplate":"https://blog.mhuig.top/havefun/Coco/?s={search_term_string}"},"query-input":"required name=search_term_string"}},{"@context":"http://schema.org","@type":"BlogPosting","headline":"基于Audioscrobbler数据集的音乐推荐(pyspark)","description":"基于Audioscrobbler数据集的音乐推荐(pyspark) 根据用户播放次数数据使用协同过滤算法完成音乐推荐。","inLanguage":"zh-CN","mainEntityOfPage":{"@type":"WebPage","@id":"https://blog.mhuig.top/notes/Spark/als"},"author":{"@type":"Person","name":"MHuiG","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3"},"url":"https://blog.mhuig.top/"},"publisher":{"@type":"Organization","name":"MHuiG's Blog","logo":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3","width":192,"height":192}},"url":"https://blog.mhuig.top/notes/Spark/als","wordCount":0,"datePublished":"2020-08-02T07:34:00.000Z","dateModified":"2022-05-10T02:09:00.000Z","articleSection":"大数据","keywords":"Spark,推荐系统,Data mining","image":{"@type":"ImageObject","url":"/lib/favicon/android-chrome-192x192.png?v=8bf02188e3","width":192,"height":192}}]</script><script src="https://cdn.bootcdn.net/ajax/libs/pjax/0.2.8/pjax.min.js"></script><script>var pjax;document.addEventListener("DOMContentLoaded",(function(){pjax=new Pjax({elements:'a[href]:not([href^="#"]):not([href="javascript:void(0)"]):not([pjax-fancybox]):not([onclick="return false;"]):not([onclick="return!1"]):not([target="_blank"]):not([target="view_window"]):not([href$=".xml"])',selectors:["head title","head meta[name=keywords]","head meta[name=description]","#l_main","#pjax-header-nav-list",".pjax","pjax"],cacheBust:!1,timeout:5e3})})),document.addEventListener("pjax:send",(function(e){try{var t=window.location.pathname,n=e.triggerElement.href,a=[""];""!=a[0]&&a.forEach((e=>{-1==t.indexOf(e)&&-1==n.indexOf(e)||(window.location.href=n)}))}catch(e){}volantis.pjax.method.send.start()})),document.addEventListener("pjax:complete",(function(){document.querySelectorAll("script[data-pjax], .pjax-reload script").forEach((e=>{const t=e.text||e.textContent||e.innerHTML||"",n=document.createElement("script");Object.keys(e.attributes).forEach((t=>{n.setAttribute(e.attributes[t].nodeName,e.attributes[t].nodeValue)})),t&&n.appendChild(document.createTextNode(t)),e.parentNode.replaceChild(n,e)})),volantis.pjax.method.complete.start()})),document.addEventListener("pjax:error",(function(e){"pjax"===volantis.debug?(console.error(e),console.log("pjax error: \n"+JSON.stringify(e))):(volantis.pjax.method.error.start(),window.location.href=e.triggerElement.href)}))</script></div><pjax> <a style="display:none" target="_blank" rel="external nofollow noopener noreferrer" href="https://bot-trap.mhuig.top/">Are You A Robot?</a></pjax><script>top.location!=self.location&&(top.location=self.location),"mhuig.github.io"==window.location.host||"localhost:4000"==window.location.host||/mhuig\.top$/.test(window.location.host)||/kix\.moe$/.test(window.location.host)||/mhuig/.test(window.location.host)||/ipfs/.test(window.location.host)||(window.location.href="https://blog.mhuig.top/")</script></body></html>