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