From d0c1f03c1bb7283b47663d814139184490ea35ac Mon Sep 17 00:00:00 2001 From: feger <marc.feger@hhu.de> Date: Thu, 30 Jan 2020 18:01:39 +0100 Subject: [PATCH] Refactor --- recommender.tex | 2 +- submission.pdf | Bin 454591 -> 454592 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/recommender.tex b/recommender.tex index e330ff7..090edf5 100644 --- a/recommender.tex +++ b/recommender.tex @@ -80,7 +80,7 @@ At the beginning, the matrices $\mathcal{P}, \mathcal{Q}$ are filled with \texti This approach is also called \textit{Funk-SVD} or \textit{SVD} in combination with section \ref{subsec:rmf} and \ref{subsec:bmf} \citep{Rendle19}. The algorithm shown above can also be extended. Thus procedures like in section \ref{subsec:amf} can be solved. The second method from section \ref{subsec:amf} is then also called \textit{SVD++}. A coherent \textit{SGD} approach was given by \citet{Kor11}. \subsubsection{Alternating Least Square} -The second method often used is \textit{alternating least square (ALS)}. In contrast to \textit{SGD}, the vectors $q_i, p_u$ are adjusted in \textit{two steps}. Since \textit{SGD} $q_i$ and $p_u$ are both unknown, this is a \textit{non-convex problem}. The idea of \textit{ALS} is to capture one of the two vectors and work with one unknown variable each. Thus the problem becomes \textit{quadratic} and can be solved optimally. For this purpose the matrix $\mathcal{P}$ is filled with \textit{random numbers} at the beginning. These should be as small as possible and can be generated by a \textit{gaussian-distribution}. Then $\mathcal{P}$ is recorded and all $q_i \in \mathcal{Q}$ are recalculated according to the \textit{least-square problem}. This step is then repeated in reverse order. \textit{ALS} terminated if a \textit{termination condition} such as the \textit{convergence} of the error is satisfied for both steps \citep{Zh08}. +The second method often used is \textit{alternating least square (ALS)}. In contrast to \textit{SGD}, the vectors $q_i, p_u$ are adjusted in \textit{two steps}. Since \textit{SGD} $q_i$ and $p_u$ are both unknown, this is a \textit{non-convex problem}. The idea of \textit{ALS} is to capture one of the two vectors and work with one unknown variable each. Thus the problem becomes \textit{quadratic} and can be solved optimally. For this purpose the matrix $\mathcal{P}$ is filled with \textit{random numbers} at the beginning. These should be as small as possible and can be generated by a \textit{gaussian-distribution}. Then $\mathcal{P}$ is recorded and all $q_i \in \mathcal{Q}$ are recalculated according to the \textit{least-square problem}. This step is then repeated in reverse order. \textit{ALS} terminates if a \textit{termination condition} such as the \textit{convergence} of the error is satisfied for both steps \citep{Zh08}. \subsubsection{Bayesian Learning} The third approach is known as \textit{bayesian learning}. With this approach the so-called \textit{gibbs-sampler} is often used. The aim is to determine the \textit{common distribution} of the vectors in $\mathcal{P}, \mathcal{Q}$. For this purpose the \textit{gibbs-sampler} is given an initialization of \textit{hyperparameters} to generate the \textit{initial distribution}. The \textit{common distribution} of the vectors $q_i \in \mathcal{Q}, p_u \in \mathcal{P}$ is approximated by the \textit{conditional probabilities}. The basic principle is to select a variable in a \textit{reciprocal way} and to generate a value dependent on the values of the other variable according to its \textit{conditional distribution}, with the other values remaining unchanged in each \textit{epoch}. diff --git a/submission.pdf b/submission.pdf index 07e416a844f6afd944bec38723c494246c7a9756..92cfba14b1cc037cc68daccd7e89d8fdfd0b31a0 100644 GIT binary patch delta 4645 zcmdmgU;4m(>4q(ge;FAqrzci3sZCd5Vzgl@2-}{-#CVFkK5k>njLp)YuU=l{!Ngyd z8&KY*QWSXPprzrB;tfes%qo}fH~F+$r4{Mx*JqtzEZY55L%n=<P-j{Al*exzB_np< zc_3ygP@#I@d%}8+B`g(39;_)(uG@O*SsU+~Jo6{3k6Nx|N;=@qv-oeXv9or+{lv|g z_cs(TcJXa|wW)Fa4Zr$LPwQ@*i2m78c6o}d^5jq7A3GVaf6^9-*9mR%49xD6(fqgN z@XeCDN@pAH=?GpEIDVS3OS|>dxjaT62I-&gf}ZY}Y0z=LH7d3FXMQ%j#l5nH$)cs4 z>9J>H{vFxo)EXC<!GAE5r*>cE{`jRm3#S%8^SWuA=Hig}ab`T1&%*uHhVe7?ua;I7 zncx4uwZ`nunwKmFJ=<h@VtO=o@Aj5#Skk)Y&D)^6MGL|&d<g#Sqh-jve|jW8qk6sd zg=sON#kn7&uBX4LVN-gy<=DR6nQz5ar%U-*-1Azz^?jlaTio4CZ9Ckx@1EUuYR=7& zX-nsNOnkNUz~Lp#C-Np1&G_>4*8%4Z6UFt*SD&4Iqj{&z*N)jG!3O)IV&}5edrA3C zIX6M_Xx{D_QH8JkRvnl;VcY7Hm3@5+Z@pD<wyLb(@hvCWwbuR1lsgQKhs)l@Z8er- zQnTKmmHo*<q14)JMZt`3SJrub`@OGQn@!?PrS)C!@W!oKenOM)pICOXD`bQBf>ig@ zyY_Fb5Q}6#AAEdo#nEk#riL=g#<{!fQxPuM*Yj=WwnsNk-k#+)VRoLDRn!8p*txpz zbZyTpIuiG5LTmj}_N@2YH$Kx@V|rk+y_xH)$jRR~-)FHeXa6WRU0!X|;isGLvir{d zetmt|>IFeoU5C5Ojanb8-3VP}@$TRg|D5l8=NE|VU3hy%+RL@Bd_Nu@&D(SG3EQ(u z#j^9$Z{=LS-W@klL;K7#w>>dS=Y-}7CrbP++%J7O&+y00pI6ej@3z*TUv{-CdfGS9 z&RKQJQ_q#h7;p+GExFs}QTIHw^ho#orL}t&F8jD{N8!A)Iq$b}M~Q6e((Sm(^>S0m zYX98tF2;ZMH#|D*ZNevez4j@$>G`N^gP4iI(>GtaI7_U5#f?eYysHg8jHWGK;q0}- z_4BF%^{xNr-<W&c*?L)!*2LVm;zH9a1sR3w-2{Ek9hj=%>+x&$<)d}Ct`wvQ`m^qh z6#r54_h0z;q7C=Y8@LuvT%@vh<*o;3!i*jUoBLE(?%J91Gydw{Zev&7%xxNzwj9`J zR%()T{o9faA$w(Fn@_YnNnyHib#t-0fU|pIJ>Rijli6mEMb^{@h`-t8*6B9==eq9# z{qIuey*m=BGrwF`W=7z3|I^%$KNvUIN33Xeb!1Y~^53><M_GRJ+NgDxj9v;wL@iO1 zE%Ec@j!Tqa`yaH*MQekk;-{DV@6A`;dm@^@y!KS`-y;e+JT;55y_Y?eot_}XC|@7H zK6`#y_;vogw~ebiP5+5}73bTw!9`)w;_Lj`$G$1Vm|e`xSom^<YvLYJz8br;;kQ^n zK424hA-Lz#C0^;|1<V#3gPHHm-^IFuZ)H^zvzEupH(qts|K^`sf9OodjFb8rmWOw% zOp$R6oA^yb{F;yF^s4T%Y3jYYwRv87#r^Yg>e<<+pRe6_q5P3Wuenx8S}CWs!-TgM zReW=PTfO|hkiWl;hySC5gJs)g=BICrqmP-`ysPw-s@$C?l6}Wwu|{@a!7SSVN0o)% zHh<*1S5Ht3jk&0Jp7rIINBSRQg|9EE?z_A8#HFg>R)?tkWrh05{tI3$IdJ_2XVG2B zU8gT8o^h&QGWmA3Mo)Rc0v;)Y;}acf_dQ$rq&HkB?LtKH0@**ewzMl8yD+iSw@IF5 z^;w^p>h+&CahDh?C0aP2IUhA?vAx&4<r^QB9t>OXL$$`-_0>e7V;T2f*PYq5=#JNH zJ;SoYPgqrBc70xxX%Tqp+;Xi~o}1Q~e0=<N{u0G4D!u>w`ZViL&G7TQViue9LNncC z*4mwlZ6!OVR?VBgHu=6qPA#`{vGUB2XBpdfz5cOUY31U3GFs(L&!&33l4#^rQulqi zzDUNHn^*6P$HjAXYt9$;dR<RSueoSC`-$zO6`MU?Y|wt+D7U)LSfD?{n4w5nY4tfy z_a|2@556kP-dP+ZeSGD@{q==Emz2kgZ=am>Y2u5ZaIK9W)_H8Hxp69Ss@L+MH+eT+ zX)QMsVD;X2<y7)fsh1pr>E>@X9oJfWo2O#_b_Un3Re~3|<+P_YEVO$6@~-;)-FjYu z_r2_->t@aQ*>Y=L)~m;Rg_Am7O_gTYU+vSXYyQ;Ytn|~*>qPkqD>vU(O3$rTs(){K zH7N7S&X-kf?~^wzj_;2=^VxcGTjT^rf2SRlPu*XBXPx|d$GaV@)8yZ`ZIJvuyZ_&Z zyr2(l{Cjs5OgdcnL+<{EY3H^k2mAK$#(r8n!}Y!8*OK+$mmIR$^K8M}wd$wyt>tCj zirsNgnU?Zs@s=;MFTFP9cYDlgWj^8K+*aEPmiom>5*pc&!pEmMuH~F0!*cOR?;PbD z4Kok)J(0Qhy)@56Xhy}HwW3N3<-eJ=Gru=KCYYaZdfZBe<$2A!sarzQ+}*4HnztoC zT64haMqluc-&|8J#WZghTRJx_aBf`q+3rf!s@O{gTi%4sp6R~e%u?s(Ut8+b0)HOo zYty=R>W;X3y$#E!7YW}gq*9Xq@$u<M7^?9^$Q9m9Tr2lp<&9gP?&+UNIfbh|VmDk` z&UyLdZ5_23rQ&Zhw;kTs=gcu%W!90pN!=Ppe#I&Oe315d&wSM>x4gZr{+*e>@9?LG zU)A4;oo%>rmN((M^1n5F4p*0b-7r1oQ0C{2qK!ruUu^yUZ+G1fdG}Nf!QHMeB)5eB zN_Z65=u|&3vF2%Yir1bAHZJ#0-k3g9j8V4!m)*Gte*UUSvoEaw<afHQGCkqhN{Ngr z?F2sVvc{rj0nzNj$GQSSN@=ou@l1*5<Cre?ul41#o<G;xBesA2yQPkO`+h6#^*{7Q zKQ(Gw=h@#Mt*(lm-*nG$j^;6i^CHP|tGkN6v@C3zqxS5{(Qp}!fDER`>*NZG*=KWF z7#~hs5vcc^Wp=8}zD*37?N=Q3tdEOau$IN}!G~q$VoQGB+8trU74beXd$~Z|i_UC= zL-PWD_}SmL;PJn@BQYa<*21dvyQ_V-->MSP_3{doPB85GlJ$OiyEvm+{k8UYD;VTz z%5s1H>2%Xq{hhiiZ_-w!;)%VJk1cKTGb_wWo`0&}#J0Fd{L~7jXNTB)dVHk$qlFUH zwXA9mdj2Tl_0d{dX08`gWi9+`@iqUKrAxPYK0MiX*>=ivnH4(QL=po2ZOPJGWuE#h z;F?U;vjwkqPdl*t1Cyusm-RnRMmbEkm0;u%Te(&`-GArmLs2WQh9sA^mldo`PJL-Q zJzj#btloF$@#))q?lWq9ouw&x-C@ldk87EqjQZa7Jq#?2J0rDa{#t9jZ)@Un>i%9< zdd{xp-|KMcfWm&;F1F{B_N{k4`S`&eJ8Rt;Z~b>{o;^S7FSGW|(7%FyyhW+H!a3!V z9&i2Iax}7U-?uB<eAaYcapab*EP=nz&YFD7rh~_#Xg9A+{k`314&2{S-g#ESAoW<} zlNXOt;~vZv*XPb}o?5!Czb)_)>;9=rTX$Eun|rF9e)dM??B^0on_tUh5?^+=v@A|P zCaHFO=KBXbT_q(Ym3MD_ncds+dcnr?PeS)?vQK^YXTKRAxBaOdQ`edrS_;fj_<z1! z@%2r0=H#kxGpl}d8?>#cf6e_-E;#)!k9Opd&*rH=7X9{JXHo4xDfOyjSi#+l-Lp>k zceCA<NN2fu`0wLQ7rVCn^j*K!^U15e*j10O{WZF-cXMUPe%lMn_NR#7FFu*)e&v<X zHqk8=SGug1Pd%5Xb&BziqUwg}_xyyJ)c*0DzicsoSAn6zrp(Kir%&!sbjy~ge=WJ? zvm4(zJ*9iCUC#SC@0J(dpX&QP&cd<!<K>_kv5e;Gm&)?_Ha|Obx+8#T&orK6tKV%n z@~vP}znzVY`IZyi?@TOrKk}NYvhRdr+ivbl*M&L0o|&BUw_1MPiqN-T)22Kwuqdkh zuys<}_T=(caXdeGn3Vq2wPt3d%@i#bFPc<u_}wb?!}T4`Jns()|Jre)VebPmYt3WL z%mT+d9<`M(xVpsptJ!xG8_s!G>khB*UovIuy_x@x$(2i-`F{ICe8B%@)r%XSKeu3i zzVpWS!|eyu>Yf+sskwdVy>mAvHoWt?r9fEI!akV}Lu>nN9py{e-y`BBKi}JDB>4Kh zDaV&(o|hCtzMIxPed^46Jm{>yEQ8r{k=Z)3S>KN`q*T|l{$<%#*q$ZL*q$ZL)Se~H z+@2-P(w-&Fx;;yp?eqy&3j;#~<LOpU*kmEh?J-Z-bXWt8oSco#%}fm}&0WpS%v@ZJ z-5gC#Oe`IZj7=?!O<i2=6l@48iPiT>%}X!IP%tzx0(W&(>s6<D=ZJ+$w4FEqf2JUp zTemza;nY&6g?BXfPTzJ%|7p-ES+CWKSv<#%%s6puhrvbO74x+pA38F1wy@bT3Fgjq zrg|wykF8J?6x($m;T+rl=c%8c%qf31-?Dh$^Esc}6P(X)PRNvu;0sGp6ghb4thv)( zQSmfI>6zYX3d-4Pvz@osvlVR;+jO&pJ7AKo(rnl82U%|v9%n6N|L|nTL?8Rv?9V2D zo%r#|B1V%*Unjqu>YKoLlR<K^mRM8TCPyRQ?W{UV(n^oJyN)Js-ZZ#x?Od)I;Z`;+ zXV$x-135<|H@z+iZ@N~sohv1{<n{rrO+QnvzgWkXeM0Kwx=U*vtRsbQiteh<K4`Ux zHD&tCb?nk7tWM}%e9NFeF;```N4fG1mutRdjd|)fe9ET0vAL_ep!<!?P0L-;2hBEp zPMKV?y;(Lz{N%YycR9-@X7Z`Mc*j=#D)zd}oQ1b}zfEc^nU%-?g0)s`lklwH&0<cI zqkbP`%)6#v;cn%4ji2p+f&|my1bGR@#Yzchoc#UoUY@u9>mKC?8WwDQ%(nS5b6A!) zv@J7yo&06$ubS!eU$ZIjL{@yAcdYzI&ePw!T&JIY&8AS#m7$wZc1Cy4XP2o9_q~*` z;4!(`zGLZvfbbW3OO_VBo|+;3(PUfnkE|_ryT8k2ovDzz&iJNh_5mU8?fb7><xSvq zxM<>*t*QI?qd3E55ktc=#y{P+8Ll0bWw`!GuOYFJ|G?@U;t9bnjW;qMZjY|Y*MD!p z@r_xtUPi$=MRJMip87eHTzk1*KVmEp$S~t${>xOW^vmT-=L_MB>Wlnc=2y(xI)VAy z>Wa2$S$0Wj{U%y_x->)swHAfAtn3I9T&m>dI;BfP)YJ}4hA-y%BeWxL>v3_7jL=!7 z<||CO&#)CAP}(5zVXtU${Km!MZ(dyG+8~tiJd63(`e#fcD~vYRe|=l^$>st>)|q&2 z<sDw-rYjtF-#l;b#9{VlPv7i0@>io4^yb)J*mfo7+g<Id6=lY`?Y9m`>15A;*0g!` z50M>bT6G<wuZAt)&9c6*ZHw@mO>2Iyl-nh}z~O4<&0D)q-I%6jHf0ri&bBvq7i?XS zJ41gJIM(JcUbQn|n(-}*r+z_5>48nw<xQ#oZ68$MUsIpY@hfi4YCgtmVWmu8BFnO4 z4qGrqREk=K{hem}TOlI1$}8NTu~Vg1ZOylD?Yj=#3=aI9btlU>@TN)v=hDI`^|jw# zKi{=rQ4I5$_|mzaDSJbwul@F5W8O@*aGm#6%TBsQU%#c#$Y%+HMiy7gr@wg1X3NMq zUF{v4Tz!`R^ei(AlewmkJ6`U1Xr=Jfo2^9c^@eBrmgu`nf#7lG<1*Kqj>;UDN#9<| zQke1~?zHspuW>bnDn7HC?V`@4EVA+3d~D{M8ILQTirn*OI#amhBj<wuT3RmxPlxxv z`uJm#$xVr8$Jf++n7psUOTBB3M$x5u(cDW*pW6O^Ay#kWkufn!SH4zGN4`2z{FcuA z7XjT|%S@;F*M;o2`ni46sZT50vjQ);I101+ikQ6g?>Wc%w{+ox&L*|D=S56PBkh8( z%{TwNYu=`-pWfStbzfR0JMDh``ns?G-k&Oq+W2Tql!)cqjf=i|Zdmlz^;+&xb$z$1 z$w$-wuezFjRQ#4%aL|0w`}YD?-|uptzsfWr)z@2>H|l0&aQ2B)C*!Y3ZTqxV{>rWN zr*HGNx~=*1%yjFD%0)&mr%bK?C-I}-lK%`l?*c)SM%J)@h2{}I!}EX0dl)X9Jbl`G QHU&;2BQ8}{SARDy02Kk?w*UYD delta 4707 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 -- GitLab