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
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
PuUw~1&KW;9x)S*h_pBTu

literal 4865
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

-- 
GitLab