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
delta 4358
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
Nc)I$ztaD0e0ssX>ZPx$*

delta 4335
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

-- 
GitLab