From 36b36c41ba5898090377c914c08cfb8fd3f2040c Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 17 Apr 2025 10:10:19 +0700 Subject: [PATCH 01/13] feat(data): add export_to_csv method for saving processed data into individuals sensor end and update test script Closes #40 --- data/QUGS/convert.py | 42 +++++++++++++++++++++++++++++++++++++----- data/QUGS/test.py | 14 +++++++++----- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/data/QUGS/convert.py b/data/QUGS/convert.py index 85aa0ab..95f1073 100644 --- a/data/QUGS/convert.py +++ b/data/QUGS/convert.py @@ -2,6 +2,7 @@ import pandas as pd import os import re import sys +import numpy as np from colorama import Fore, Style, init from typing import TypedDict, Dict, List from joblib import load @@ -225,25 +226,56 @@ class DataProcessor: """ idx = self._create_vector_column_index() # if overwrite: - for i in range(len(self.data)): - for j in range(len(self.data[i])): + for i in range(len(self.data)): # damage(s) + for j in range(len(self.data[i])): # col(s) # Get the appropriate indices for slicing from idx indices = idx[j] # Get the current DataFrame df = self.data[i][j] - # Keep the 'Time' column and select only specified 'Real' columns - # First, we add 1 to all indices to account for 'Time' being at position 0 + # Keep the 'Time' column and select only specifid 'Real' colmns + # First, we add 1 to all indices to acount for 'Time' being at positiion 0 real_indices = [index + 1 for index in indices] - # Create list with Time column index (0) and the adjusted Real indices + # Create list with Time column index (0) and the adjustedd Real indices all_indices = [0] + [real_indices[0]] + [real_indices[-1]] # Apply the slicing self.data[i][j] = df.iloc[:, all_indices] # TODO: if !overwrite: + def export_to_csv(self, output_dir: str, file_prefix: str = "DAMAGE"): + """ + Export the processed data to CSV files in the required folder structure. + + :param output_dir: Directory to save the CSV files. + :param file_prefix: Prefix for the output filenames. + """ + for group_idx, group in enumerate(self.data, start=1): + group_folder = os.path.join(output_dir, f"{file_prefix}_{group_idx}") + os.makedirs(group_folder, exist_ok=True) + for test_idx, df in enumerate(group, start=1): + # Ensure columns are named uniquely if duplicated + df = df.copy() + df.columns = ["Time", "Real_0", "Real_1"] # Rename + + # Export first Real column + out1 = os.path.join( + group_folder, f"{file_prefix}_{group_idx}_TEST{test_idx}_01.csv" + ) + df[["Time", "Real_0"]].rename(columns={"Real_0": "Real"}).to_csv( + out1, index=False + ) + + # Export last Real column + out2 = os.path.join( + group_folder, f"{file_prefix}_{group_idx}_TEST{test_idx}_02.csv" + ) + df[["Time", "Real_1"]].rename(columns={"Real_1": "Real"}).to_csv( + out2, index=False + ) + def create_damage_files(base_path, output_base, prefix): # Initialize colorama diff --git a/data/QUGS/test.py b/data/QUGS/test.py index 95f2d8c..0bf4240 100644 --- a/data/QUGS/test.py +++ b/data/QUGS/test.py @@ -1,8 +1,12 @@ from convert import * from joblib import dump, load -# a = generate_damage_files_index( -# num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A" -# ) -# dump(DataProcessor(file_index=a), "D:/cache.joblib") -a = load("D:/cache.joblib") +a = generate_damage_files_index( + num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A" +) +data = DataProcessor(file_index=a) +# data.create_vector_column(overwrite=True) +data.create_limited_sensor_vector_column(overwrite=True) +data.export_to_csv("D:/thesis/data/") +# a = load("D:/cache.joblib") +breakpoint() -- 2.49.1 From db2947abdf4fa2eae927b8ba99075660d57f8132 Mon Sep 17 00:00:00 2001 From: nuluh Date: Sun, 20 Apr 2025 14:45:38 +0700 Subject: [PATCH 02/13] fix(data): fix the incorrect output of scipy.stft() data to be pandas.DataFrame shaped (513,513) along with its frequencies as the index and times as the columns (transposed) instead of just the magnitude that being flattened out; add checks for empty data and correct file paths for sensor data loading. Closes #43 --- code/notebooks/stft.ipynb | 50 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/code/notebooks/stft.ipynb b/code/notebooks/stft.ipynb index b1c16b3..818669d 100644 --- a/code/notebooks/stft.ipynb +++ b/code/notebooks/stft.ipynb @@ -121,8 +121,9 @@ "signal_sensor2_test1 = []\n", "\n", "for data in df:\n", - " signal_sensor1_test1.append(data['sensor 1'].values)\n", - " signal_sensor2_test1.append(data['sensor 2'].values)\n", + " if not data.empty and 'sensor 1' in data.columns and 'sensor 2' in data.columns:\n", + " signal_sensor1_test1.append(data['sensor 1'].values)\n", + " signal_sensor2_test1.append(data['sensor 2'].values)\n", "\n", "print(len(signal_sensor1_test1))\n", "print(len(signal_sensor2_test1))" @@ -156,8 +157,6 @@ "from scipy.signal import stft, hann\n", "from multiprocessing import Pool\n", "\n", - "\n", - "\n", "# Function to compute and append STFT data\n", "def process_stft(args):\n", " # Define STFT parameters\n", @@ -199,23 +198,22 @@ " # Compute STFT\n", " frequencies, times, Zxx = stft(sensor_data, fs=Fs, window=window, nperseg=window_size, noverlap=window_size - hop_size)\n", " magnitude = np.abs(Zxx)\n", - " flattened_stft = magnitude.flatten()\n", + " df_stft = pd.DataFrame(magnitude, index=frequencies, columns=times).T\n", + " df_stft.columns = [f\"Freq_{i}\" for i in frequencies]\n", " \n", " # Define the output CSV file path\n", " stft_file_name = f'stft_data{sensor_num}_{damage_num}.csv'\n", " sensor_output_dir = os.path.join(damage_base_path, sensor_name.lower())\n", " os.makedirs(sensor_output_dir, exist_ok=True)\n", " stft_file_path = os.path.join(sensor_output_dir, stft_file_name)\n", - " print(stft_file_path)\n", " # Append the flattened STFT to the CSV\n", " try:\n", - " flattened_stft_df = pd.DataFrame([flattened_stft])\n", " if not os.path.isfile(stft_file_path):\n", " # Create a new CSV\n", - " flattened_stft_df.to_csv(stft_file_path, index=False, header=False)\n", + " df_stft.to_csv(stft_file_path, index=False, header=False)\n", " else:\n", " # Append to existing CSV\n", - " flattened_stft_df.to_csv(stft_file_path, mode='a', index=False, header=False)\n", + " df_stft.to_csv(stft_file_path, mode='a', index=False, header=False)\n", " print(f\"Appended STFT data to {stft_file_path}\")\n", " except Exception as e:\n", " print(f\"Error writing to {stft_file_path}: {e}\")" @@ -295,7 +293,7 @@ "\n", "# get current y ticks in list\n", "print(len(frequencies))\n", - "print(len(times))\n" + "print(len(times))" ] }, { @@ -324,8 +322,8 @@ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "ready_data1 = []\n", - "for file in os.listdir('D:/thesis/data/working/sensor1'):\n", - " ready_data1.append(pd.read_csv(os.path.join('D:/thesis/data/working/sensor1', file)))\n", + "for file in os.listdir('D:/thesis/data/converted/raw/sensor1'):\n", + " ready_data1.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor1', file)))\n", "# ready_data1[1]\n", "# colormesh give title x is frequency and y is time and rotate/transpose the data\n", "# Plotting the STFT Data" @@ -337,8 +335,8 @@ "metadata": {}, "outputs": [], "source": [ - "ready_data1[1]\n", - "plt.pcolormesh(ready_data1[1])" + "# ready_data1[1]\n", + "plt.pcolormesh(ready_data1[2])" ] }, { @@ -362,9 +360,8 @@ "outputs": [], "source": [ "ready_data2 = []\n", - "for file in os.listdir('D:/thesis/data/working/sensor2'):\n", - " ready_data2.append(pd.read_csv(os.path.join('D:/thesis/data/working/sensor2', file)))\n", - "ready_data2[5]" + "for file in os.listdir('D:/thesis/data/converted/raw/sensor2'):\n", + " ready_data2.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor2', file)))" ] }, { @@ -384,10 +381,25 @@ "outputs": [], "source": [ "x1 = 0\n", - "\n", + "print(type(ready_data1[0]))\n", + "ready_data1[0].iloc[:,0]\n", + "# x1 = x1 + ready_data1[0].shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x1 = 0\n", + "print(type(x1))\n", "for i in range(len(ready_data1)):\n", - " print(ready_data1[i].shape)\n", + " # print(ready_data1[i].shape)\n", + " # print(ready_data1[i].)\n", + " print(type(ready_data1[i].shape[0]))\n", " x1 = x1 + ready_data1[i].shape[0]\n", + " print(type(x1))\n", "\n", "print(x1)" ] -- 2.49.1 From 1511012e115d15c7c617dd706cb8209865a05e63 Mon Sep 17 00:00:00 2001 From: nuluh Date: Sun, 20 Apr 2025 16:02:16 +0700 Subject: [PATCH 03/13] refactor(test): update test script to generate damage files index for dataset_B and adjust export path for processed data --- data/QUGS/test.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/data/QUGS/test.py b/data/QUGS/test.py index 0bf4240..12b39cf 100644 --- a/data/QUGS/test.py +++ b/data/QUGS/test.py @@ -1,12 +1,25 @@ from convert import * from joblib import dump, load -a = generate_damage_files_index( - num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A" +# a = generate_damage_files_index( +# num_damage=6, file_index_start=1, col=5, base_path="D:/thesis/data/dataset_A" +# ) + +b = generate_damage_files_index( + num_damage=6, + file_index_start=1, + col=5, + base_path="D:/thesis/data/dataset_B", + prefix="zzzBD", ) -data = DataProcessor(file_index=a) +# data_A = DataProcessor(file_index=a) +# # data.create_vector_column(overwrite=True) +# data_A.create_limited_sensor_vector_column(overwrite=True) +# data_A.export_to_csv("D:/thesis/data/converted/raw") + +data_B = DataProcessor(file_index=b) # data.create_vector_column(overwrite=True) -data.create_limited_sensor_vector_column(overwrite=True) -data.export_to_csv("D:/thesis/data/") +data_B.create_limited_sensor_vector_column(overwrite=True) +data_B.export_to_csv("D:/thesis/data/converted/raw_B") # a = load("D:/cache.joblib") -breakpoint() +# breakpoint() -- 2.49.1 From c8509aa7286a64e5af8cfe067c2db7248b761199 Mon Sep 17 00:00:00 2001 From: nuluh Date: Tue, 22 Apr 2025 10:55:34 +0700 Subject: [PATCH 04/13] fix(notebooks): fix out of index stft plotting iteration --- code/notebooks/stft.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/notebooks/stft.ipynb b/code/notebooks/stft.ipynb index 818669d..c8ef848 100644 --- a/code/notebooks/stft.ipynb +++ b/code/notebooks/stft.ipynb @@ -324,7 +324,6 @@ "ready_data1 = []\n", "for file in os.listdir('D:/thesis/data/converted/raw/sensor1'):\n", " ready_data1.append(pd.read_csv(os.path.join('D:/thesis/data/converted/raw/sensor1', file)))\n", - "# ready_data1[1]\n", "# colormesh give title x is frequency and y is time and rotate/transpose the data\n", "# Plotting the STFT Data" ] @@ -335,8 +334,8 @@ "metadata": {}, "outputs": [], "source": [ - "# ready_data1[1]\n", - "plt.pcolormesh(ready_data1[2])" + "ready_data1[0]\n", + "plt.pcolormesh(ready_data1[0])" ] }, { -- 2.49.1 From 72a7bce714ba8da26056db1aab9294f38fdfb5a9 Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 15 May 2025 06:40:22 +0700 Subject: [PATCH 05/13] feat(latex): add brief explanation of Short-Time Fourier Transform in theoretical foundation --- .../theoritical_foundation/stft.tex | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex index 889038c..27e1e63 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex @@ -1 +1,13 @@ -\subsection{Short-Time Fourier Transform} \ No newline at end of file +\subsection{Short-Time Fourier Transform} +\subsection{Short-Time Fourier Transform (STFT)} + +Short-Time Fourier Transform (STFT) adalah teknik fundamental yang digunakan untuk menganalisis sinyal non-stasioner, seperti yang diperoleh dari struktur dalam keadaan menerima beban dinamik atau eksitasi derau putih. Meskipun tradisional transformasi fourier memberikan informasi domain frekuensi, teknik ini tidak memiliki resolusi waktu. STFT mengatasi limitasi tersebut dengan menerapkan transformasi fourier segment-segment sinyal pendek yang tumpang tindih, dengan demikian diperoleh representasi waktu-frekuensi. + +Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut: +\begin{equation} +X(t, \omega) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j \omega \tau} d\tau +\end{equation} + +dengan $w(\tau - t)$ adalah sebuah fungsi jendela berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular. + +Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari struktur. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \ No newline at end of file -- 2.49.1 From 44ecb4639a65deb1c46d8d1b0252957d7704b933 Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 15 May 2025 06:41:39 +0700 Subject: [PATCH 06/13] feat(latex): add brief evaluation of classic machine learning algorithms for damage localization --- .../machine_learning.tex | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex index fa80259..ade6f14 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex @@ -1 +1,23 @@ -\subsection{Machine Learning} \ No newline at end of file +\subsection{Algoritma Pemelajaran Mesin Klasifikasi Klasik} + +Penelitian ini mengeavaluasi lima algoritma pemelajaran mesin klasik untuk melakukan tugas pengklasifikasian terhadap lokalisasi kerusakan. Setiap algoritma memiliki keunggulan dan limitasi masing-masing, dan performa untuk setiap algoritma dijadikan tolok ukur untuk mengidentifikasi manakah algoritma yang paling sesuai untuk setiap \textit{dataset} yang diberikan. + +\subsubsection{Support Vector Machine (SVM)} + +Mesin vektor pendukung (SVM) adalah sebuah algoritma pemelajaran mesin terarah yang mencari \textit{hyperplane} optimal dengan cara memisahkan data ke dalam kelas-kelas dengan margin maksimum. SVM bekerja dengan baik pada ruang dimensi tinggi dan cukup kokoh terhadap \textit{overfitting}, terutama pada kasus yang membutuhkan batasan margin secara jelas. + +SVM sesuai untuk klasifikasi sinyal getaran karena kemampuannya untuk mengatasi keputusan batasan-batasan non-linier apabila dilengkapi dengan fungsi kernel, seperti fungsi kernel berbasis radial (RBF). + +\subsubsection{K-Nearest Neighbors (KNN)} + +KNN merupakan sebuah algoritma pemelajaran non-parametrik, berbasis contoh. Algoritma ini mengklasifikasi titik data yang berbasis pada pungutan suara terbanyak dari tetangga terdekat $k$ pada ruang fitur. Meskipun dinilai sederhana, KNN dapat dinilai efektif ketika datanya terdistribusi dengan baik dan batasan-batasan pada kelasnya merata. + +Performa algoritma ini sensitif pada pemilihan $k$ dan jarak metriknya. Untuk data dengan dimensi tinggi seperti fitur STFT, mungkin diperlukan optimalisasi atau penskalaan dimensi. + +\subsubsection{Decision Tree (DT)} + +\subsubsection{Random Forest (RF)} + +\subsubsection{Bagged Trees (BT)} + +\bigskip \ No newline at end of file -- 2.49.1 From b4fb0d64a265c654f34cca390189e4c321cff395 Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 15 May 2025 22:52:42 +0700 Subject: [PATCH 07/13] feat(latex): add amsmath package for improved math support --- latex/thesis.cls | 1 + 1 file changed, 1 insertion(+) diff --git a/latex/thesis.cls b/latex/thesis.cls index 2690e56..cdb5606 100644 --- a/latex/thesis.cls +++ b/latex/thesis.cls @@ -20,6 +20,7 @@ \RequirePackage{etoolbox} \RequirePackage{tocloft} \RequirePackage{tocbibind} +\RequirePackage{amsmath,amsfonts,amssymb} % Polyglossia set language \setmainlanguage{bahasai} -- 2.49.1 From f9c47c9a7a3eeae27ac9ff3eb0f7b64b233a38ce Mon Sep 17 00:00:00 2001 From: nuluh Date: Fri, 16 May 2025 12:25:02 +0700 Subject: [PATCH 08/13] fix(latex): correct STFT equation notation in theoretical foundation Closes #72 --- .../id/02_literature_review/theoritical_foundation/stft.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex index 27e1e63..1593ee4 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex @@ -5,7 +5,7 @@ Short-Time Fourier Transform (STFT) adalah teknik fundamental yang digunakan unt Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut: \begin{equation} -X(t, \omega) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j \omega \tau} d\tau +\text{STFT}\{x(t)\}(t, \omega) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j\omega\tau} d\tau \end{equation} dengan $w(\tau - t)$ adalah sebuah fungsi jendela berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular. -- 2.49.1 From f68d48e52ba795698a97f08a1fddf73594f15ce7 Mon Sep 17 00:00:00 2001 From: nuluh Date: Fri, 16 May 2025 12:27:27 +0700 Subject: [PATCH 09/13] fix(latex): clarify STFT application in structural response analysis --- .../id/02_literature_review/theoritical_foundation/stft.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex index 1593ee4..158dc94 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex @@ -10,4 +10,4 @@ Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut: dengan $w(\tau - t)$ adalah sebuah fungsi jendela berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular. -Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari struktur. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \ No newline at end of file +Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari respon struktur terhadap getaran yang diberikan oleh mesin \textit{shaker}. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \ No newline at end of file -- 2.49.1 From 027b9d5860d657c590680db51948902775bf930b Mon Sep 17 00:00:00 2001 From: nuluh Date: Sun, 18 May 2025 00:42:05 +0700 Subject: [PATCH 10/13] feat(latex): add explanation of windowing function in theoretical foundation --- latex/chapters/id/02_literature_review/index.tex | 1 + .../theoritical_foundation/role_windowing.tex | 1 + 2 files changed, 2 insertions(+) create mode 100644 latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex diff --git a/latex/chapters/id/02_literature_review/index.tex b/latex/chapters/id/02_literature_review/index.tex index 885bacd..15c6029 100644 --- a/latex/chapters/id/02_literature_review/index.tex +++ b/latex/chapters/id/02_literature_review/index.tex @@ -4,4 +4,5 @@ \section{Dasar Teori} \input{chapters/id/theoritical_foundation/stft.tex} +\input{chapters/id/theoritical_foundation/role_windowing.tex} \input{chapters/id/theoritical_foundation/machine_learning.tex} diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex new file mode 100644 index 0000000..65f78e7 --- /dev/null +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex @@ -0,0 +1 @@ +Fungsi jendela $w(n)$ berfungsi untuk melokalisasi sinyal dalam domain waktu, dengan meruncingkan sinyal di kedua ujungnya guna meminimalkan diskontinuitas. Hal ini sangat penting untuk mengurangi **kebocoran spektral**—sebuah fenomena di mana energi sinyal menyebar ke bin frekuensi di sekitarnya akibat pemotongan sinyal secara tiba-tiba. Pemilihan jenis jendela sangat memengaruhi resolusi dan akurasi representasi waktu-frekuensi. -- 2.49.1 From 78c8d23428b98edfda5bba204d0ed912be80966a Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 22 May 2025 21:53:12 +0700 Subject: [PATCH 11/13] feat(latex): expand classification algorithms section with additional methods and details --- .../machine_learning.tex | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex index ade6f14..7ce8d61 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/machine_learning.tex @@ -1,10 +1,10 @@ -\subsection{Algoritma Pemelajaran Mesin Klasifikasi Klasik} +\subsection{Algoritma Klasifikasi} -Penelitian ini mengeavaluasi lima algoritma pemelajaran mesin klasik untuk melakukan tugas pengklasifikasian terhadap lokalisasi kerusakan. Setiap algoritma memiliki keunggulan dan limitasi masing-masing, dan performa untuk setiap algoritma dijadikan tolok ukur untuk mengidentifikasi manakah algoritma yang paling sesuai untuk setiap \textit{dataset} yang diberikan. +Penelitian ini mengevaluasi lima algoritma pemelajaran mesin klasik untuk melakukan tugas pengklasifikasian terhadap lokalisasi kerusakan. Setiap algoritma memiliki keunggulan dan limitasi masing-masing, dan performa untuk setiap algoritma dijadikan tolok ukur untuk mengidentifikasi manakah algoritma yang paling sesuai untuk setiap \textit{dataset} yang diberikan. \subsubsection{Support Vector Machine (SVM)} -Mesin vektor pendukung (SVM) adalah sebuah algoritma pemelajaran mesin terarah yang mencari \textit{hyperplane} optimal dengan cara memisahkan data ke dalam kelas-kelas dengan margin maksimum. SVM bekerja dengan baik pada ruang dimensi tinggi dan cukup kokoh terhadap \textit{overfitting}, terutama pada kasus yang membutuhkan batasan margin secara jelas. +Mesin vektor pendukung (SVM) adalah sebuah algoritma pemelajaran mesin terarah yang mencari \textit{hyperplane} optimal dengan cara memisahkan data ke dalam kelas-kelas dengan margin maksimum. SVM bekerja dengan baik pada ruang dimensi tinggi dan cukup kokoh terhadap \textit{overfitting}, terutama pada kasus yang membutuhkan batasan margin secara jelas \parencite{cortes1995}. SVM sesuai untuk klasifikasi sinyal getaran karena kemampuannya untuk mengatasi keputusan batasan-batasan non-linier apabila dilengkapi dengan fungsi kernel, seperti fungsi kernel berbasis radial (RBF). @@ -16,8 +16,30 @@ Performa algoritma ini sensitif pada pemilihan $k$ dan jarak metriknya. Untuk da \subsubsection{Decision Tree (DT)} +Decision Tree adalah algoritma pemelajaran terarah (\textit{supervised learning}) berbasis struktur pohon, di mana setiap \textit{node} internal mewakili suatu keputusan berdasarkan atribut tertentu, setiap cabang mewakili hasil dari keputusan tersebut, dan setiap daun (leaf node) mewakili label kelas. Algoritma ini secara rekursif membagi data ke dalam subset berdasarkan fitur yang memberikan informasi paling tinggi, seperti diukur dengan Gini index atau entropi (information gain). + +Kelebihan dari Decision Tree adalah interpretabilitasnya yang tinggi dan kemampuannya menangani data numerik maupun kategorikal. Namun, pohon keputusan rentan terhadap \textit{overfitting}, terutama jika kedalaman pohon tidak dikontrol. + \subsubsection{Random Forest (RF)} +Random Forest adalah metode ensemble yang terdiri dari banyak Decision Tree yang dilatih pada subset data dan subset fitur yang diacak. Setiap pohon dalam hutan memberikan prediksi, dan hasil akhir ditentukan melalui agregasi (misalnya, voting mayoritas untuk klasifikasi). + +Dengan menggabungkan banyak pohon, Random Forest mengurangi varian model dan meningkatkan generalisasi. Teknik ini efektif untuk dataset yang kompleks dan sangat cocok untuk menghindari \textit{overfitting} yang umum terjadi pada satu pohon keputusan tunggal. + \subsubsection{Bagged Trees (BT)} +\textit{Bagged Trees} atau \textit{Bootstrap Aggregated Trees} adalah pendekatan \textit{ensemble} yang mirip dengan Random Forest, namun perbedaannya terletak pada pemilihan fitur. Dalam \textit{Bagged Trees}, pohon-pohon dibangun dari sampel acak \textit{bootstrap} dari dataset pelatihan, tetapi tanpa pengacakan subset fitur seperti pada Random Forest. + +\subsubsection{XGBoost (Extreme Gradient Boosting)} + +XGBoost adalah algoritma pemelajaran mesin berbasis \textit{gradient boosting} yang dirancang untuk efisiensi dan performa tinggi. Algoritma ini bekerja dengan membangun model secara bertahap, di mana setiap pohon selanjutnya mencoba memperbaiki kesalahan dari pohon sebelumnya dengan mengoptimasi fungsi kerugian (\textit{loss function}) menggunakan metode gradien. + +XGBoost menggabungkan beberapa teknik seperti regularisasi $L1$ dan $L2$, pemangkasan pohon (\textit{pruning}), dan pemrosesan paralel, sehingga menghindari terjadinya \textit{overfitting} dan unggul dalam akurasi prediksi dibanding metode pohon lainnya. Algoritma ini sangat populer dalam kompetisi data karena kemampuannya menangani data besar, fitur multivariat, dan klasifikasi multi-kelas secara efisien. + +\subsubsection{Linear Discriminant Analysis (LDA)} + +Linear Discriminant Analysis (LDA) adalah teknik klasifikasi dan reduksi dimensi yang mengasumsikan bahwa data berasal dari distribusi normal multivariat dan memiliki kovarians yang seragam untuk setiap kelas. LDA bertujuan untuk memproyeksikan data ke ruang berdimensi lebih rendah yang memaksimalkan pemisahan antar kelas (rasio varians antar kelas terhadap varians dalam kelas). + +LDA sangat cocok ketika distribusi data mendekati normal dan jumlah fitur tidak terlalu besar dibanding jumlah sampel. Selain sebagai klasifikator, LDA juga sering digunakan sebagai teknik prapemrosesan untuk ekstraksi fitur sebelum digunakan dalam algoritma lain. + \bigskip \ No newline at end of file -- 2.49.1 From c9975dcd8d4d1fe107a6e51c9099b78403197f8f Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 22 May 2025 21:53:57 +0700 Subject: [PATCH 12/13] feat(latex): add Hann window section with definition and application details --- .../theoritical_foundation/hann.tex | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 latex/chapters/id/02_literature_review/theoritical_foundation/hann.tex diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/hann.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/hann.tex new file mode 100644 index 0000000..dbe88c9 --- /dev/null +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/hann.tex @@ -0,0 +1,20 @@ +\subsubsection{Hann window} +Salah satu fungsi \textit{windowing} yang paling umum digunakan dalam STFT adalah \textit{Hann window}. Jendela ni adalah jenis jendela kosinus yang memberikan hasil yang baik antara resolusi frekuensi dan kebocoran spektral. \textit{Hann windowing} diskret dengan panjang $N$ didefinisikan sebagai: + +\begin{equation} +w(n) = 0{.}5 \left(1 - \cos\left( \frac{2\pi n}{N - 1} \right) \right), \quad 0 \leq n \leq N - 1 +\end{equation} + +Fungsi ini secara halus meruncingkan sinyal menjadi nol di kedua ujungnya, sehingga mengurangi \textit{side lobe} dalam domain frekuensi sambil mempertahankan lebar \textit{lobe} utama yang relatif sempit. Dibandingkan dengan jendela persegi (rectangular window) yang memiliki tepi tajam, jendela Hann mengurangi fenomena Gibbs dan sangat cocok untuk aplikasi yang melibatkan estimasi spektral. + +% \subsubsection*{Alasan Penggunaan dalam STFT} + +% Jendela Hann sangat efektif digunakan dalam STFT karena keseimbangannya antara pelokalan waktu dan frekuensi: + +% \begin{itemize} +% \item \textbf{Lebar lobe utama}: Menentukan resolusi frekuensi. Jendela Hann memiliki lobe utama yang sedikit lebih lebar dibandingkan beberapa alternatif, yang berarti resolusinya sedikit berkurang namun kebocoran spektralnya lebih baik ditekan. +% \item \textbf{Redaman side lobe}: Side lobe pertama sekitar -31 dB, yang secara signifikan mengurangi kebocoran dibandingkan jendela persegi. +% \item \textbf{Kelembutan dalam domain waktu}: Turunan pertama yang kontinu mengurangi transisi mendadak pada tepi segmen sinyal yang dijendela. +% \end{itemize} + +% Hal ini membuat jendela Hann cocok untuk menganalisis sinyal dengan konten frekuensi yang berubah secara halus, seperti sinyal getaran, suara, atau sinyal biomedis. -- 2.49.1 From 3a5397c7a520372dc64c01f87b8e88d74a0462a8 Mon Sep 17 00:00:00 2001 From: nuluh Date: Thu, 22 May 2025 21:56:15 +0700 Subject: [PATCH 13/13] feat(latex): enhance literature review with detailed SHM methods and STFT explanation --- .../id/02_literature_review/index.tex | 31 ++++++++++++++++--- .../theoritical_foundation/role_windowing.tex | 3 +- .../theoritical_foundation/stft.tex | 8 ++--- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/latex/chapters/id/02_literature_review/index.tex b/latex/chapters/id/02_literature_review/index.tex index 15c6029..432a3a2 100644 --- a/latex/chapters/id/02_literature_review/index.tex +++ b/latex/chapters/id/02_literature_review/index.tex @@ -1,8 +1,31 @@ \chapter{TINJAUAN PUSTAKA DAN LANDASAN TEORI} \section{Tinjauan Pustaka} -\input{chapters/id/02_literature_review/abdeljaber2017.tex} +% \input{chapters/id/02_literature_review/index} +Metode monitor kesehatan struktur (SHM) tradisional sering kali mengandalkan fitur yang dibuat secara manual dan pengklasifikasi (\textit{classifier}) yang diatur secara manual, yang menimbulkan tantangan dalam hal generalisasi, keandalan, dan efisiensi komputasi. Seperti yang disorot oleh \textcite{abdeljaber2017}, pendekatan-pendekatan ini umumnya memerlukan proses \textit{trial-and-error} dalam pemilihan fitur dan pengklasifikasi yang tidak hanya mengurangi ketangguhan metode tersebut di berbagai jenis struktur, tetapi juga menghambat penerapannya dalam aplikasi \textit{real-time} karena beban komputasi pada fase ekstraksi fitur. + +\textcite{abdeljaber2017} memperkenalkan pendekatan deteksi kerusakan struktur berbasis CNN yang divalidasi melalui \textit{large-scale grandstand simulator} di Qatar University. Struktur tersebut dirancang untuk mereplikasi stadion modern, dilengkapi dengan 30 akselerometer, dan dikenai kerusakan terkontrol melalui pelonggaran baut sambungan antara balok dan gelagar. Data percepatan yang dikumpulkan di bawah eksitasi \textit{band-limited white noise} dan disampel pada 1024 Hz, kemudian dibagi menjadi bingkai berukuran 128 sampel untuk melatih 1-D CNN yang dilokalkan—satu untuk setiap sambungan (\textit{joint})—menciptakan sistem deteksi terdesentralisasi. Dalam dua fase (skenario) eksperimen, yang melibatkan pemantauan sebagian dan seluruh struktur, metode ini menunjukkan akurasi tinggi dalam pelokalisasian kerusakan, dengan kesalahan klasifikasi saat pelatihan hanya sebesar 0.54\%. Meskipun performa tetap andal bahkan dalam skenario kerusakan ganda, beberapa salah klasifikasi terjadi pada kasus kerusakan yang simetris atau berdekatan. Secara keseluruhan, metode yang diusulkan ini menawarkan solusi yang sangat efisien dan akurat untuk aplikasi SHM secara \textit{real-time}. + +\textcite{eraliev2022} memperkenalkan teknik baru untuk mendeteksi dan mengidentifikasi tahap awal kelonggaran pada sambungan baut ganda menggunakan algoritma pembelajaran mesin. Studi ini difokuskan pada sebuah motor yang dikencangkan dengan empat baut dan dioperasikan dalam tiga kondisi putaran berbeda (800 rpm, 1000 rpm, dan 1200 rpm) guna mengumpulkan data getaran yang cukup untuk dianalisis. Studi ini menyoroti keterbatasan metode inspeksi tradisional, seperti inspeksi visual dan teknik pukulan palu, yang dinilai memakan waktu dan rentan terhadap gangguan kebisingan lingkungan \parencite{j.h.park2015, kong2018}. + +Untuk meningkatkan akurasi deteksi, \textcite{eraliev2022} menggunakan transformasi Fourier waktu-singkat (STFT) sebagai metode ekstraksi fitur, yang menghasilkan 513 fitur frekuensidari sinyal getaran. Berbagai pengklasifikasi model pemelajaran mesin dilatih dan dievaluasi, dengan hasil menunjukkan performa yang memuaskan dalam mendeteksi baut longgar serta mengidentifikasi baut spesifik yang mulai kehilangan tegangan awal (preload). Studi ini juga menekankan pentingnya penempatan sensor, karena posisi sensor sangat memengaruhi akurasi dari pengklasifikasi yang digunakan \parencite{pham2020}. Temuan penelitian ini menunjukkan bahwa pengklasifikasi pada studi ini dapat digunakan untuk sistem pemantauan baut yang longgar secara daring (\textit{online monitoring}) pada pengaplikasian di masa depan, sehingga berkontribusi dalam pengembangan sistem pemantauan kesehatan struktur yang lebih baik. + +STFT diidentifikasi sebagai metode peningkatan sinyal yang efektif, bersanding dengan \textit{wavelet transform} dan \textit{fractional fourier transform}. Keunggulan STFT terletak pada kemampuannya dalam menganalisis sinyal non-stasioner secara lokal, yang dapat meningkatkan kualitas fitur dalam mengenali pola, termasuk dalam tugas-tugas klasifikasi berbasis respon getaran struktur \parencite{zhang2023}. + +Lebih lanjut, pendekatan yang dikembangkan oleh \textcite{garrido2016} menunjukkan potensi untuk menjembatani efektivitas fitur domain waktu-frekuensi dengan efisiensi pemrosesan model \textit{end-to-end}. Model ini mengintegrasikan proses STFT langsung ke dalam arsitektur jaringan \textit{feedforward}, memungkinkan sistem untuk tetap menggunakan representasi waktu-frekuensi namun tanpa biaya komputasi berat dari transformasi eksplisit di luar jaringan. Dengan demikian, pendekatan ini menawarkan jalan tengah yang menjanjikan antara kompleksitas 1-D CNN berbasis \textit{real-time raw signal} dan keunggulan struktural dari representasi domain frekuensi. Dalam konteks penelitian ini, meskipun transformasi dilakukan secara eksplisit, gagasan ini mendukung hipotesis bahwa representasi STFT dapat menjadi alternatif yang efisien dan kompetitif dibanding pemrosesan sinyal mentah dalam skenario pembelajaran mesin dengan sensor terbatas. + + +% \indent Metode berbasis getaran merupakan salah satu teknik paling umum dalam sistem pemantauan kesehatan struktur (SHM) karena kemampuannya dalam mendeteksi perubahan kondisi struktur secara non-destruktif. Pendekatan ini bergantung pada prinsip bahwa kerusakan pada suatu struktur, seperti kelonggaran sambungan atau penurunan kekakuan elemen, akan mengubah karakteristik dinamikanya, seperti frekuensi alami, bentuk mode, dan respons getaran terhadap eksitasi tertentu. + +% \indent Salah satu jenis kerusakan struktural yang umum dijumpai dalam sambungan mekanis adalah baut yang longgar akibat beban dinamis berulang, seperti getaran atau kejutan. Kondisi ini dapat menyebabkan penurunan integritas struktur dan berujung pada kegagalan sistem jika tidak terdeteksi sejak dini. Oleh karena itu, deteksi baut yang longgar secara dini telah menjadi perhatian utama dalam bidang teknik sipil, mesin, maupun dirgantara [1, 11]. + +\indent Teknik deteksi berbasis getaran terbukti efektif dalam mengidentifikasi tanda-tanda awal anomali pada sambungan. Hal ini dilakukan dengan menganalisis perubahan spektrum frekuensi atau energi getaran antar kondisi sehat dan rusak. Dalam praktiknya, data getaran biasanya dikumpulkan melalui akselerometer yang dipasang pada titik-titik tertentu dalam struktur. Perubahan karakteristik getaran, seperti penurunan amplitudo, pergeseran frekuensi dominan, atau pola spektral lainnya, menjadi indikator keberadaan dan lokasi kerusakan. Misalnya, studi oleh \textcite{zhao2019, eraliev2022} menunjukkan bahwa perubahan rotasi kepala baut akibat kelonggaran dapat dikaitkan dengan pola getaran tertentu. Sementara itu, pendekatan yang lebih umum dalam domain teknik sipil adalah memanfaatkan sinyal akselerasi dari sambungan kolom atau balok sebagai masukan untuk sistem klasifikasi kerusakan berbasis pembelajaran mesin. + +\indent Kelebihan utama dari pendekatan berbasis getaran dibanding metode visual atau inspeksi manual adalah kemampuannya dalam mendeteksi kerusakan mikro secara lebih dini, bahkan sebelum tampak secara fisik. Namun, tantangan tetap ada, terutama dalam penempatan sensor yang optimal, pemrosesan sinyal, dan interpretasi pola dinamik yang kompleks dalam struktur grid. Oleh karena itu, kombinasi antara teknik transformasi sinyal seperti Short-Time Fourier Transform (STFT) dan algoritma pembelajaran mesin menjadi arah baru yang menjanjikan dalam riset SHM masa kini. \section{Dasar Teori} -\input{chapters/id/theoritical_foundation/stft.tex} -\input{chapters/id/theoritical_foundation/role_windowing.tex} -\input{chapters/id/theoritical_foundation/machine_learning.tex} +\input{chapters/id/02_literature_review/theoritical_foundation/stft} +\input{chapters/id/02_literature_review/theoritical_foundation/role_windowing} +\input{chapters/id/02_literature_review/theoritical_foundation/hann} +\input{chapters/id/02_literature_review/theoritical_foundation/machine_learning} + +Dasar teori ini memberikan kerangka metodologi untuk mengimplementasi dan mengevaluasi usulan sistem lokalisasi kerusakan pada penelitian ini. Kokmbinasi dari analisis waktu-frekuensi menggunakan STFT dan klasifikasi pemelajaran mesin klasik memungkinkan ketercapaian monitor kesehatan struktur yang efisien dan mudah diterapkan. \ No newline at end of file diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex index 65f78e7..ca2a921 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/role_windowing.tex @@ -1 +1,2 @@ -Fungsi jendela $w(n)$ berfungsi untuk melokalisasi sinyal dalam domain waktu, dengan meruncingkan sinyal di kedua ujungnya guna meminimalkan diskontinuitas. Hal ini sangat penting untuk mengurangi **kebocoran spektral**—sebuah fenomena di mana energi sinyal menyebar ke bin frekuensi di sekitarnya akibat pemotongan sinyal secara tiba-tiba. Pemilihan jenis jendela sangat memengaruhi resolusi dan akurasi representasi waktu-frekuensi. +\subsubsection{Fungsi \textit{Windowing}} +Fungsi jendela $w(n)$ berfungsi untuk melokalisasi sinyal dalam domain waktu, dengan meruncingkan sinyal di kedua ujungnya guna meminimalkan diskontinuitas. Hal ini sangat penting untuk mengurangi kebocoran spektral—sebuah fenomena di mana energi sinyal menyebar ke bin frekuensi di sekitarnya akibat pemotongan sinyal secara tiba-tiba. Pemilihan jenis jendela sangat memengaruhi resolusi dan akurasi representasi waktu-frekuensi. diff --git a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex index 158dc94..446062d 100644 --- a/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex +++ b/latex/chapters/id/02_literature_review/theoritical_foundation/stft.tex @@ -1,13 +1,13 @@ -\subsection{Short-Time Fourier Transform} \subsection{Short-Time Fourier Transform (STFT)} Short-Time Fourier Transform (STFT) adalah teknik fundamental yang digunakan untuk menganalisis sinyal non-stasioner, seperti yang diperoleh dari struktur dalam keadaan menerima beban dinamik atau eksitasi derau putih. Meskipun tradisional transformasi fourier memberikan informasi domain frekuensi, teknik ini tidak memiliki resolusi waktu. STFT mengatasi limitasi tersebut dengan menerapkan transformasi fourier segment-segment sinyal pendek yang tumpang tindih, dengan demikian diperoleh representasi waktu-frekuensi. Secara matematis, STFT dari sinyal $x(t)$ diberikan sebagai berikut: \begin{equation} -\text{STFT}\{x(t)\}(t, \omega) = \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j\omega\tau} d\tau +X(m, \omega) = \sum_{n=-\infty}^{\infty} x[n] \cdot w[n - m] \cdot e^{-j \omega n} \end{equation} -dengan $w(\tau - t)$ adalah sebuah fungsi jendela berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular. -Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari respon struktur terhadap getaran yang diberikan oleh mesin \textit{shaker}. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \ No newline at end of file +dengan $w(\tau - t)$ adalah sebuah fungsi \textit{windowing} berpusat pada waktu $t$ dan $\omega$ adalah frekuensi angular. + +Pada studi ini, STFT digunakan untuk mengekstrak domain waktu-frekuensi dari sinyal getaran yang diperoleh dari dari respon struktur terhadap getaran yang diberikan oleh mesin \textit{shaker}. Fitur-fitur ini kemudian digunakan sebagai input pada klasifikasi pemelajaran mesin. Proces ini merekap frekuensi lokal setiap waktu, yang dinilai krusial pada pengidentifikasian perubahan struktur akibat kerusakan. \ No newline at end of file -- 2.49.1