From ea9669213ae78141573874611b8e321c1a3fa752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Ramnel=C3=B6v?= <felra653@student.liu.se> Date: Thu, 5 Dec 2024 15:53:01 +0100 Subject: [PATCH] Lab 2: Testing for assignment 3 --- lab2/assignment1.R | 6 +++-- lab2/assignment2.R | 3 ++- lab2/assignment3.R | 43 +++++++++++++++++++++++++++------ lab2/figures/assignment3-4.eps | 15 ++++++------ lab2/figures/assignment3-4.png | Bin 4865 -> 4892 bytes 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/lab2/assignment1.R b/lab2/assignment1.R index 4923521..b706dd3 100644 --- a/lab2/assignment1.R +++ b/lab2/assignment1.R @@ -44,9 +44,11 @@ lambda_with_k_features = function(x_train, y_train, alpha, k = 3) { lambda_values <- fit_train$lambda - num_non_zero <- apply(coef_matrix != 0, 2, sum) # sum of num of cols wit non zero coeff, i.e. number of features + # sum of num of cols wit non zero coeff, i.e. number of features + num_non_zero <- apply(coef_matrix != 0, 2, sum) - lambda_values[num_non_zero == k] # lambda value with k non zero coeff, i.e. number of features + # lambda value with k non zero coeff, i.e. number of features + lambda_values[num_non_zero == k] } diff --git a/lab2/assignment2.R b/lab2/assignment2.R index c903977..f1c95f1 100644 --- a/lab2/assignment2.R +++ b/lab2/assignment2.R @@ -149,7 +149,8 @@ accuracy <- function(x, x_pred) { } F1 <- function(x, x_pred) { - return(2 * precision(x, x_pred) * recall(x, x_pred) / (precision(x, x_pred) + recall(x, x_pred))) + return(2 * precision(x, x_pred) * recall(x, x_pred) / (precision(x, x_pred) + + recall(x, x_pred))) } y_hat4 <- predict(optimal_tree, newdata = test, type = "class") diff --git a/lab2/assignment3.R b/lab2/assignment3.R index 291fa3f..6441e7a 100644 --- a/lab2/assignment3.R +++ b/lab2/assignment3.R @@ -67,9 +67,8 @@ test = data[-id, ] scaler3 <- preProcess(train) -train_scaled<- predict(scaler3, train) +train_scaled <- predict(scaler3, train) -test_scaled <- test test_scaled <- predict(scaler3, test) X_train <- train_scaled[, feature_column_names] @@ -99,17 +98,45 @@ test_errors <- c() cost_function <- function(theta) { train_error <- MSE(y_train, as.matrix(X_train) %*% theta) + + + return(train_error) +} + +theta <- rep(0, ncol(X_train)) + +# res <- optim( +# par = theta, +# fn = cost_function, +# method = "BFGS", +# control = list(trace = 1, maxit = 200, REPORT = 1), +# ) + +for (i in 1:5000) { + + print(i) + res <- optim( + par = theta, + fn = cost_function, + method = "BFGS", + control = list(maxit = 1), + ) + + print(res$value) + + theta <- res$par + test_error <- MSE(y_test, as.matrix(X_test) %*% theta) - train_errors <<- c(train_errors, train_error) + train_errors <<- c(train_errors, res$value) test_errors <<- c(test_errors, test_error) - return(train_error) + if (res$convergence == 0) { + break + } } -res <- optim(par = rep(0, ncol(X_train)), - fn = cost_function, - method = "BFGS",) +res$counts range <- c(train_errors[501:length(train_errors)], test_errors[501:length(test_errors)]) @@ -122,7 +149,7 @@ plot( main = "Training and Test Errors over Iterations", lty = 1, ylim = c(min(range), max(range)), - xlim = c(501,length(train_errors)), + xlim = c(501, length(train_errors)), ) points(test_errors, diff --git a/lab2/figures/assignment3-4.eps b/lab2/figures/assignment3-4.eps index f156ce9..4842349 100644 --- a/lab2/figures/assignment3-4.eps +++ b/lab2/figures/assignment3-4.eps @@ -131,7 +131,6 @@ dup length dict begin end /Font5 exch definefont pop %%EndProlog -0.00 0.00 450.00 300.00 cl %%Page: 1 1 bp /bg { 1 1 1 srgb } def @@ -40511,25 +40510,25 @@ o 0 0 0 srgb 0.75 setlinewidth [] 0 setdash -313.92 240.96 105.84 -37.12 r p3 +290.94 240.96 128.82 -37.12 r p3 0 0 1 srgb np -323.14 228.59 m -18.43 0 l +302.15 228.59 m +22.44 0 l o 1 0 0 srgb 0.75 setlinewidth [ 2.25 3.75] 0 setdash np -323.14 216.21 m -18.43 0 l +302.15 216.21 m +22.44 0 l o /Font1 findfont 12 s 0 0 0 srgb -350.79 224.28 (T) 0 ta +335.81 224.28 (T) 0 ta -1.440 (r) tb -0.120 (aining Error) tb gr -350.79 211.90 (T) 0 ta +335.81 211.90 (T) 0 ta -1.440 (est Error) tb gr ep %%Trailer diff --git a/lab2/figures/assignment3-4.png b/lab2/figures/assignment3-4.png index cc6b1d311f37cafd53dadedd31f61a5223c3e9a6..0e747b8b028581d3385f2bdc04d9e874dc61f97a 100644 GIT binary patch literal 4892 zcmcIoc|26@+n<VfWSL1JvJIt}6c1wTvXzw3I7l*+QDn(3OGPw>7!;2!Psuu?I?0f& z<cuXD$?!DxvhQn_NAo+Q_xHY^&-?!Vc|Y&_o4L<@&V6m?y6*dXUFSY0*6N&@0G~J? z0)Y@XZEkFhK<oq%h#eH(T`<LDYPJ|YHCvsvHG$6v1QvlHA`ol@7K^|V5m*X>2sb)R zg~wO~kwfPE;0p?t2sb*G0yh?{14|RPC5RL{5vI`TL^|BFDOd!B2sbQ+0yiRsLWlnp zI*S6cSS$*QO(!DgL@caBr(o%nUwSZ~MTc2zI-Sj;v)L>PmPH}5=x~FTU?vM@ve;}k z>?@rJv$v%<f-sFT`1La!%5OgA_I?P2U_Iy9(db=x6@fslpEfqM4bGa$-V@5A?>D%v z-S!L<>Tlgy@~GQ&h8U2jky%F1JY_b@W?zt#lCL{?bje!AzwHMj{}56J5}qF>M?U2; zxHI0%gK&uiWOm~3@{+jGG9siq|E58(98>Ruy}Hg;m}pJJbl8=!sBWRC42{;UR*`dp zAwy|p`bbv$)2)Q3*V9GcVr=dLQP9Tn>;?_5HB<hyMF#gsw!Q%pNI+7Lgh_!}tBwb( ziF(y2i=<l8=trriRPTP1Zt3Kl{yc^G?jL_mW$OLxo_jh@pSZg$TQgE!yWZdBJ2k$_ zS`2B*WR_hD&(B_OXZbIcOVe)A*XsI?Yk&ItPD)NK>8ah@+y2@~b}30|U?bA3qs_CT zuyyr!kGD_E`^{`d2Ld5QNz;y%uTMxrRDftqYW?IBkQ4gl=bc-|o;9uK!@!_ZZ{9!j z?QATGm|c|}IC_jJo2vC`I*6W#eKRtaRYO*7D15!)U&VZR0O<sZllO&VVlQgPe{MO^ z*fd%KywI0tTe5#L2#c>1G@{MQrN6Yt@O-g%(A6t=@glr0t488OxTtzunO*&z{-e4N zsEyyvYR-Sl^GTDw_EWpB<6zg}+ifML-yW)z<R8-Tst@s8eYa@gQbS^yIW_EianO_r zd(Jyt0%&jcw6lY$MmfE?*?PYV2=$2Shc6s-neML{S<G)e&8)X}*jVM+^uG^i|G49+ zwbi0Gic9&@GA=!FZCGtOa9}?*&zxyyM%!>1f8H%<f^=q7s&;(p9^EG*Rn*vZyPD2( ziHBUHG~zGUs)F12>SibC*Q|E;OcgL{Ff%tTww%Ktgs7h`JNva)S^Dat1rFzN;Zpg4 zEi^%p#nro9bviCdmcJaAcbUY}XZH>zE#3K<q$#Kw8kDM}E@{SS-dt|Gv6Y9$X$1!{ zK1?z}o7F5EOY38~8S0{{<wGLyyjFx`Aa_mvC94rD`2`2eQgV=hm6Kd*Y0!_RQH_!q z%5cZ|xq%F1@SlLCT&g2S*L^dk-$%kr8Z0*H)mu#jx=tlQ9^f!Wr-vU&717q(zIk@` zo#9yhjO#-(pkkfnllvuyi&9n6P6j;gi*bb9j|{JZ>J7dOMQO4O?7hOtoY@!#P-g$6 zG|26ZZ|COtB=vhI^W*p11-|_z+N(XP2SZ*Bj7$K5vrF#D?gvsLzCM!hLbm8wAGe+& zbka`D-I}rDT5zE0d{Z;0xl6VDRrU8kpfl-$_t#Of?ZVt5$@Koo5Gm>@n(xkLol)Bq z+m`VROUAkS0PyVQ3ffCLAU$6P#{p~8P#JKm&2O`$a*ZEpF_w3G>4}b#TBzNJt#HYj zjpAcVKPRS^C$A=V>K6xp@0PyNRW3aZ2E@8r_uoFEi{lus=q`LZR0+_xZlMYiD?bW( zjrM8rv(C;~LGx#5r+Y#dm8YYHDZs@3*;34Jd}D`Yz*lPR2T@$hC<@SAaGdE^6C@OV zPhKRL>;F_}e8|B0DW}`A6*n44uKGhxo55Iv2N&dUH<;iRDDrZH6JMg^%0d9=vH=LK zsg=bW3gt%qIQ7~PGw%8~ZT|WeANXgY@MnScpbJ#sLUdvm&y^uwa@T~-LeGPZg`3Hf zyWCEno=j)B7ta!Y?y5ATUFec!S}9+q?MM%Tuy^A`l>}Iu{mq6nVFTJ1+T#^n)D#!e zqQ<c&`+YGv;P>YnEnJ}K#k2wmv9enRzm$<4wgDmW(SWWDvvATEB$fV?aoI<3@eBTt zkbm#2czMg!0i61<HXi9=SUrDGr$%dqs=4~@Z9tO(NCLMtMnW*qq|06~A?NK$XKw0S zI~%8;39RGglR`m`&Oe{`vtCFjLZ3s~Ew)c;Q?8}h1y6#>UYh!yq&)qEmv+t@>F$K9 z)&soZ0drmop`PcQFlFUMXr}V>X=ep#C46?y2d#>Ue0u2NR4LclRyU{kvl3hPt2}2F z2i)*~4Tckb;PfBQeNh1MBj57b08h|l9+Hs#&R8xrdy~N!X}=`gHv>5L4#%KcF6+-I zxY81jYvPE}V{S&E;06D!tx6|ay#YAw1ydocerIf6N$?~x4mFkh$2rW5W$(?SYF`gx zAzwUZfPrq9boq*!s_3c<E(K;v-=D>};l@jW@8Iqep78+zZ`-Z;1@J}bgDd);5sI1n zzYaAQKO6x^_f1{->^))1)}4DM5u>`9`DtOogS(mJYVAEadlkx{9AJD_!TH6wi=px9 z6|?KgHL60$I5CeSehI)Nw%ac>M8Qa!t!nnLA&dawaXs~nfkanRnsJR>G$8D|fFBWk z=WiMZbjteV=Ah|z)xut59%eUi*97S+DO3nhknz*UJyzBndQJ^&A{^s|++XB*9FT)o z3=Ik%2Gey)x}fu0YNpvf+5=pTAGUz80$)KrMQnr}h?iWRd?}GqOwM(xC#kOm*48y* z4eL6(Py_+jr{(_3nT_2-H}&d^x#r}&1H=u!J?;?~!a`lStD6jg%uTv8*P_0Fb zBxJj6-%%W#X0K&C$Z1r?+WNhp2@^gz#or<(ixUz~01kwXMHF+#1K-kA&<*16UjL}} z=mp2`vDOc3;ue81w+#QN+GA>xMa!Q?Vn!5t+fLSPqeyrZ{8-YQRBPg&GXgdYaL8!p z`jF-L1&*8CFy<R+K1WFE#aKw35C5Q85R8cga*O2}wnqs%Oe;<rzzf5no}xYB<N^td z*?TOuE<0mQT~Q-_e+=)h(y%5kqJlFZ^%=UOE1233n+e<rpUkG^Lg#>kWnuIv|5Jla z%6!R+%*E?!5Z}QL*ZAaB^&t|tvoQ)4XYWEXX8?gs;(Or-35mCrue9B$JfdG3+<9L| zgfv*EYWf{Cf?z@aQzUq=GuWwWO4^Ua5V+7U<5B+{N^#9Wfb4J_jJTckyFl}k_c)$O zkxb(EqxE7Lv=cJOJ;nwYWF03pcfJ<|n+V)7JoqFpUKF$wr2~UX$vA8;?2Ey#?NsD> zJc_`5?>IiGk&j;pLiZuj@K!5W1`d-12V4674sx%Dw24y9J5SdAcSt3ldm@)ZxBjRs zvzDg24VASRdlfYS;f5Q9dFWVhC%zhJ+nMV*&hTt~MSsNb-0W_|_wYq6;I%B!<tko~ zVu1uwiT_;1K6=T^8A>BiQZIq$ZaXT6`|-gpBZU|Z$J;*w!Xj`GnkKY@fLjkbpRCKz zpmC(Ez136RnVQQqnntw~o`%%YP3%fF7whxVN;FAT<3HC<5NN{kdz5E+8PHD5UxAEh z$OYvFBly}2M*>_1ouu}F?+w1s#@yssBlY&3c+N4C^rp(iwhEqj<MG)Tm6>FCo`fQU zAU;$Mr{{%xV)Tw7i}?iL?vNqe%MKgPpM&SRmSiHObi$N8Vm#ZM$Ss+LPCczDBjP`J z7l4-sEzi^ox9+2N-Rg#C@LdwhB6MZ6RxXna+?7M8Uf%EV);g1rs$xXrOm13Do~Hi+ zIXvwhvT|R3ZkNlKU#8<O#%oF9CCj^o+R*lW+nyDD488H)QJ_!|#z|VaKT_$$|86N^ zT<ic1xN;zL10Sz5R6GWrxX}?TgR`jI0g4E0<ERS;C-dpTY1$$U`HKd_VND*V)i4~l zNA$se!wHGJ^4iPZBSr@|Pa>%gMy-A1+hs<CRGr^r1K}0814krP?*1sf63FJ{xB-a) zY*IJV7%+N89$cD_AZf@!=*0bEk)`hoR;Y&CFm3j)Uvjz!q>*`kvtESfI|YD^?u6Zj z@e7BmgELq|i-geL%^P4o3&_H+2azzm8{q|m3!@nF*L%WX3MW7Q1^RV3sAgJD9ETj# z{!`Q>J|KnC=%86ky4Xe-xm{<yU_guU--SOWB?~_vuIkwYk2`zj8)EP@hMXL8Xi`th z%dS}l6vtyA2OTtCcffPGy*n{?`~F6IUZf{7=bZI%ka$Hr3bs*)QgVHZhbpb^;W5<C zo7%)8^F?5XtcH@BX#H5#-R;C%grmrT6Y-c7oPvq}Ba`7A{;v#$*%4%u__E+O4AU&S z-yErQL`MwVAV!PPjbV}{A3mB_4lW;2fb`7EuH;4|+M(gQK!(Ig^6>(RriaQXZ|HLe zv+*z}2BwmZ<FChG3Y<2gnS6T$kY54vuT#lE_`Y7-Q|svE$dSQpKwR>MtF<h1?}802 zGYeA3RGBZbss`lF&mZMhC{a#{%c}o8e+k17SZkk9SPR3~?M3aKT5rQ_bu4OKgZQML zlu4kg6wR|ds|&G!)GKQ1GjdHt*v){K2FBfuXJX+35s7qxSN0hmqkR=ca8fiXegBPl zY2Kkh3F3QPIs(f0w8^JlE74Oo7d;g8_zf;c{8?PGcKapjd4bO+&Dn0xy9#zsJpJDG zd-tSGl>Y_av2>4>BE!lfZ<aomZG4e&de|E>>JaWuQ9d)P<M$tCc3<1|3s1jlB_}6f z7yiY-(14~%em-09g2@Q0y*Z+R8~B4#;H;-sF56Xn-G}ZqdGVe`>q<_~@G_opeF}VO zf8Kjm=|R`Y!`~~qEH3)1Y22jJ>)uqZhov$7t#+U9W;8QY_vlR9*>pRi9aH4JX|*b@ z9!Zyxv|KROu}q+i*;-KMfF1JLI^iO!AgZL_RHPKBMN@<==6hfgG&cBy)HFP)_EAfL zHUehCfj4h~%kz>g<TCc7*xwc#CM8nnZjih8jYXX0#ic;Mfxk+@W9O7p-|)BWwr?zP zcy#scQE{sG*{^>_=xU2+R$uHJtnRZ_;<fByn2=o^D<gOvX<>c|UJdrsvs9q;5}&2T zl+$3EQL9d$n$qL-u%lUrf=?c+nc&k<@O1AV)IA!fZgz6!6+@3_&hMGTS%q(H6ARCv zrF@Aqhub?^Zxos4bPANpn+LEz7Y62Y6-gS5T2P3k@6#*SU$^0YE^8VVFN@x`Q2480 zY2K*_+-SJhqhw=75H5F@$STU@DFt$hy<aIW9#;D|z4mt{UKS*D|6Eqq@?z!GS|O=9 zwlqOMN-+wW<N?niz>U}!wf1HmQ)V^2?T0T;Ed6ko3@mN<lyYnGw!`xty_zjw4?F3~ zE3n=T2>T37b;$kroLH@zSXi*!dGnbDZbE-WSLk=z?36mGD{=o+#l@+9Mz_$dZ)@u{ z_8(P*TWEQOEncr&rH+e1lZ|9o=IOH!nsbXa$$Vh^nZG(kr9)(K`so1CkkLebwEI%` zzzZrq&ykd8K#Mpdhr{P}Na=P#c<7Z3PCq2x)k)<^<<D2-LX`$13?yzOLYYeM@6RCY zre4b>Y<z%gInsl7QoN#l5tuM|)Ck!92wk#0lo$<=xQ%{o1pZ$>vaor2W$tAxGEqgG PuUw~1&KW;9x)S*h_pBTu literal 4865 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 -- GitLab