library(EBImage)
library(imager)
## Warning: package 'imager' was built under R version 4.3.3
## Loading required package: magrittr
## Warning: package 'magrittr' was built under R version 4.3.3
## 
## Attaching package: 'imager'
## The following object is masked from 'package:magrittr':
## 
##     add
## The following objects are masked from 'package:EBImage':
## 
##     channel, dilate, display, erode, resize, watershed
## The following objects are masked from 'package:stats':
## 
##     convolve, spectrum
## The following object is masked from 'package:graphics':
## 
##     frame
## The following object is masked from 'package:base':
## 
##     save.image
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:imager':
## 
##     where
## The following object is masked from 'package:EBImage':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tibble' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ imager::add()       masks magrittr::add()
## ✖ stringr::boundary() masks imager::boundary()
## ✖ dplyr::combine()    masks EBImage::combine()
## ✖ tidyr::extract()    masks magrittr::extract()
## ✖ tidyr::fill()       masks imager::fill()
## ✖ dplyr::filter()     masks stats::filter()
## ✖ dplyr::lag()        masks stats::lag()
## ✖ purrr::set_names()  masks magrittr::set_names()
## ✖ purrr::transpose()  masks EBImage::transpose()
## ✖ dplyr::where()      masks imager::where()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Define the path to your images
image_folder <- "C:/Users/Muraa/Desktop/Natural images"
# Get a list of all categories (folders)
categories <- list.dirs(image_folder, recursive = FALSE)
labels <- basename(categories)  # Use folder names as labels
# Debug: print categories
print(categories)
## [1] "C:/Users/Muraa/Desktop/Natural images/Airplane" 
## [2] "C:/Users/Muraa/Desktop/Natural images/Car"      
## [3] "C:/Users/Muraa/Desktop/Natural images/Dog"      
## [4] "C:/Users/Muraa/Desktop/Natural images/Fruit"    
## [5] "C:/Users/Muraa/Desktop/Natural images/Motorbike"
# Function to resize images efficiently with added debugging
resize_image <- function(img_path, img_size = 128) {
  tryCatch({
    cat("Loading image:", img_path, "\n")  # Debug: print the image being loaded
    img <- load.image(img_path)  # Load the image
    img <- resize(img, img_size, img_size)  # Resize to specified dimensions
    as.numeric(img)  # Convert to numeric vector
  }, error = function(e) {
    cat("Error loading image:", img_path, "\n")
    return(NULL)
  })
}
# Function to load all images into a matrix
load_images <- function(image_folder, categories, img_size = 128) {
  all_images <- list()  # Initialize an empty list to store image data
  labels <- c()  # Initialize an empty vector to store labels
  
  for (category in categories) {
    label <- basename(category)  # Get label from folder name
    image_files <- list.files(category, full.names = TRUE)  # List all image files
    
    cat("Processing category:", label, "\n")  # Debug: print category name
    
    # Process each image file in the category using lapply
    category_images <- lapply(image_files, function(x) resize_image(x, img_size))
    valid_images <- Filter(Negate(is.null), category_images)  # Remove NULLs (invalid images)
    
    # Debug: print the number of valid images
    cat("Number of valid images in category", label, ":", length(valid_images), "\n")
    
    # Store valid images and corresponding labels
    all_images <- c(all_images, valid_images)
    labels <- c(labels, rep(label, length(valid_images)))
  }

  # Convert list of image vectors into a matrix
  if (length(all_images) > 0) {
    image_matrix <- do.call(rbind, all_images)
    return(list(image_matrix = image_matrix, labels = labels))  # Return image matrix and labels
  } else {
    return(NULL)  # Return NULL if no valid images were loaded
  }
}
# Load images and labels
image_data <- load_images(image_folder, categories)
## Processing category: Airplane 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0000.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0001.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0002.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0003.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0004.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0005.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0006.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0007.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0008.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0009.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0010.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0011.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0012.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0013.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0014.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0015.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0016.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0017.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0018.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0019.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0020.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0021.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0022.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0023.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0024.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0025.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0026.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0027.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0028.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0029.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0030.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0031.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0032.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0033.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0034.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0035.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0036.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0037.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0038.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0039.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0040.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0041.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0042.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0043.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0044.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0045.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0046.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0047.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0048.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Airplane/airplane_0049.jpg 
## Number of valid images in category Airplane : 50 
## Processing category: Car 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0000.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0001.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0002.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0003.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0004.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0005.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0006.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0007.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0008.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0009.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0010.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0011.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0012.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0013.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0014.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0015.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0016.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0017.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0018.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0019.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0020.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0021.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0022.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0023.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0024.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0025.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0026.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0027.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0028.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0029.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0030.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0031.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0032.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0033.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0034.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0035.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0036.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0037.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0038.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0039.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0040.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0041.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0042.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0043.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0044.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0045.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0046.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0047.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0048.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Car/car_0049.jpg 
## Number of valid images in category Car : 50 
## Processing category: Dog 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0000.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0001.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0002.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0003.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0004.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0005.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0006.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0007.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0008.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0009.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0010.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0011.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0012.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0013.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0014.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0015.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0016.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0017.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0018.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0019.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0020.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0021.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0022.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0023.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0024.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0025.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0026.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0027.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0028.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0029.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0030.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0031.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0032.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0033.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0034.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0035.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0036.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0037.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0038.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0039.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0040.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0041.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0042.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0043.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0044.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0045.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0046.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0047.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0048.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Dog/dog_0049.jpg 
## Number of valid images in category Dog : 50 
## Processing category: Fruit 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0000.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0001.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0002.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0003.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0004.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0005.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0006.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0007.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0008.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0009.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0010.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0011.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0012.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0013.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0014.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0015.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0016.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0017.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0018.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0019.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0020.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0021.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0022.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0023.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0024.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0025.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0026.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0027.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0028.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0029.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0030.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0031.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0032.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0033.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0034.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0035.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0036.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0037.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0038.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0039.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0040.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0041.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0042.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0043.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0044.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0045.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0046.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0047.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0048.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Fruit/fruit_0049.jpg 
## Number of valid images in category Fruit : 50 
## Processing category: Motorbike 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0000.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0001.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0002.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0003.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0004.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0005.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0006.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0007.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0008.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0009.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0010.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0011.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0012.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0013.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0014.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0015.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0016.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0017.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0018.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0019.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0020.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0021.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0022.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0023.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0024.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0025.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0026.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0027.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0028.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0029.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0030.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0031.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0032.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0033.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0034.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0035.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0036.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0037.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0038.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0039.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0040.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0041.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0042.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0043.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0044.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0045.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0046.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0047.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0048.jpg 
## Loading image: C:/Users/Muraa/Desktop/Natural images/Motorbike/motorbike_0049.jpg 
## Number of valid images in category Motorbike : 50
# Check if image_matrix exists and has valid dimensions
if (!is.null(image_data$image_matrix) && length(dim(image_data$image_matrix)) == 2) {
  if (dim(image_data$image_matrix)[1] > 0 && dim(image_data$image_matrix)[2] > 0) {
    cat("Image data loaded successfully. Dimensions:", dim(image_data$image_matrix), "\n")
  } else {
    cat("No valid image data found. Check your image folder.\n")
  }
} else {
  cat("Image matrix is NULL or invalid. Check your image processing.\n")
}
## Image data loaded successfully. Dimensions: 250 49152
##NEURAL NETWORKS
r # Load necessary libraries library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
r library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
## ## Attaching package: 'caret'
## The following object is masked from 'package:purrr': ## ## lift
r library(dplyr) library(ggplot2) library(tidyr) library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
## ## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr': ## ## smiths
``` r # Set seed for reproducibility set.seed(123)
image_data <- data.frame(matrix(rnorm(1000), nrow = 100)) # Mock image data image_data$label <- sample(c(“Class1”, “Class2”), 100, replace = TRUE) # Mock labels
# Perform PCA pca_result <- prcomp(image_data[, -which(names(image_data) == “label”)], center = TRUE, scale. = TRUE) # Create a data frame with PCA results and labels image_data_pca <- data.frame(pca_result\(x, label = image_data\)label)
# Function to fit a neural network model and return cross-validated accuracy fit_nn_model_cv <- function(hidden_neurons, train_data, folds = 5) { # Define the control method for cross-validation train_control <- trainControl(method = “cv”, number = folds)
# Define the model formula formula <- label ~ .
# Fit the model with cross-validation nn_model_cv <- train( formula, data = train_data, method = “nnet”, trace = FALSE, linout = FALSE, maxit = 100, tuneGrid = expand.grid(size = hidden_neurons, decay = 0.1), # Increased decay for regularization trControl = train_control )
# Extract cross-validated accuracy accuracy <- max(nn_model_cv\(results\)Accuracy, na.rm = TRUE) # Handle NA values
return(accuracy) } ```
r # List of hidden neuron counts neurons_list <- c(5, 10, 20) accuracy_results <- data.frame(Hidden_Neurons = neurons_list, Accuracy = NA)
r # Fit models for (neurons in neurons_list) { accuracy <- fit_nn_model_cv(neurons, image_data_pca) accuracy_results[accuracy_results$Hidden_Neurons == neurons, "Accuracy"] <- accuracy }
r # Print the results print(accuracy_results)
## Hidden_Neurons Accuracy ## 1 5 0.5014536 ## 2 10 0.5210777 ## 3 20 0.5810276
r # Plot accuracy results ggplot(accuracy_results, aes(x = factor(Hidden_Neurons), y = Accuracy)) + geom_line(group = 1, color = "blue", size = 1.2) + geom_point(color = "red", size = 3) + labs(title = "Neural Network Accuracy by Hidden Neurons", x = "Number of Hidden Neurons", y = "Accuracy") + theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated.
r # Step 3: Enhanced plot of accuracy results if (!is.null(accuracy_results)) { ggplot(accuracy_results, aes(x = factor(Hidden_Neurons), y = Accuracy)) + geom_line(aes(group = 1), color = "darkorange", size = 1) + # Connect points with lines geom_point(color = "steelblue", size = 4) + # Add points at each accuracy value geom_text(aes(label = round(Accuracy, 3)), vjust = -0.5, size = 5) + # Add accuracy labels above points labs(title = "Neural Network Accuracy by Hidden Neurons", x = "Number of Hidden Neurons", y = "Accuracy") + theme_minimal() + theme(text = element_text(size = 12), # Increase text size for better readability plot.title = element_text(hjust = 0.5)) + # Center title scale_y_continuous(labels = scales::percent_format(accuracy = 0.01)) # Format y-axis as percentage if accuracy is in decimal }

LOGISTIC REGRESSION

# Load necessary libraries
library(caret)
library(nnet)
library(ggplot2)
library(imager)
# Function to load image data from the specified folder
load_image_data <- function(image_folder) {
    categories <- list.dirs(image_folder, recursive = FALSE)
    all_images <- list()  # Initialize an empty list to store image data
    labels <- c()  # Initialize an empty vector to store labels
    
    for (category in categories) {
        label <- basename(category)  # Get label from folder name
        image_files <- list.files(category, full.names = TRUE)  # List all image files
        
        # Process each image file in the category
        category_images <- lapply(image_files, function(x) {
            img <- load.image(x)  # Load the image
            img <- resize(img, 128, 128)  # Resize to 128x128
            as.numeric(img)  # Convert to numeric vector
        })
        
        # Store valid images and corresponding labels
        valid_images <- Filter(Negate(is.null), category_images)  # Remove NULLs (invalid images)
        all_images <- c(all_images, valid_images)
        labels <- c(labels, rep(label, length(valid_images)))
    }
    
    # Create a data frame for image data and labels
    image_data <- data.frame(img_vector = I(all_images), label = labels)  # I() to store lists
    return(image_data)
}
# Function to flatten image vectors and prepare the dataset
prepare_image_data <- function(image_data) {
    if (!("img_vector" %in% names(image_data) && "label" %in% names(image_data))) {
        stop("image_data must contain 'img_vector' and 'label' columns.")
    }
    
    # Flatten image vectors into a matrix
    img_matrix <- do.call(rbind, lapply(image_data$img_vector, as.vector))
    
    # Create a data frame with the flattened image data and labels
    image_data_flat <- data.frame(label = image_data$label, img_matrix)
    
    # Ensure labels are factors
    image_data_flat$label <- as.factor(image_data_flat$label)
    
    return(image_data_flat)
}
# Function to normalize features and perform PCA
perform_pca <- function(image_data_flat, variance_threshold = 0.95) {
    # Normalize the pixel data, excluding the label column
    image_data_scaled <- scale(image_data_flat[, -1])  # Exclude the label column
    
    # Perform PCA on scaled image data
    pca_result <- prcomp(image_data_scaled, center = TRUE, scale. = TRUE)
    
    # Determine number of principal components to retain specified variance
    explained_variance <- summary(pca_result)$importance[3,]
    num_components <- min(which(cumsum(explained_variance) >= variance_threshold))
    
    # Create a new dataset with selected PCA components and labels
    image_data_pca <- data.frame(pca_result$x[, 1:num_components])
    image_data_pca$label <- image_data_flat$label
    
    return(image_data_pca)
}
# Function to fit multinomial logistic regression model
fit_multinomial_logistic_regression <- function(image_data_pca) {
    multinom_model <- multinom(label ~ ., data = image_data_pca)
    return(multinom_model)
}
# Function to evaluate the model
evaluate_model <- function(model, image_data_pca) {
    # Predict probabilities and class labels
    predicted_probs <- predict(model, type = "prob")
    predicted_classes <- predict(model)
    
    # Create a confusion matrix and calculate accuracy
    confusion_matrix <- table(Actual = image_data_pca$label, Predicted = predicted_classes)
    accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
    
    # Output results
    cat(sprintf("Logistic Regression Accuracy: %.4f\n", accuracy))
    cat("Confusion Matrix:\n")
    print(confusion_matrix)
}
# Main script
# Define the path to your images
image_folder <- "C:/Users/Muraa/Desktop/Natural images"
# Load the data
image_data <- load_image_data(image_folder)
# Step 1: Prepare dataset

image_data_flat <- prepare_image_data(image_data)
# Step 2: Perform PCA
image_data_pca <- perform_pca(image_data_flat)
# Step 3: Fit multinomial logistic regression model
multinom_model <- fit_multinomial_logistic_regression(image_data_pca)
## # weights:  25 (16 variable)
## initial  value 402.359478 
## iter  10 value 223.971861
## iter  20 value 183.385776
## iter  30 value 178.543429
## iter  40 value 178.345263
## iter  50 value 178.334769
## final  value 178.329092 
## converged
# Step 4: Evaluate model performance
evaluate_model(multinom_model, image_data_pca)
## Logistic Regression Accuracy: 0.7200
## Confusion Matrix:
##            Predicted
## Actual      Airplane Car Dog Fruit Motorbike
##   Airplane        26   8  11     0         5
##   Car              8  33   9     0         0
##   Dog              9  12  26     1         2
##   Fruit            0   0   0    50         0
##   Motorbike        1   2   2     0        45

Step 5: Clustering Methods

Hierarchical Clustering with Dendrogram

# Load necessary libraries
library(ggplot2)
library(dendextend)  # For enhanced dendrogram visualization
## Warning: package 'dendextend' was built under R version 4.3.3
## 
## ---------------------
## Welcome to dendextend version 1.17.1
## Type citation('dendextend') for how to cite the package.
## 
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
## 
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags: 
##   https://stackoverflow.com/questions/tagged/dendextend
## 
##  To suppress this message use:  suppressPackageStartupMessages(library(dendextend))
## ---------------------
## 
## Attaching package: 'dendextend'
## The following object is masked from 'package:EBImage':
## 
##     rotate
## The following object is masked from 'package:stats':
## 
##     cutree
library(ggdendro)    # For ggplot-based dendrograms
## Warning: package 'ggdendro' was built under R version 4.3.3
## 
## Attaching package: 'ggdendro'
## The following object is masked from 'package:dendextend':
## 
##     theme_dendro
## The following object is masked from 'package:imager':
## 
##     label
# Function to perform hierarchical clustering and plot dendrogram
perform_hierarchical_clustering <- function(image_data_pca, num_clusters = 3) {
    # Compute the distance matrix excluding the label column
    dist_matrix <- dist(image_data_pca[, -which(names(image_data_pca) == "label")])
    
    # Perform hierarchical clustering
    hclust_result <- hclust(dist_matrix)
    
    # Convert to a dendrogram
    dendro_data <- as.dendrogram(hclust_result)

    # Set cluster assignments
    image_data_pca$hclust_cluster <- cutree(hclust_result, k = num_clusters)  # Define number of clusters

    # Plotting the dendrogram
    plot_dendrogram(dendro_data, num_clusters)
    
    # View the first few rows with cluster assignments
    return(head(image_data_pca))
}
# Function to plot the dendrogram using ggplot
plot_dendrogram <- function(dendro_data, num_clusters) {
    # Convert the dendrogram into a tidy data frame for ggplot
    dendro_data_df <- dendro_data %>%
        ggdendro::dendro_data() %>%
        ggdendro::segment() %>%
        ggplot(aes(x = x, y = y)) +
        geom_segment(aes(xend = xend, yend = yend), color = "steelblue") +
        geom_hline(yintercept = 0, linetype = "dashed") +
        labs(title = "Hierarchical Clustering Dendrogram",
             subtitle = paste("Cutting the dendrogram into", num_clusters, "clusters"),
             x = "Cluster Indices",
             y = "Height") +
        theme_minimal() +
        theme(axis.text.x = element_blank(), 
              axis.ticks.x = element_blank())
    
    print(dendro_data_df)
}
# Execute the clustering process and plot the dendrogram
cluster_results <- perform_hierarchical_clustering(image_data_pca, num_clusters = 3)

# Display the results
print(cluster_results)
##         PC1        PC2       PC3    label hclust_cluster
## 1 -25.98419 -75.822550  44.91887 Airplane              1
## 2 -85.59935  43.984769 -31.86969 Airplane              1
## 3  98.03365  31.501059  13.10570 Airplane              2
## 4  16.95778 -65.535123  57.88321 Airplane              1
## 5 -45.91266 -96.752360  53.36170 Airplane              1
## 6 143.92170  -2.879701  47.57098 Airplane              2

Step 6: K-means Clustering

K-means Clustering Function

# Load necessary libraries
library(ggplot2)
library(factoextra)  # For clustering visualization
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(pheatmap)    # For heatmap visualization
## Warning: package 'pheatmap' was built under R version 4.3.3
library(caret)       # For trainControl and cross-validation
perform_kmeans_clustering <- function(image_data_pca, num_clusters = 4) {
  set.seed(123)  # For reproducibility
  # Perform K-means clustering
  kmeans_result <- kmeans(image_data_pca[, -which(names(image_data_pca) == "label")], centers = num_clusters, nstart = 10)
  
  # Assign clusters to the dataset
  image_data_pca$kmeans_cluster <- as.factor(kmeans_result$cluster)
  
  return(image_data_pca)
}
## Visualization of K-means Clustering
plot_kmeans_results <- function(image_data_pca) {
  ggplot(image_data_pca, aes(x = PC1, y = PC2, color = kmeans_cluster)) +
    geom_point(alpha = 0.6, size = 2) +
    labs(title = "K-means Clustering of Image Data",
         subtitle = "Clusters based on the first two Principal Components",
         x = "Principal Component 1",
         y = "Principal Component 2") +
    scale_color_brewer(palette = "Set1") +  # Better color palette
    theme_minimal() +
    theme(legend.title = element_blank(), 
          plot.title = element_text(hjust = 0.5, size = 16),
          plot.subtitle = element_text(hjust = 0.5, size = 14))
}
## Elbow Method to Determine Optimal K
elbow_method <- function(image_data_pca, max_k = 10) {
  wss <- sapply(1:max_k, function(k) {
    kmeans(image_data_pca[, -which(names(image_data_pca) == "label")], centers = k, nstart = 10)$tot.withinss
  })

  ggplot(data.frame(Clusters = 1:max_k, WSS = wss), aes(x = Clusters, y = WSS)) +
    geom_line() +
    geom_point(size = 3) +
    labs(title = "Elbow Method for Optimal K",
         x = "Number of Clusters (K)",
         y = "Total Within-cluster SS") +
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5, size = 16))
}
## Confusion Matrix Heatmap
plot_confusion_matrix_heatmap <- function(confusion_matrix) {
  # Convert confusion matrix to data frame
  confusion_matrix_df <- as.data.frame.matrix(confusion_matrix)
  
  pheatmap(confusion_matrix_df, cluster_rows = FALSE, cluster_cols = FALSE,
           display_numbers = TRUE, fontsize_number = 10,
           main = "Confusion Matrix Heatmap",
           color = colorRampPalette(c("white", "blue"))(50))
}
# Main Execution
# Step 1: Perform K-means clustering
image_data_pca <- perform_kmeans_clustering(image_data_pca, num_clusters = 4)
# Step 2: Plot K-means results
plot_kmeans_results(image_data_pca)

# Step 3: Elbow Method Plot
elbow_method(image_data_pca)

# Step 4: 10-fold Cross-Validation
set.seed(123)
train_control <- trainControl(method = "cv", number = 10)
cv_model <- train(label ~ ., data = image_data_pca, method = "multinom", trControl = train_control)
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.699255
## iter  20 value 158.579174
## iter  30 value 150.500408
## iter  40 value 150.361001
## iter  50 value 150.353042
## iter  60 value 150.349010
## iter  70 value 150.348672
## final  value 150.348610 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.699464
## iter  20 value 163.613312
## iter  30 value 157.960438
## iter  40 value 157.937650
## final  value 157.937638 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.699255
## iter  20 value 158.587272
## iter  30 value 150.538102
## iter  40 value 150.405121
## iter  50 value 150.397512
## iter  60 value 150.393141
## iter  70 value 150.393039
## final  value 150.393001 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 206.015922
## iter  20 value 160.903551
## iter  30 value 149.798402
## iter  40 value 149.543288
## iter  50 value 149.524953
## iter  60 value 149.521134
## iter  70 value 149.520822
## iter  80 value 149.520763
## iter  80 value 149.520763
## iter  80 value 149.520763
## final  value 149.520763 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 206.016121
## iter  20 value 165.291912
## iter  30 value 156.739884
## iter  40 value 156.713740
## final  value 156.713707 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 206.015923
## iter  20 value 160.910594
## iter  30 value 149.826034
## iter  40 value 149.579237
## iter  50 value 149.562077
## iter  60 value 149.558648
## iter  70 value 149.558528
## final  value 149.558485 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.083078
## iter  20 value 161.414141
## iter  30 value 151.016276
## iter  40 value 150.522852
## iter  50 value 150.516247
## iter  60 value 150.511565
## iter  70 value 150.510860
## iter  70 value 150.510859
## iter  70 value 150.510859
## final  value 150.510859 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.083291
## iter  20 value 164.879933
## iter  30 value 157.355750
## iter  40 value 157.336374
## final  value 157.336326 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.083078
## iter  20 value 161.420369
## iter  30 value 151.032234
## iter  40 value 150.553062
## iter  50 value 150.547533
## iter  60 value 150.544715
## iter  70 value 150.544317
## final  value 150.544289 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 207.816674
## iter  20 value 156.175603
## iter  30 value 148.399661
## iter  40 value 147.617500
## iter  50 value 147.607126
## final  value 147.607082 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 207.816951
## iter  20 value 160.516147
## iter  30 value 155.562726
## iter  40 value 155.508954
## final  value 155.508355 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 207.816675
## iter  20 value 156.182352
## iter  30 value 148.476389
## iter  40 value 147.939378
## iter  50 value 147.910329
## iter  60 value 147.889658
## iter  70 value 147.885183
## iter  80 value 147.880338
## iter  90 value 147.833065
## iter 100 value 147.822482
## final  value 147.822482 
## stopped after 100 iterations
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.950401
## iter  20 value 165.889984
## iter  30 value 154.972882
## iter  40 value 154.606592
## iter  50 value 154.596883
## iter  60 value 154.591834
## final  value 154.591718 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.950582
## iter  20 value 171.833651
## iter  30 value 161.939367
## iter  40 value 161.904288
## final  value 161.904257 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.950401
## iter  20 value 165.897592
## iter  30 value 154.995190
## iter  40 value 154.640109
## iter  50 value 154.631114
## iter  60 value 154.627052
## iter  70 value 154.626935
## final  value 154.626889 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 273.377594
## iter  20 value 154.503497
## iter  30 value 150.071246
## iter  40 value 149.854728
## iter  50 value 149.644005
## iter  60 value 149.390183
## iter  70 value 149.276847
## iter  80 value 149.196467
## iter  90 value 148.993347
## iter 100 value 148.899305
## final  value 148.899305 
## stopped after 100 iterations
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 273.381478
## iter  20 value 165.195906
## iter  30 value 158.010561
## iter  40 value 157.327974
## final  value 157.327942 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 273.377598
## iter  20 value 154.509309
## iter  30 value 150.094808
## iter  40 value 149.889139
## iter  50 value 149.722670
## iter  60 value 149.586380
## iter  70 value 149.585847
## iter  80 value 149.552571
## iter  90 value 149.514093
## iter 100 value 149.498969
## final  value 149.498969 
## stopped after 100 iterations
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.901862
## iter  20 value 159.077492
## iter  30 value 149.903057
## iter  40 value 149.664179
## iter  50 value 149.658666
## iter  60 value 149.654144
## iter  70 value 149.653982
## iter  70 value 149.653982
## final  value 149.653962 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.902140
## iter  20 value 163.131946
## iter  30 value 156.982836
## iter  40 value 156.958111
## final  value 156.958068 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 205.901862
## iter  20 value 159.083583
## iter  30 value 149.941587
## iter  40 value 149.712463
## iter  50 value 149.708971
## iter  60 value 149.705169
## iter  70 value 149.704834
## final  value 149.704807 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.290842
## iter  20 value 164.697454
## iter  30 value 155.874611
## iter  40 value 155.564589
## iter  50 value 155.557506
## iter  60 value 155.549277
## iter  70 value 155.548896
## final  value 155.548812 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.291032
## iter  20 value 168.887537
## iter  30 value 162.644156
## iter  40 value 162.608354
## final  value 162.608280 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 208.290842
## iter  20 value 164.703818
## iter  30 value 155.899463
## iter  40 value 155.601733
## iter  50 value 155.595107
## iter  60 value 155.588556
## iter  70 value 155.588332
## final  value 155.588326 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.725464
## iter  20 value 159.922796
## iter  30 value 151.416306
## iter  40 value 151.250656
## iter  50 value 151.236301
## iter  60 value 151.233046
## iter  70 value 151.232541
## iter  80 value 151.232499
## iter  80 value 151.232497
## iter  80 value 151.232497
## final  value 151.232497 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.725650
## iter  20 value 164.406005
## iter  30 value 158.249306
## iter  40 value 158.212989
## final  value 158.212945 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 204.725464
## iter  20 value 159.930114
## iter  30 value 151.446549
## iter  40 value 151.287163
## iter  50 value 151.274238
## iter  60 value 151.271442
## iter  70 value 151.271206
## iter  70 value 151.271205
## iter  70 value 151.271204
## final  value 151.271204 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 202.685752
## iter  20 value 156.256890
## iter  30 value 145.851507
## iter  40 value 145.555753
## iter  50 value 145.545695
## iter  60 value 145.542729
## iter  70 value 145.542123
## final  value 145.542083 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 202.685928
## iter  20 value 162.211800
## iter  30 value 154.572784
## iter  40 value 154.532595
## final  value 154.532363 
## converged
## # weights:  40 (28 variable)
## initial  value 362.123530 
## iter  10 value 202.685752
## iter  20 value 156.267751
## iter  30 value 145.914969
## iter  40 value 145.645987
## iter  50 value 145.637014
## iter  60 value 145.615205
## iter  70 value 145.614604
## iter  80 value 145.610423
## iter  90 value 145.605873
## iter 100 value 145.599049
## final  value 145.599049 
## stopped after 100 iterations
## # weights:  40 (28 variable)
## initial  value 402.359478 
## iter  10 value 223.959609
## iter  20 value 184.504570
## iter  30 value 175.856370
## iter  40 value 175.823738
## final  value 175.823734 
## converged
# Step 5: Plot Confusion Matrix Heatmap
confusion_matrix <- table(Actual = image_data_pca$label, Predicted = image_data_pca$kmeans_cluster)  # Create confusion matrix
plot_confusion_matrix_heatmap(confusion_matrix)

# Display Cross-Validation Results
print(cv_model)
## Penalized Multinomial Regression 
## 
## 250 samples
##   4 predictor
##   5 classes: 'Airplane', 'Car', 'Dog', 'Fruit', 'Motorbike' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 225, 225, 225, 225, 225, 225, ... 
## Resampling results across tuning parameters:
## 
##   decay  Accuracy  Kappa
##   0e+00  0.680     0.600
##   1e-04  0.680     0.600
##   1e-01  0.692     0.615
## 
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was decay = 0.1.

# Load necessary libraries
library(ggplot2)
library(Rtsne)
## Warning: package 'Rtsne' was built under R version 4.3.3
library(nnet)
library(caret)
# Function to perform t-SNE and visualize clusters
perform_tsne_visualization <- function(image_data_pca) {
  # Apply t-SNE to reduce dimensions to 2
  tsne_result <- Rtsne(image_data_pca[, -which(names(image_data_pca) == "label")], dims = 2, pca = TRUE, perplexity = 30)
  
  # Add t-SNE results to the dataset
  image_data_pca$tsne1 <- tsne_result$Y[, 1]
  image_data_pca$tsne2 <- tsne_result$Y[, 2]
  
  # Plot t-SNE clusters with names instead of numbers
  ggplot(image_data_pca, aes(x = tsne1, y = tsne2, color = as.factor(label))) +  # Change color to 'label'
    geom_point(alpha = 0.6, size = 2) +
    labs(title = "t-SNE Clustering Visualization",
         x = "t-SNE 1",
         y = "t-SNE 2",
         color = "Class Label") +  # Add legend title for color
    scale_color_brewer(palette = "Set1") +  # Color palette for clusters
    theme_minimal() +
    theme(plot.title = element_text(hjust = 0.5, size = 16))
}
# Function to fit a neural network model
fit_neural_network <- function(image_data_pca) {
  nn_model <- nnet(label ~ ., data = image_data_pca, size = 10, maxit = 200, trace = FALSE)
  return(nn_model)
}
# Function to evaluate the neural network model
evaluate_nn_model <- function(nn_model, image_data_pca) {
  predicted_nn <- predict(nn_model, image_data_pca, type = "class")
  nn_confusion_matrix <- table(Actual = image_data_pca$label, Predicted = predicted_nn)
  nn_accuracy <- sum(diag(nn_confusion_matrix)) / sum(nn_confusion_matrix)
  
  # Output results
  cat(sprintf("Neural Network Accuracy: %.4f\n", nn_accuracy))
  return(nn_confusion_matrix)
}
# Function to extract and evaluate model importance
evaluate_importance <- function(cv_model) {
  importance <- varImp(cv_model, scale = FALSE)
  print(importance)
  return(importance)
}

Main Execution

# Step 1: t-SNE Visualization
perform_tsne_visualization(image_data_pca)

# Step 2: Fit Neural Network Model
nn_model <- fit_neural_network(image_data_pca)
# Step 3: Evaluate Neural Network Model
nn_confusion_matrix <- evaluate_nn_model(nn_model, image_data_pca)
## Neural Network Accuracy: 0.8000
# Step 4: Coefficients from Multinomial Model for Interpretation
coefficients <- coef(multinom_model)
print("Multinomial Model Coefficients:")
## [1] "Multinomial Model Coefficients:"
print(coefficients)
##            (Intercept)          PC1         PC2          PC3
## Car        -1.26572499  0.015218131 -0.01630593 -0.017713238
## Dog        -0.08859595  0.007223894  0.01591797 -0.002352345
## Fruit     -12.00860448 -0.043790260  0.18121794  0.016457060
## Motorbike  -1.94795949 -0.016453085 -0.01427359 -0.033312564
# Step 5: Evaluate Variable Importance
importance <- evaluate_importance(cv_model)
## multinom variable importance
## 
##                 Overall
## kmeans_cluster3 5.21471
## kmeans_cluster4 4.46947
## kmeans_cluster2 1.06099
## PC2             0.12971
## PC3             0.05895
## PC1             0.05620