\chapter{Classificação de Sobreposições de Dedos com Aprendizagem Automática}
\label{chapter:colisoes}


\section{Introdução}

O fecho da mão robótica para agarrar objetos pode, em muitos casos, ser realizado de forma uniforme, uma vez que a sua estrutura adaptativa permite uma conformação passiva às geometrias dos objetos manipulados. Contudo, no momento da libertação, surgem frequentemente situações em que os dedos se encontram sobrepostos ou em contacto entre si. Nestes casos, é essencial determinar a ordem mais adequada para a abertura dos dedos, de forma a evitar esforços excessivos nos motores e garantir movimentos suaves e controlados.

Tradicionalmente, a deteção de sobreposições entre componentes de sistemas robóticos é realizada através de métodos de cinemática direta. No entanto, em mãos robóticas antropomórficas, esta abordagem apresenta limitações relevantes. Estes sistemas incluem frequentemente componentes com geometrias irregulares e não modeladas como juntas convencionais, dificultando a aplicação de métodos cinemáticos clássicos. Em ambientes \ac{ROS} é possível utilizar ficheiros \ac{CAD} ou modelos \ac{URDF} para verificar a existência de sobreposições através da deteção de interseções de malhas. Apesar de eficazes, estes métodos requerem tempo de processamento considerável e poder computacional elevado, o que os torna pouco adequados para aplicações em tempo real ou em sistemas com recursos limitados.

Neste contexto, este capítulo propõe uma abordagem alternativa baseada em técnicas de aprendizagem automática. Serão treinados e comparados diferentes modelos de classificação, nomeadamente regressão logística, \ac{SVM} e redes neuronais com o objetivo de identificar o tipo de sobreposição entre dedos. Estes modelos utilizarão como entrada os dados adquiridos diretamente dos motores e sensores integrados na mão robótica desenvolvida neste projeto. Esta abordagem visa não só aumentar a eficiência e robustez da deteção de sobreposições, como também abrir caminho para a sua aplicação em tempo real no controlo da mão, promovendo interações mais seguras, inteligentes e adaptativas.



\section{Aquisição de dados experimentais}

Nesta secção descreve-se o processo de aquisição dos dados utilizados para o treino dos modelos de deteção de sobreposições. Inicialmente, apresenta-se o tipo de dados recolhidos a partir dos motores e sensores da mão robótica, detalhando os parâmetros monitorizados. Em seguida, são explicados os procedimentos experimentais adotados durante a recolha, incluindo os cenários de teste e as condições de sobreposição simuladas. Por fim, é apresentado o \textit{dataset} obtido, contendo as diferentes classes de sobreposição e respetivos dados associados.

\subsection{Descrição dos dados adquiridos}

Os motores Dynamixel disponibilizam uma vasta gama de dados em tempo real, incluindo posição, velocidade, corrente, tensão, temperatura, entre outros parâmetros internos. No entanto, para a construção de um \textit{dataset} adequado ao treino de uma rede neuronal, é fundamental selecionar cuidadosamente quais os dados a recolher. Utilizar todos os parâmetros disponíveis pode não só introduzir redundância como também aumentar significativamente a dimensionalidade do problema, o que pode levar a \textit{overfitting}, aumento do tempo de treino, necessidade de maior capacidade computacional e dificuldades na generalização do modelo.

Assim, nesta fase, foi efetuada uma seleção dos parâmetros mais relevantes para a tarefa de deteção de sobreposições entre os dedos da mão robótica. Foram recolhidas as posições angulares de todos os motores, por representarem diretamente o estado postural da mão, bem como as correntes consumidas, uma vez que aumentos súbitos ou valores anómalos de corrente podem indicar contacto físico ou resistência ao movimento.

Adicionalmente, foram incluídos os valores provenientes dos sensores de contacto integrados na mão robótica desenvolvida neste projeto, por fornecerem uma informação complementar crucial sobre a interação física entre os dedos ou com o ambiente. Estes dados sensoriais são particularmente úteis para confirmar a presença de contacto e, em conjunto com os dados dos motores, fornecer uma caracterização mais robusta da interseção.

A combinação destas três fontes de informação foi considerada suficiente para capturar os elementos mais relevantes à deteção e classificação das sobreposições, garantindo um bom equilíbrio entre riqueza informativa e complexidade computacional.

\subsection{Definição das Classes de Sobreposição}

Para que um modelo de aprendizagem automática consiga distinguir diferentes situações de contacto entre os dedos da mão robótica, é fundamental definir previamente as classes que representam os diferentes tipos de sobreposição a detetar. No presente trabalho foram consideradas três classes distintas, que cobrem os cenários mais relevantes observados durante a interação entre os dedos, nomeadamente entre o polegar e os restantes dedos:

\begin{itemize}
    \item \textbf{Classe 0 – Sem sobreposição:} corresponde ao cenário em que os dedos da mão robótica executam os movimentos de fecho e abertura sem qualquer interferência física entre si. Esta classe representa o comportamento desejado em operações normais, como o agarrar e largar de objetos, sem sobreposição de dedos.

    \item \textbf{Classe 1 – Sobreposição com o polegar por baixo:} nesta classe ocorre contacto entre dedos, sendo o polegar o dedo que se encontra fisicamente por baixo de outro(s) dedo(s) durante a interseção.

    \item \textbf{Classe 2 – Sobreposição com o polegar por cima:} nesta situação também existe sobreposição entre dedos, mas com o polegar localizado por cima do(s) dedo(s) com o(s) qual/quais colide.

\end{itemize}

Estas classes foram escolhidas por refletirem casos típicos e relevantes para o controlo seguro e eficiente da mão robótica antropomórfica. A sua correta identificação permite tomar decisões informadas durante a execução de tarefas, como ajustar a ordem de abertura dos dedos para evitar esforços desnecessários ou interseções indesejadas.

As situações descritas para cada classe podem ser observadas na Figura~\ref{fig:classes}. A Figura~\ref{fig:classe_0} ilustra um exemplo da Classe 0, onde não existe qualquer sobreposição entre os dedos. A Figura~\ref{fig:classe_1} mostra a situação correspondente à Classe 1, na qual o polegar se encontra por baixo de outro dedo. Por fim, a Figura~\ref{fig:classe_2} apresenta a Classe 2, caracterizada pela sobreposição do polegar por cima dos restantes dedos.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/classe0.jpg}
    \caption{Exemplo de situação para a classe 0}
    \label{fig:classe_0}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/classe1.jpg}
    \caption{Exemplo de situação para a classe 1}
    \label{fig:classe_1}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/classe2.jpg}
    \caption{Exemplo de situação para a classe 2}
    \label{fig:classe_2}
\end{subfigure}
\caption{Situações de utilização da mão para as diferentes classes de sobreposições dos dedos descritas}
\label{fig:classes} 
\end{figure}






\subsection{Procedimentos de Aquisição}
\label{sec:aquisicao}

Para a aquisição dos dados utilizados no treino da rede neuronal, partiu-se da funcionalidade de ajuste dinâmico de corrente no contacto com objetos, anteriormente descrita na Secção~\ref{sec:ajuste_corrente}. Esta funcionalidade permite detetar, em tempo real, quando um dedo entra em contacto com um objeto através do aumento da corrente consumida pelos motores e da diminuição da sua velocidade.

A partir desta base, foi desenvolvida uma estratégia para automatizar o processo de recolha de dados. O nó \texttt{set\_positions} foi adaptado para permitir a execução automática de movimentos específicos da mão, seguidos de um curto período de espera e posterior reabertura. Este nó aceita, via terminal, os comandos 0, 1 ou 2, cada um associado a uma classe distinta de movimento:

\begin{itemize}
    \item \textbf{0}: a mão fecha e abre com velocidades iguais em todos os dedos;

    \item \textbf{1}: o polegar inicia o fecho primeiro e é o último a abrir;

    \item \textbf{2}: o polegar é o último a fechar e o primeiro a abrir.
\end{itemize}

Quando um destes comandos é introduzido, o nó \texttt{set\_positions} executa automaticamente o movimento correspondente, aguardando 2 segundos após o fecho para iniciar a abertura. Simultaneamente, este nó publica a classe correspondente num novo tópico, ao qual o nó \texttt{collect\_data} está subscrito. Ao receber esta informação, o nó \texttt{collect\_data} atualiza automaticamente a variável \texttt{self.my\_class}, associando a classe correta aos dados que venham a ser recolhidos durante essa interação.

Além disso, sempre que os motores de um dedo publicam uma mensagem com os novos valores de corrente limite no nó \texttt{set\_currents}, o código publica também uma mensagem no tópico \texttt{state}. Esta mensagem binária indica o estado da mão: \textbf{0} quando nenhum dedo está em contacto (sem esforço e sem ajuste de corrente), e \textbf{1} quando pelo menos um dedo está em carga e com a corrente ajustada.

O nó \texttt{collect\_data} atua com base neste sinal. Está subscrito ao tópico \texttt{state} e só entra em funcionamento quando o valor é 1. Nessa situação, guarda automaticamente os valores das posições e correntes de todos os motores, bem como os dados obtidos pelos sensores de contacto da mão robótica. Quando o valor é 0, o nó permanece inativo.

Este sistema revelou-se particularmente útil, pois permite automatizar e otimizar o processo de aquisição de dados, tornando possível recolher vários conjuntos de dados dentro da mesma experiência, sempre que ocorrer um contacto relevante. O diagrama da Figura~\ref{fig:fluxograma_recolha_dados} ilustra a estratégia desenvolvida para automatizar a recolha de dados, facilitando a compreensão das condições que ativam ou inibem o armazenamento da informação.

\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{figs/chapter5/diagrama_aquisicao.png}
\caption{Fluxograma da estratégia de automatização da recolha de dados.}
\label{fig:fluxograma_recolha_dados}
\end{figure}

Para a construção do \textit{dataset}, foram utilizados três objetos com diferentes formas e propriedades físicas: uma bola (Figura ~\ref{fig:bola}), um cubo de \textit{Rubik} (Figura ~\ref{fig:cubo}) e um estojo com geometria aproximadamente cilíndrica (Figura ~\ref{fig:estojo}). Cada experiência de contacto foi realizada em oito posições distintas, correspondentes aos oito octantes do espaço tridimensional, de forma a representar diferentes configurações de interação entre os dedos e os objetos, considerando também os efeitos da gravidade. Para garantir a variabilidade e robustez dos dados, cada experiência foi repetida dez vezes por objeto e por posição, permitindo obter um conjunto diversificado e representativo de situações reais de utilização.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/bola.jpg}
    \caption{Bola utilizada na aquisição de dados}
    \label{fig:bola}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/cubo.jpg}
    \caption{Cubo utilizado na aquisição de dados}
    \label{fig:cubo}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/estojo.jpg}
    \caption{Estojo utilizado na aquisição de dados}
    \label{fig:estojo}
\end{subfigure}
\caption{Objetos utilizados na aquisição de dados.}
\label{fig:objetos} 
\end{figure}


Esta abordagem permitiu recolher dados de forma sistemática e eficiente, facilitando a criação de um \textit{dataset} adequado para o treino de modelos de deteção de sobreposições entre dedos.


\subsection{\textit{Dataset} adquirido}

A partir do processo de aquisição automatizado desenvolvido e descrito anteriormente, e após a realização das experiências com todas as combinações de posições e número de repetições indicados na Subsecção~\ref{sec:aquisicao}, foi possível construir um \textit{dataset} composto por um total de 6234 amostras, todas distintas entre si. Cada entrada no \textit{dataset} corresponde a uma configuração única de interação entre a mão robótica e os objetos utilizados, refletindo variações nas posições relativas, forças de contacto e estados dos motores, o que resulta numa base de dados diversificada e representativa de diferentes cenários de sobreposição entre dedos.

Adicionalmente, os vídeos exemplificativos das aquisições realizadas para cada um dos objetos testados podem ser consultados no Apêndice~\ref{appendix:videos_aquisicao}, permitindo visualizar o contexto físico associado a cada tipo de interação registada.


\section{Desenvolvimento e Avaliação de Modelos de Deteção de Sobreposições}

Nesta secção é apresentado o processo de desenvolvimento e avaliação de modelos de aprendizagem automática aplicados à deteção de sobreposições entre os dedos da mão robótica. O principal objetivo consiste em identificar automaticamente a classe de sobreposição em que a mão se encontra, com base nos dados adquiridos.

A secção está organizada em duas partes principais. Na primeira descreve-se o processo de preparação dos dados, incluindo as matrizes de correlação entre os dados. Na segunda parte são apresentados os diferentes algoritmos de classificação utilizados, nomeadamente a Regressão Logística, \ac{SVM} e uma Rede Neuronal.

As implementações dos modelos de Regressão Logística e \ac{SVM} foram realizadas com recurso à biblioteca \textit{Scikit-learn}, amplamente utilizada para tarefas de aprendizagem supervisionada. A Rede Neuronal foi desenvolvida com a biblioteca \textit{TensorFlow}, que permite maior flexibilidade na definição e treino de arquiteturas neuronais. A comparação dos desempenhos destes modelos visa selecionar a abordagem mais adequada para integrar no sistema de controlo da mão robótica, contribuindo para uma atuação mais inteligente, segura e adaptativa.

\subsection{Preparação dos dados}

Na aplicação de modelos de aprendizagem automática, uma etapa essencial consiste na análise preliminar do \textit{dataset}, com o objetivo de compreender a natureza das variáveis, identificar possíveis desequilíbrios entre classes e detetar padrões ou correlações relevantes. Esta análise permite não apenas melhorar o desempenho dos modelos, mas também garantir uma interpretação mais robusta dos seus resultados.

Um dos primeiros passos realizados consiste na verificação do balanceamento das classes. Para tal, foi construído um gráfico circular, representado na Figura~\ref{fig:grafico_circular}, que permite visualizar a distribuição das amostras por classe. 


\begin{figure}[h]
\centering
\includegraphics[width=0.6\textwidth]{figs/chapter5/grafico_circular.png}
\caption{Gráfico com a distribuição das classes do \textit{dataset}.}
\label{fig:grafico_circular}
\end{figure}


Através da análise do gráfico observa-se que aproximadamente 27.8\% dos dados pertencem à Classe 0 (sem sobreposição), 35.7\% à Classe 1 (polegar por baixo) e 36.6\% à Classe 2 (polegar por cima). Esta distribuição revela que o \textit{dataset} está relativamente bem balanceado, o que é um fator importante para evitar possíveis falhas durante o treino dos modelos.

Outro aspeto crucial na preparação dos dados consistiu na análise da correlação entre as \textit{features} e a variável de classe. Esta análise tem como objetivo principal identificar que variáveis estão mais associadas a cada uma das classes, podendo assim contribuir para a seleção de \textit{features} relevantes e para uma melhor compreensão dos padrões existentes nos dados.

Para este efeito, foi utilizado o coeficiente de correlação de Pearson, que avalia a intensidade e direção da relação linear entre duas variáveis numéricas cuja expressão é apresentada na Equação ~\ref{eq:corr}:

\begin{equation}
r_{X,Y} = \frac{\sum_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum_{i=1}^{n}(X_i - \bar{X})^2} \cdot \sqrt{\sum_{i=1}^{n}(Y_i - \bar{Y})^2}}
\label{eq:corr}
\end{equation}


onde:
\begin{itemize}
    \item \(X_i\) e \(Y_i\) são os valores das variáveis \(X\) e \(Y\) na \(i\)-ésima observação;
    \item \(\bar{X}\) e \(\bar{Y}\) são as médias das variáveis \(X\) e \(Y\);
    \item \(n\) é o número total de observações.
\end{itemize}

Este coeficiente assume valores entre -1 e 1, sendo que valores próximos de 1 indicam uma forte correlação positiva, valores próximos de -1 indicam uma forte correlação negativa, e valores próximos de 0 indicam ausência de correlação linear.

No entanto, como a variável de classe é categórica, contendo três categorias distintas, não é possível calcular diretamente a correlação de Pearson com as \textit{features} numéricas. Para contornar esta limitação, aplicou-se a técnica de \textit{one-hot encoding}, que consiste em transformar uma variável categórica em múltiplas variáveis binárias. No caso específico deste trabalho, a variável de classe foi convertida em três novas colunas binárias, cada uma representando uma das classes possíveis. Cada coluna assume o valor 1 se a amostra pertence à classe correspondente, e 0 caso contrário.


Dado que o \textit{dataset} contém 37 variáveis numéricas, incluindo posições dos motores, valores de corrente e leituras dos sensores de força, a representação de todas as correlações numa única matriz resultaria numa visualização demasiado densa e de difícil interpretação. Por este motivo, optou-se por apresentar os resultados em três matrizes de correlação distintas:

\begin{itemize}
    \item A Figura~\ref{fig:matriz_posicoes} apresenta a matriz de correlação referente às posições dos motores;
    \item A Figura~\ref{fig:matriz_correntes} mostra a matriz de correlação para os valores de corrente;
    \item A Figura~\ref{fig:matriz_sensores} exibe a matriz de correlação correspondente às leituras dos sensores FSR.
\end{itemize}


Em cada uma destas matrizes, as três últimas linhas correspondem às variáveis geradas pelo \textit{one-hot encoding} da classe e são de particular importância. Estas linhas mostram, para cada \textit{feature}, o grau de correlação com cada uma das classes, permitindo identificar as variáveis mais relevantes para distinguir entre as diferentes classes. Esta análise é especialmente útil para orientar a seleção de \textit{features} e melhorar o desempenho dos modelos de classificação desenvolvidos posteriormente caso os resultados obtidos com os modelos iniciais não sejam satisfatórios


\begin{figure}[h]
\centering
\includegraphics[width=0.7\textwidth]{figs/chapter5/matriz_posicoes.png}
\caption{Matriz de correlação obtida para as posições e classes}
\label{fig:matriz_posicoes}
\end{figure}

\begin{figure}[h]
\centering
\includegraphics[width=0.7\textwidth]{figs/chapter5/matriz_correntes.png}
\caption{Matriz de correlação obtida para as correntes e classes}
\label{fig:matriz_correntes}
\end{figure}



A partir da análise da matriz de correlação das posições dos motores (Figura~\ref{fig:matriz_posicoes}) é possível verificar que as variáveis com maior correlação com a \textbf{classe 0} são as \textbf{Posições 1, 5 e 15}, correspondentes, respetivamente, ao primeiro motor do \textit{dedo indicador} (\textit{index finger}), ao primeiro motor do \textit{dedo médio} (\textit{middle finger}) e ao terceiro motor do \textit{polegar} (\textit{thumb}). Para a \textbf{classe 1}, destacam-se as \textbf{Posições 2, 13 e 15}, que representam o segundo motor do \textit{dedo indicador}, o primeiro motor do \textit{polegar} e novamente o terceiro motor do \textit{polegar}, sugerindo uma forte associação entre esta classe e os movimentos deste dedo. No caso da \textbf{classe 2}, as posições com maior correlação são as \textbf{Posições 1, 2, 5 e 9}, relativas ao primeiro e segundo motores do \textit{dedo indicador}, ao primeiro motor do \textit{dedo médio} e ao primeiro motor do \textit{dedo anelar} (\textit{ring finger}). Estes resultados evidenciam que o \textit{dedo indicador} participa de forma relevante em todas as classes, o que é coerente do ponto de vista biomecânico, dado que este dedo desempenha frequentemente um papel central em tarefas manuais e de preensão por ser o mais próximo do polegar.




Relativamente à matriz de correlação das correntes dos motores (Figura~\ref{fig:matriz_correntes}) verifica-se que as variáveis com maior correlação com a \textbf{classe 0} são as \textbf{Correntes 3, 4, 8 e 11}, que correspondem, respetivamente, ao terceiro e quarto motores do \textit{dedo indicador} (\textit{index finger}), ao quarto motor do \textit{dedo médio} (\textit{middle finger}) e ao terceiro motor do \textit{dedo anelar} (\textit{ring finger}). Para a \textbf{classe 1}, as correntes mais correlacionadas são as \textbf{Correntes 2, 3 e 4}, que abrangem praticamente todo o \textit{dedo indicador}, com exceção do primeiro motor, indicando que este dedo tem um papel predominante na execução dos gestos associados a esta classe. No que respeita à \textbf{classe 2}, destacam-se as \textbf{Correntes 2, 8 e 14}, que dizem respeito ao segundo motor do \textit{dedo indicador}, ao último motor do \textit{dedo médio} e ao segundo motor do \textit{polegar} (\textit{thumb}).

\begin{figure}[h]
\centering
\includegraphics[width=0.7\textwidth]{figs/chapter5/matriz_sensores.png}
\caption{Matriz de correlação obtida para os sensores e classes}
\label{fig:matriz_sensores}
\end{figure}

Por fim, na análise da matriz de correlação das leituras dos sensores (Figura~\ref{fig:matriz_sensores}) verifica-se que, para a \textbf{classe 0}, os sensores com maior correlação são os \textbf{Sensores 1, 3 e 5}, correspondentes, respetivamente, aos sensores posicionados no \textit{dedo anelar} (\textit{ring finger}), no \textit{dedo indicador} (\textit{index finger}) e na \textit{palma da mão}. Para a \textbf{classe 1}, os sensores mais relevantes em termos de correlação são os \textbf{Sensores 3 e 4}, localizados no \textit{dedo indicador} e no \textit{polegar} (\textit{thumb}), o que evidencia a importância do polegar na execução dos gestos associados a esta classe. Por fim, no que respeita à \textbf{classe 2}, os sensores mais correlacionados são os \textbf{Sensores 1 e 5}, ambos relacionados com o \textit{dedo anelar} e a \textit{palma da mão}, respetivamente. 



Esta análise exploratória permite, portanto, obter uma compreensão mais profunda da influência de cada variável, podendo futuramente apoiar estratégias de seleção de \textit{features} ou de interpretação do comportamento dos modelos treinados.

\subsection{Métodos Testados}

Após a análise e preparação do \textit{dataset} adquirido, procede-se à implementação dos métodos de aprendizagem automática selecionados para o problema de deteção de sobreposições entre os dedos da mão robótica. Nesta subsecção descreve-se a aplicação de três abordagens distintas: Regressão Logística, \ac{SVM} e uma Rede Neuronal. Para cada uma destas abordagens é apresentada uma breve descrição do seu funcionamento, bem como os principais parâmetros considerados na sua implementação.

Na fase de testes, o conjunto de dados é dividido em dois subconjuntos: 80\% dos dados são utilizados para treino dos modelos e os restantes 20\% para avaliação do seu desempenho. Esta divisão garante que a avaliação é realizada com dados que não foram previamente vistos pelos modelos, contribuindo para uma estimativa mais realista da sua capacidade de generalização.

Adicionalmente, recorreu-se à técnica de \textit{cross-validation} com 10 \textit{folds}, um método amplamente utilizado para avaliar a performance de modelos de forma mais robusta. Nesta técnica, o \textit{dataset} de treino é dividido em 10 subconjuntos (ou \textit{folds}) aproximadamente iguais. Em cada iteração, nove \textit{folds} são usados para treinar o modelo e o \textit{fold} restante é utilizado para validação. Este processo repete-se até que cada \textit{fold} tenha sido usado como conjunto de validação uma vez e os resultados obtidos são então agregados. Esta abordagem permite reduzir a variância associada a uma única divisão dos dados e fornece uma avaliação mais estável do desempenho dos modelos \cite{Meenu2025}. Na figura ~\ref{fig:cross_validation} observa-se um esquema de funcionamento do \textit{cross-validation}.

\begin{figure}[h]
\centering
\includegraphics[width=0.8\textwidth]{figs/chapter5/cross_val.png}
\caption[Esquema com a lógica de funcionamento do \textit{cross-validation}, presente no trabalho de Meenu et al.]{Esquema com a lógica de funcionamento do \textit{cross-validation}, presente no trabalho de Meenu et al.\cite{Meenu2025}.}
\label{fig:cross_validation}
\end{figure}


\subsubsection{Regressão Logística}


A regressão logística é um modelo de classificação linear amplamente utilizado em tarefas supervisionadas, particularmente devido à sua simplicidade, interpretabilidade e desempenho competitivo em muitos contextos. Embora seja originalmente concebida para problemas binários, a regressão logística pode ser estendida para problemas multiclasse através de diferentes estratégias. Neste trabalho, foi utilizada a abordagem \textit{multinomial}, também conhecida como regressão softmax, que modela diretamente a probabilidade de cada classe com base numa generalização da função sigmoide, a função softmax\cite{geron2019hands}.

Na abordagem softmax, para um conjunto de classes $\{1, 2, ..., K\}$, a probabilidade predita de uma amostra $\mathbf{x}$ pertencer à classe $k$ é dada pela expressão presente na Equação~\ref{eq:softmax}:

\begin{equation}
P(y = k \mid \mathbf{x}) = \frac{e^{\mathbf{w}_k^\top \mathbf{x}}}{\sum_{j=1}^K e^{\mathbf{w}_j^\top \mathbf{x}}}
\label{eq:softmax}
\end{equation}



Onde $\mathbf{w}_k$ é o vetor de pesos associado à classe $k$.

Nesta implementação recorreu-se à biblioteca \texttt{scikit-learn}\cite{scikit-learn}, utilizando um \texttt{Pipeline} que inclui a normalização das variáveis de entrada através da técnica \texttt{StandardScaler}, uma etapa fundamental para garantir um bom desempenho da regressão logística, seguida pela aplicação do modelo de regressão logística com um número máximo de iterações definido em 5000 para assegurar a convergência. No bloco de código,~\ref{lst:logreg_pipeline}, apresenta-se o código desenvolvido para inicializar o \textit{pipeline} da regressão logística.

\begin{lstlisting}[language=Python, caption=Pipeline da Regressão Logística Multiclasse, label=lst:logreg_pipeline,captionpos=b]
pipeline_logreg = Pipeline([
    ('scaler', StandardScaler()),
    ('logreg', LogisticRegression(max_iter=5000))
])
\end{lstlisting}


De forma a encontrar os melhores hiperparâmetros, recorreu-se a um processo de \textit{Grid Search}, uma técnica de otimização que testa exaustivamente combinações de parâmetros especificadas pelo utilizador. Esta procura foi realizada com validação cruzada de 10 \textit{folds}, o que permite avaliar a robustez do modelo reduzindo o risco de \textit{overfitting} e garantindo que cada classe está representada em todas as divisões do conjunto de treino.

Os parâmetros testados incluíram diferentes valores para o termo de regularização $C$, diferentes opções para ponderação de classes, penalização e algoritmos de otimização. Os valores testados encontram-se representados no excerto de código ~\ref{lst:logreg_grid}

\begin{lstlisting}[language=Python, caption=Parâmetros utilizados no Grid Search para a Regressão Logística, label=lst:logreg_grid,captionpos=b]
param_grid = {
    'logreg__C': [0.001, 0.01, 0.1, 1, 10, 100],
    'logreg__class_weight': [None, 'balanced'],
    'logreg__penalty': ['l2'],
    'logreg__solver': ['lbfgs', 'newton-cg', 'saga'],
}
\end{lstlisting}


Após a execução do processo de afinação, a melhor configuração foi selecionada com base na métrica de \textit{accuracy} e os melhores hiperparâmetros encontrados foram:

\begin{itemize}
    \item \texttt{C}: 100
    \item \texttt{class\_weight}: \texttt{balanced}
    \item \texttt{penalty}: \texttt{l2}
    \item \texttt{solver}: \texttt{newton-cg}
\end{itemize}

O modelo foi então treinado no conjunto de treino, tendo convergido ao fim de 12 iterações.

 
\subsubsection{Support Vector Machine}

As \ac{SVM} são algoritmos supervisionados amplamente utilizados para tarefas de classificação e regressão, sendo particularmente eficazes em problemas com elevada dimensionalidade e estruturas complexas de dados \cite{cortes1995support}. O seu princípio fundamental consiste na identificação do \textbf{hiperplano ótimo} que separa os dados de diferentes classes, maximizando a margem entre os pontos de dados mais próximos desse hiperplano, denominados \textit{vetores de suporte}.

A ideia subjacente é que ao maximizar esta margem, o modelo se torna mais robusto a novas observações e menos suscetível ao sobreajuste. Nos casos em que os dados não são linearmente separáveis no espaço original, a \ac{SVM} recorre ao uso de funções de transformação denominadas \textit{kernels}, que projetam os dados para um espaço de maior dimensionalidade onde a separação linear é viável. Esta técnica, conhecida como \textit{kernel trick}, permite à SVM resolver problemas não lineares sem aumentar explicitamente a complexidade computacional do modelo.

Apesar de a SVM ter sido originalmente concebida para problemas de classificação binária, é possível adaptá-la a problemas multiclasse através de abordagens como \textit{one-vs-rest} (OvR), onde são treinados $K$ classificadores binários (um por classe), sendo cada classificador responsável por distinguir uma classe contra todas as outras. Esta abordagem foi automaticamente utilizada na implementação com a biblioteca \texttt{scikit-learn}.

O funcionamento da SVM é controlado por um conjunto de hiperparâmetros que influenciam diretamente a sua capacidade de generalização:

\begin{itemize}
    \item \textbf{$C$}: parâmetro de regularização que controla o equilíbrio entre a maximização da margem e a penalização de erros de classificação. 
    
    \item \textbf{$\gamma$}: parâmetro utilizado nos \textit{kernels} não lineares, como o \ac{RBF}, que determina a influência de cada ponto de treino. 
    
    \item \textbf{\texttt{kernel}}: função de transformação usada para mapear os dados para um espaço de maior dimensionalidade. Os principais tipos de \textit{kernel} disponíveis são:
    \begin{itemize}
        \item \texttt{linear} – adequado quando os dados são aproximadamente linearmente separáveis.
        \item \texttt{rbf} (Radial Basis Function) – indicado para separações complexas e não lineares.
        \item \texttt{poly} – aplica uma transformação polinomial ao espaço de entrada.
        \item \texttt{sigmoid} – semelhante às funções de ativação usadas em redes neuronais.
    \end{itemize}
    
    \item \textbf{\texttt{degree}}: define o grau do polinómio utilizado no \textit{kernel} \texttt{poly}. Quanto maior o grau, maior a complexidade do modelo.
    
    \item \textbf{\texttt{coef0}}: parâmetro que representa o termo independente nas funções \texttt{poly} e \texttt{sigmoid}, influenciando a forma da superfície de decisão.
\end{itemize}

A \textit{pipeline} desenvolvida para aplicar a SVM encontra-se descrita no bloco de código~\ref{lst:svm_pipeline}. Numa primeira etapa, os dados são normalizados utilizando \texttt{StandardScaler}, dado que a SVM é sensível à escala das variáveis. De seguida, é aplicado o classificador \texttt{SVC} da \texttt{scikit-learn}, permitindo configurar diferentes \textit{kernels} e hiperparâmetros.

\begin{lstlisting}[language=Python, caption=Pipeline da SVM com normalização, label=lst:svm_pipeline,captionpos=b]
pipeline_svm = Pipeline([
    ('scaler', StandardScaler()),
    ('svm', SVC())
])
\end{lstlisting}

Para encontrar a combinação de hiperparâmetros mais adequada foi utilizada a técnica de \textit{Grid Search} com validação cruzada de 10 \textit{folds}, apresentada no código~\ref{lst:gridsearch_svm}. Foram considerados diferentes \textit{kernels} e valores para os parâmetros \texttt{C}, \texttt{gamma}, \texttt{degree} e \texttt{coef0}.

\begin{lstlisting}[language=Python, caption=Parâmetros utilizados no Grid Search para a SVM, label=lst:gridsearch_svm,captionpos=b]
param_grid_svm = {
    'svm__kernel': ['linear', 'rbf', 'poly', 'sigmoid'],
    'svm__C': [0.01, 0.1, 1, 10, 100],  
    'svm__gamma': ['scale', 'auto', 1, 0.1, 0.01, 0.001],
    'svm__degree': [2, 3, 4],
    'svm__coef0': [0.0, 0.5, 1.0]
}
\end{lstlisting}

O critério de avaliação utilizado durante a otimização foi a \texttt{accuracy}. Após a execução da pesquisa exaustiva, os melhores hiperparâmetros encontrados foram:

\begin{itemize}
    \item \texttt{C}: 100
    \item \texttt{kernel}: \texttt{rbf}
    \item \texttt{gamma}: 0.1
    \item \texttt{degree}: 2
    \item \texttt{coef0}: 0.0
\end{itemize}

Esta abordagem permitiu encontrar uma configuração adequada para a tarefa de deteção de sobreposição entre os dedos da mão robótica, assegurando uma elevada capacidade preditiva e uma boa generalização em validação cruzada.





\subsubsection{Rede Neuronal}


As redes neuronais artificiais são modelos computacionais inspirados no funcionamento do cérebro humano. São compostas por camadas de unidades interligadas, denominados neurónios artificiais, capazes de aprender padrões complexos a partir dos dados. Cada neurónio recebe um conjunto de entradas ponderadas, aplica uma função de ativação e transmite a sua saída para os neurónios da camada seguinte. O processo de aprendizagem realiza-se através de algoritmos de retropropagação do erro e técnicas de otimização, que ajustam iterativamente os pesos das ligações com base na discrepância entre a saída prevista e o valor real \cite{goodfellow2016deep}.

A arquitetura implementada neste trabalho corresponde a uma \textbf{rede neuronal totalmente conectada} (do inglês, \textit{fully connected neural network}), na qual cada neurónio está ligado a todos os neurónios da camada anterior e da camada seguinte. Este tipo de arquitetura é particularmente adequado para tarefas de classificação com dados tabulares, como os utilizados neste projeto.

O modelo foi desenvolvido com recurso à biblioteca \texttt{TensorFlow}, recorrendo à interface de alto nível \texttt{Keras}. A estrutura da rede inclui:

\begin{itemize}
    \item Uma camada oculta densa, com número variável de unidades, cuja função de ativação pode ser \texttt{ReLU} ou \texttt{tanh}, determinadas durante a otimização dos hiperparâmetros.
    
    \item Uma \textbf{camada de Dropout}, que desativa aleatoriamente uma fração das unidades durante o treino. Esta técnica, proposta por Srivastava et al.~\cite{srivastava2014dropout}, tem como objetivo reduzir o \textit{overfitting}, impedindo que o modelo dependa excessivamente de caminhos específicos e incentivando a aprendizagem de representações mais generalizáveis e robustas.
    
    \item Uma camada de saída com três neurónios (correspondentes às três classes alvo), utilizando a função de ativação \texttt{softmax}, que converte os valores de saída num vetor de probabilidades cuja soma é igual a 1, adequado para classificação multiclasse.
\end{itemize}

Para treinar a rede, foi utilizada a função de custo \texttt{sparse\_categorical\_crossentropy}, apropriada para problemas de classificação com rótulos inteiros. O otimizador escolhido foi o \texttt{Adam}, amplamente utilizado pela sua eficácia em cenários com muitos parâmetros e por adaptar dinamicamente a taxa de aprendizagem durante o treino.

A seleção dos hiperparâmetros foi realizada com a biblioteca \texttt{Optuna}, utilizando uma abordagem de otimização bayesiana para explorar de forma eficiente o espaço de busca. O processo considerou os seguintes hiperparâmetros:

\begin{itemize}
    \item Número de unidades na camada oculta (\texttt{units});
    \item Função de ativação (\texttt{activation});
    \item Taxa de \texttt{dropout};
    \item Taxa de aprendizagem (\texttt{learning\_rate});
    \item Tamanho do \texttt{batch}.
\end{itemize}

A avaliação de cada combinação de hiperparâmetros foi realizada através de validação cruzada estratificada com 10 \textit{folds}, garantindo uma distribuição equilibrada das classes em cada subdivisão. Esta abordagem proporciona uma estimativa mais fiável da performance do modelo em dados não vistos e ajuda a mitigar o sobreajuste.

O código responsável por este processo está representado nos Blocos~\ref{lst:nn_optuna} e~\ref{lst:optuna_study}. No Bloco~\ref{lst:nn_optuna} apresenta-se a função de criação dinâmica do modelo, enquanto o Bloco~\ref{lst:optuna_study} mostra a definição da função objetivo e a configuração do estudo com 120 tentativas de otimização.

\begin{lstlisting}[language=Python, caption=Função de criação dinâmica do modelo com a ferramenta \textit{Optuna}, label=lst:nn_optuna, captionpos=b]

def create_model(trial, input_dim):
    units = trial.suggest_int('units', 1, 71, step=5)
    activation = trial.suggest_categorical('activation', ['relu', 'tanh'])
    learning_rate = trial.suggest_float('learning_rate', 1e-4, 1e-1, log=True)
    dropout_rate = trial.suggest_float('dropout_rate', 0.0, 0.5, step=0.1)

    model = Sequential()
    model.add(Dense(units, activation=activation, input_shape=(input_dim,)))
    model.add(Dropout(dropout_rate))
    model.add(Dense(NUM_CLASSES, activation='softmax'))

    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate),
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy']
    )
    return model
\end{lstlisting}

Durante a otimização, a função objetivo executava a validação cruzada para cada tentativa (\textit{trial}) e calculava a média das \textit{accuracies} obtidas. O \texttt{Optuna} foi configurado para realizar 120 tentativas, explorando diferentes combinações de hiperparâmetros.

\begin{lstlisting}[language=Python, caption=Criação do estudo Optuna, label=lst:optuna_study,captionpos=b]
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=120, n_jobs=4)
\end{lstlisting}

Após a conclusão do estudo, os melhores hiperparâmetros encontrados encontram-se apresentados na Tabela~\ref{tab:best_nn_params}.

\begin{table}[h]
\centering
\begin{tabular}{ll}
\toprule
\textbf{Hiperparâmetro} & \textbf{Valor Ótimo} \\
\midrule
Número de neurónios (\texttt{units}) & \textit{66} \\
Função de ativação (\texttt{activation}) & \textit{relu} \\
Taxa de aprendizagem (\texttt{learning\_rate}) & \textit{0.002} \\
Taxa de \texttt{dropout} & \textit{0.0} \\
Tamanho do batch (\texttt{batch\_size}) & \textit{16} \\
\bottomrule
\end{tabular}
\caption{Melhores hiperparâmetros encontrados para a rede neuronal}
\label{tab:best_nn_params}
\end{table}

Com base nesses valores, o modelo final foi treinado utilizando 80\% dos dados, aplicando validação cruzada com 10 \textit{folds}, enquanto os 20\% restantes foram reservados para teste.




\section{Resultados Obtidos}

Esta secção apresenta os resultados obtidos com a aplicação dos modelos desenvolvidos para o problema em estudo. A análise está dividida em duas partes principais.

Na primeira parte realiza-se uma avaliação individual de cada modelo, Regressão Logística, \ac{SVM} e Rede Neuronal, com o objetivo de analisar o desempenho de cada abordagem. Para isso, são apresentadas as matrizes de confusão e os valores de \textit{accuracy} obtidos nos conjuntos de treino e teste, de forma a avaliar a capacidade de generalização de cada modelo para dados não vistos. Esta análise permite identificar potenciais sinais \textit{overfitting} ou subajuste \textit{underfitting}.

Na segunda parte procede-se à comparação entre os modelos desenvolvidos, com base nas métricas de desempenho mais relevantes para problemas de classificação, nomeadamente \textit{accuracy}, precisão, \textit{recall} e F1-score. Por fim, para reforçar a avaliação da capacidade de generalização dos modelos, é realizado um teste adicional com um objeto nunca antes apresentado durante o treino, simulando um cenário realista de previsão em dados nunca antes vistos.



\subsection{Análise de Resultados}

De forma a avaliar o desempenho dos modelos desenvolvidos foram calculadas métricas de desempenho padrão em problemas de classificação multiclasse, bem como as matrizes de confusão associadas a cada modelo.  

As métricas consideradas incluem \textit{accuracy}, \textit{precision}, \textit{recall} e \textit{F1-score}, fundamentais para avaliar a capacidade de cada modelo em distinguir corretamente as classes. A \textit{accuracy} representa a proporção global de classificações corretas, enquanto a \textit{precision} mede a proporção de classificações positivas que estavam corretas (evitando falsos positivos). O \textit{recall}, por sua vez, indica a capacidade do modelo em identificar corretamente as instâncias de cada classe (evitando falsos negativos). Já o \textit{F1-score} corresponde à média harmónica entre \textit{precision} e \textit{recall}, proporcionando uma visão equilibrada entre ambas as métricas.

As matrizes de confusão apresentadas para os conjuntos de treino e teste, permitem uma análise detalhada dos erros cometidos por cada modelo, mostrando a distribuição das previsões entre as diferentes classes. Através dessas matrizes, é possível verificar padrões de erro específicos, identificar classes mais suscetíveis a confusões e avaliar a capacidade de generalização dos modelos ao comparar os resultados obtidos no treino e no teste.

A avaliação detalhada dos três modelos, com as respetivas matrizes de confusão e métricas de desempenho, permite uma comparação direta entre as abordagens e uma análise crítica sobre a eficácia de cada uma na resolução do problema em estudo.


\subsubsection{Regressão Logística}

O modelo de Regressão Logística foi desenvolvido com o objetivo de distinguir entre as três classes do problema. Para avaliar a sua capacidade de generalização, foram analisadas as matrizes de confusão normalizadas para os conjuntos de treino e teste, apresentadas nas Figuras~\ref{fig:cm_logreg_train} e~\ref{fig:cm_logreg_test}.  


\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/log_train_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de treino da Regressão Logística}
    \label{fig:cm_logreg_train}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/log_test_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de teste da Regressão Logística}
    \label{fig:cm_logreg_test}
\end{subfigure}
\caption{Matrizes de confusão obtidas para o conjunto de treino e de teste para a Regressão Logística}
\label{fig:matrizes_confusão} 
\end{figure}

No treino, o modelo apresenta elevados índices de acerto para todas as classes, com valores superiores a 93\%. A classe 2 é a melhor discriminada (95.1\% de acertos), enquanto a classe 0 apresenta ligeiras confusões com a classe 1 (4.6\%). Já no conjunto de teste, observa-se uma ligeira diminuição no desempenho, especialmente no \textit{recall} da classe 1 (92.4\%) e da classe 2 (94.5\%). No entanto, o modelo mantém uma boa consistência entre treino e teste, não evidenciando sinais de \textit{overfitting}.

Complementando a análise das matrizes de confusão, a Tabela~\ref{tab:metrics_logreg} apresenta as métricas de desempenho calculadas para o conjunto de teste. A \textit{accuracy} global do modelo foi de 94\%, e as médias macro e ponderada confirmam a robustez do modelo, com valores de precisão, \textit{recall} e \textit{F1-score} próximos entre si.

\begin{table}[h]
\centering
\begin{tabular}{c c c c}
\toprule
\textbf{Classe} & \textbf{Precisão} & \textbf{Recall} & \textbf{F1-score} \\
\midrule
0 & 0.864 & 0.951 & 0.905 \\
1 & 0.969 & 0.924 & 0.946 \\
2 & 0.975 & 0.945 & 0.960 \\
Média (Macro) & 0.936 & 0.940 & 0.937 \\
Média (Ponderada) & 0.942 & 0.939 & 0.940 \\
\bottomrule
\end{tabular}
\caption{Métricas de desempenho para a Regressão Logística}
\label{tab:metrics_logreg}
\end{table}

Destaca-se a elevada precisão para a classe 2 (0.98) e o \textit{recall} elevado para a classe 0 (0.95), indicando que o modelo raramente confunde estas classes com as restantes. Por outro lado, a classe 0 apresenta a menor precisão (0.86), sugerindo uma maior tendência para falsos positivos nesta classe.



\subsubsection{SVM}

O modelo baseado \textit{Support Vector Machine} obteve resultados notáveis, com uma percentagem de classificações corretas extremamente elevada em ambos os conjuntos de treino e teste. A análise das matrizes de confusão normalizadas (Figuras~\ref{fig:cm_svm_train} e~\ref{fig:cm_svm_test}) revela que a SVM consegue distinguir as três classes de forma muito precisa, com apenas pequenas confusões residuais.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/svm_train_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de treino da SVM}
    \label{fig:cm_svm_train}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/svm_test_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de teste da SVM}
    \label{fig:cm_svm_test}
\end{subfigure}
\caption{Matrizes de confusão obtidas para o conjunto de treino e de teste para a SVM}
\label{fig:matrizes_confusão_svm} 
\end{figure}

No treino, observa-se que a SVM atinge uma \textit{accuracy} de 99.8\%, com a maioria das amostras corretamente classificadas. As confusões entre classes são quase inexistentes, limitando-se a frações inferiores a 0.2\%. No teste, a SVM mantém um desempenho muito elevado, com \textit{acuuracy} de 99.3\%. As confusões residuais surgem principalmente na classe 0, onde cerca de 0.9\% das amostras foram classificadas como pertencentes às classes 1 ou 2, enquanto as restantes classes apresentam uma percentagem de classificações corretas quase perfeita.


O relatório de classificação obtido para o conjunto de teste confirma a consistência do modelo, com \textit{precision}, \textit{recall} e \textit{F1-score} acima dos 99\% para todas as classes. Estes resultados demonstram que a SVM não apenas ajusta bem os dados de treino, mas também consegue generalizar com eficácia para novos dados, sem sinais evidentes de \textit{overfitting}.

A Tabela~\ref{tab:metrics_svm} resume os valores das métricas de desempenho calculadas para o conjunto de teste.

\begin{table}[h]
\centering
\begin{tabular}{c c c c}
\toprule
\textbf{Classe} & \textbf{Precisão} & \textbf{Recall} & \textbf{F1-score} \\
\midrule
0 & 0.994 & 0.983 & 0.988 \\
1 & 0.991 & 0.998 & 0.994 \\
2 & 0.993 & 0.996 & 0.995 \\
Média (Macro) & 0.993 & 0.992 & 0.992 \\
Média (Ponderada) & 0.993 & 0.993 & 0.993 \\
\bottomrule
\end{tabular}
\caption{Métricas de desempenho no conjunto de teste para a SVM}
\label{tab:metrics_svm}
\end{table}

De forma geral, a SVM demonstrou ser um modelo altamente eficaz e confiável, com excelente capacidade de discriminação entre as classes e resultados consistentes entre treino e teste.


\subsubsection{Rede Neuronal}


A rede neuronal também se revelou eficaz na tarefa de classificação, apresentando resultados de elevada precisão e robustez. A \textit{accuracy} global obtida foi de 99.2\% no conjunto de treino e de 98.5\% no conjunto de teste, o que evidencia uma boa capacidade de generalização para novos dados.

As matrizes de confusão, apresentadas nas Figuras~\ref{fig:cm_nn_train} e~\ref{fig:cm_nn_test}, permitem analisar de forma mais detalhada o desempenho do modelo em cada classe. No conjunto de treino, observa-se uma taxa de classificação correta superior a 97\% para todas as classes, com confusões residuais de baixo impacto. A classe 1, em particular, apresenta uma taxa de acerto muito elevada (99.8\%), enquanto a classe 0 regista uma ligeira dispersão, com aproximadamente 1.7\% dos exemplos a serem classificados como pertencentes à classe 2.

No conjunto de teste, verifica-se uma ligeira redução da precisão, especialmente para a classe 0, onde cerca de 3.5\% dos exemplos foram classificados incorretamente como pertencentes à classe 2. No entanto, as restantes classes mantêm taxas de classificação superiores a 99\%, o que demonstra a consistência e a eficácia do modelo.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/nn_train_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de treino da Rede Neuronal}
    \label{fig:cm_nn_train}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/nn_test_matrix.png}
    \caption{Matriz de confusão normalizada para o conjunto de teste da Rede Neuronal}
    \label{fig:cm_nn_test}
\end{subfigure}
\caption{Matrizes de confusão obtidas para o conjunto de treino e de teste para a Rede Neuronal}
\label{fig:matrizes_confusão_nn} 
\end{figure}


O relatório de classificação para o conjunto de teste, apresentado na Tabela~\ref{tab:metrics_nn}, permite uma análise mais detalhada das métricas de desempenho. Observa-se que a classe 1 apresenta resultados praticamente perfeitos, com uma \textit{precision} de 0.99, um \textit{recall} de 1.00 e um F1-score de 0.99, evidenciando a capacidade do modelo em identificar corretamente a maioria dos exemplos desta classe, sem gerar falsos positivos relevantes. A classe 2 também apresenta valores muito elevados, com um F1-score de 0.98, apesar de uma ligeira redução na precisão (0.97), o que indica que o modelo tende a incluir alguns exemplos de outras classes como pertencentes a esta. A classe 0 é a que apresenta o desempenho ligeiramente inferior, com um F1-score de 0.98 e uma precisão de 0.99, mas com um \textit{recall} de 0.96, sugerindo que alguns exemplos desta classe não foram corretamente identificados, sendo atribuídos a outras categorias. 

No geral, o modelo apresenta valores médios de precisão, \textit{recall} e F1-score bastante elevados, superiores a 97\%, o que reflete um desempenho consistente e robusto em todas as classes.

\begin{table}[h]
\centering
\begin{tabular}{c c c c}
\toprule
\textbf{Classe} & \textbf{Precisão} & \textbf{Recall} & \textbf{F1-score} \\
\midrule
0 & 0.994 & 0.960 & 0.976 \\
1 & 0.991 & 0.998 & 0.994 \\
2 & 0.972 & 0.991 & 0.982 \\
Média (Macro) & 0.986 & 0.983 & 0.984 \\
Média (Ponderada) & 0.985 & 0.985 & 0.985 \\
\bottomrule
\end{tabular}
\caption{Métricas de desempenho no conjunto de teste para a Rede Neuronal}
\label{tab:metrics_nn}
\end{table}

De um modo geral, a rede neuronal destaca-se pelo seu desempenho robusto, mostrando uma ligeira diminuição de desempenho no conjunto de teste, mas mantendo níveis de classificação bastante elevados. Estes resultados sugerem que o modelo é capaz de captar padrões relevantes nos dados, mantendo uma boa capacidade de generalização.

\subsection{Comparação de desempenho}
Após a análise individual de cada modelo é possível realizar uma comparação direta dos seus desempenhos, de forma a identificar qual abordagem apresenta melhores resultados para a tarefa de classificação em estudo.

A Tabela~\ref{tab:comparacao_modelos} sintetiza os principais indicadores de desempenho, precisão, \textit{recall}, F1-score e \textit{accuracy}, obtidos para cada modelo no conjunto de teste. Estes valores permitem uma avaliação quantitativa clara das diferenças entre os três modelos desenvolvidos: Regressão Logística, \ac{SVM} e Rede Neuronal.

\begin{table}[h]
\centering
\begin{tabular}{l c c c c}
\toprule
\textbf{Modelo} & \textbf{Precisão} & \textbf{Recall} & \textbf{F1-score} & \textbf{Accuracy} \\
\midrule
Regressão Logística & 0.94 & 0.94 & 0.94 & 0.94 \\
SVM & 0.99 & 0.99 & 0.99 & 0.99 \\
Rede Neuronal & 0.99 & 0.98 & 0.98 & 0.98 \\
\bottomrule
\end{tabular}
\caption{Comparação das métricas de desempenho dos três modelos avaliados}
\label{tab:comparacao_modelos}
\end{table}

Analisando os resultados apresentados, verifica-se que o modelo de Regressão Logística apresenta um desempenho global inferior em comparação com os outros modelos, com uma \textit{accuracy} de 94\% e valores de precisão, \textit{recall} e F1-score médios de 0.94. Esta diferença é particularmente notória na classe 0, onde o \textit{recall} foi de 0.95 e a precisão de 0.86, revelando alguma dificuldade em identificar corretamente esta classe.

Por outro lado, o modelo SVM destacou-se como o que apresentou o melhor desempenho, com uma acurácia de 99\% e métricas médias de 0.99 para precisão, \textit{recall} e F1-score. Este desempenho excecional confirma a elevada capacidade discriminativa da SVM para este problema, conseguindo classificar corretamente quase todos os exemplos, sem desvios significativos entre as classes.

A rede neuronal também apresentou resultados muito satisfatórios, com uma \textit{accuracy} de 98\% e métricas médias próximas de 0.98. Embora ligeiramente inferior ao desempenho da SVM, a rede neuronal demonstrou uma performance bastante consistente e equilibrada entre as diferentes classes. Destaca-se, no entanto, uma ligeira diminuição do \textit{recall} para a classe 0 (0.96), o que indica que o modelo, ocasionalmente, não conseguiu identificar corretamente alguns exemplos desta classe.

Para além do cálculo das métricas de desempenho, foi também testada a capacidade de generalização dos modelos com um novo conjunto de dados, correspondente a um objeto que, ao ser agarrado pela mão robótica, gera uma configuração de dedos associada à classe 2 (situação em que o polegar fica por cima dos restantes dedos). Este novo objeto é ilustrado na Figura~\ref{fig:novo_objeto} e na Figura~\ref{fig:config_novo_objeto} é possível observar a posição distinta assumida pelos dedos da mão ao agarrar o objeto, em comparação com os exemplos utilizados durante o treino dos modelos.

\begin{figure}[h]
\centering
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/cola.jpg}
    \caption{Objeto utilizado para recolher novos dados}
    \label{fig:novo_objeto}
\end{subfigure}
\begin{subfigure}[b]{0.3\textwidth}
    \includegraphics[width=\textwidth]{figs/chapter5/config_cola.jpg}
    \caption{Configuração de dedos associada ao novo objeto}
    \label{fig:config_novo_objeto}
\end{subfigure}
\caption{Fotografias do novo objeto utilizado para avaliar o desempenho dos modelos desenvolvidos e respetiva configuração de dedos.}
\label{fig:teste_objeto} 
\end{figure}


A Tabela~\ref{tab:novo_objeto} resume as classificações atribuídas pelos diferentes modelos ao novo conjunto de dados. Através da sua análise verifica-se que a Regressão Logística classificou incorretamente o exemplo como pertencente à classe 0, enquanto a SVM e a Rede Neuronal foram capazes de identificar corretamente a classe 2, demonstrando assim uma maior capacidade de generalização para dados não vistos durante o treino.


\begin{table}[h]
\centering
\begin{tabular}{l c}
\toprule
\textbf{Modelo} & \textbf{Classe Prevista} \\
\midrule
Regressão Logística & 0 \\
SVM & 2 \\
Rede Neuronal & 2 \\
\bottomrule
\end{tabular}
\caption{Classificação do novo objeto por cada modelo}
\label{tab:novo_objeto}
\end{table}



A análise destes resultados revela informações importantes sobre o comportamento dos modelos. A Regressão Logística, embora com desempenho global razoável, mostrou fragilidades ao classificar novos dados que não pertencem ao conjunto de treino, cometendo erros ao identificar objetos da classe 2. Por outro lado, a SVM e a Rede Neuronal demonstraram uma capacidade de generalização mais robusta, conseguindo prever corretamente a classe do novo objeto, mesmo sem terem sido explicitamente treinadas com ele. Este resultado confirma a superioridade destes modelos, não apenas nas métricas de teste, mas também na capacidade de extrapolar para dados desconhecidos.


Em resumo, a SVM demonstrou o desempenho mais robusto e equilibrado, enquanto a rede neuronal surge como uma alternativa viável com resultados muito próximos. Já a Regressão Logística, apesar de apresentar resultados satisfatórios, ficou aquém do desempenho dos outros dois modelos, sendo mais sensível a desequilíbrios entre as classes.

Esta análise permite concluir que, para este problema específico de classificação, a SVM é o modelo mais adequado, dado o seu desempenho superior em todas as métricas avaliadas. A rede neuronal surge como uma segunda opção viável, e a Regressão Logística, embora funcional, revela algumas limitações no reconhecimento de certas classes.






\section{Conclusão}



Neste capítulo foi explorada a aplicação de técnicas de aprendizagem automática para a deteção de sobreposições entre os dedos da mão robótica desenvolvida. Foram treinados três modelos distintos (Regressão Logística, SVM e Rede Neuronal)e os seus desempenhos foram comparados através de métricas como precisão, \textit{recall}, \textit{f1-score} e \textit{accuracy}. As tabelas e análises obtidas demonstraram que tanto a SVM como a Rede Neuronal superaram a Regressão Logística, alcançando valores mais elevados em todas as métricas de desempenho, com a SVM a apresentar resultados ligeiramente superiores.

Para além das métricas padrão de avaliação foi realizado um teste adicional para validar a capacidade de generalização dos modelos, através da classificação de um novo objeto cuja configuração dos dedos correspondia à classe 2 (situação em que o polegar fica por cima dos restantes dedos). Este exercício revelou limitações da Regressão Logística, que classificou o novo objeto incorretamente como pertencente à classe 0, enquanto a SVM e a Rede Neuronal conseguiram identificar corretamente a classe 2, demonstrando maior robustez na generalização para novos cenários.

Os resultados obtidos neste estudo reforçam a importância de escolher cuidadosamente o modelo de aprendizagem automática, em função das exigências do problema em questão. Em particular, para o caso da deteção de sobreposições em mãos robóticas antropomórficas, a SVM e a Rede Neuronal revelaram-se soluções mais eficazes e fiáveis, sendo por isso as opções mais recomendadas para a implementação final deste sistema.
