콘텐츠로 이동

작품의 목적

자폐 스팩트럼 장애(Autism Spectrum Disorder, ASD)는 개인마다 다양한 증상과 행동 양식을 보이는데 기존의 증상 중심의 진단 방법은 겉으로 표현되는 증상에 기반하여 생물학적 특성과 다를 수 있고 주관적 요소가 개입될 수 있어, 정확한 진단과 처방에 한계가 있다.

프로젝트 개념

핵심 아이디어

  • 목표 : 인간의 뇌 연결도(connectivity)분석을 통한 자폐 스펙트럼 장애(ASD) 특성 파악
  • 접근법 : 비지도 학습을 활용한 뇌 네트워크 패턴 분석
  • 측정 방법 : 뇌의 특정 부분 값 변경 시 다른 부분의 변화율 기록

데이터 표현 방식

  • 연결성 척도 :-1~1범위
    • 1 : 동일한 값
    • -1 : 정반대의 값
    • 0 : 관련성 없음

데이터 구조

  1. 원본 데이터 : [160, 160, 394]
  2. 절댓값 데이터 : [160, 160, 394]
  3. 통합 데이터 : [160, 160, 2, 394]

160 * 160 : 뇌 영역 간 연결성 매트릭스 394 : 조사한 피실험자 수 2 : 원본값과 절댓값 두 가지 데이터 타입

뇌 연결성 매트릭스는 선 대칭이기에 대각선 기준으로 반쪽만 분석하여 연산량 50% 절약

사용된 기술

데이터 수집 및 전처리, GCN, Auto encoder, Numpy, 사이킷런

데이터 수집 및 전처리

본 연구에서는 여러 기관에서 측정한 394명의 대규모 뇌영상 데이터(기능성 자기 공명영상, fMRI)를 활용하여 ASD 환자의 뇌 생물학적 특성을 도출한다. 휴지기 상태에서 뇌의 활성화를 간접적으로 측정하는 Blood Oxygen Level Dependent(BOLD) 신호를 통해 fMRI 데이터를 수집하였다. fMRI 데이터는 Dosenbach's 뇌 템플릿을 이용하여 160개 뇌 영역 간의 기능성 연결성(총 연결성 160 * 159 = 12,720)을 상관 계수의 변동폭을 확장하기 위해 Fisher-z 변환을 사용하여 정규화하였다.

GCN

뇌의 연결성 데이터가 가지는 복잡한 네트워크 구조를 효과적으로 분석하기 위해 사용하였음 이는 분할된 뇌 영역 간의 연결성을 학습하고, 이를 기반으로 ASD 환자의 뇌 네트워크를 분석할 수 있도록 설계하였다.

그래프 구조 데이터(인접 행렬 등)에서 동작하도록 설계된 심층 학습 모델로 복잡한 네트워크에서 효율적인 표현 학습과 관계 및 종속성을 분석할 수 있다. 노드와 엣지로 구성된 그래프에서 노드 간의 관계를 모델링하고, 각 노드의 특성 및 전체 그래프 구조를 학습한다.

그래프 데이터에 대해 컨볼루션 연산을 수행하도록 설계된 네트워크이며, 그래프의 구조적 특성을 반영하여 인접 노드 간의 정보 교환을 효율적으로 처리한다.

auto encoder

입력된 인접 행렬로부터 주요 뇌 특징을 추출하기 위해 사용하였다. Poisson 손실 함수를 이용하여 100회의 epoch 동안 학습하였다.

첨부파일/Pasted image 20250618132300.png

인코더 신경망과 디코더 신경망을 이용하여 데이터의 특징으로 추출하는 대표적인 비지도 학습 인공 신경망 구조이다.

본 연구에서는 인코더 GCN 신경망을 통해 고차원 입력 데이터를 저차원 잠재 공간(잠재 백터 z)으로 변환하고 이를 다시 디코더 신경망으로 복원한다. 생성된 잠재 백터 z는 고차원 입력 데이터의 주요 특징을 저차원으로 표현한다. 본 연구에서는 16 잠재 백터를 사용하였다.

프로젝트 진행

1단계 : 원본 데이터 처리 [160, 160, 394]

import scipy.io
import numpy as np
import os

# .mat 파일이 저장된 디렉토리 경로
directory = 'C:/Users/USER/Desktop/spectrum/asd'

# 모든 .mat 파일의 경로를 가져오기
mat_files = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith('.mat')]

# 데이터를 저장할 리스트 초기화
data_list = []

# 각 .mat 파일을 읽어서 데이터 리스트에 추가
for mat_file in mat_files:
    mat_data = scipy.io.loadmat(mat_file)
    data = mat_data['loaded_tensor_sub']  
    data_list.append(data)

# 리스트를 numpy 배열로 변환하여 3D 배열 생성
data_3d = np.stack(data_list, axis=1)

# 3D 배열을 .mat 파일로 저장
output_file = 'C:/Users/USER/Desktop/spectrum/output_data.mat'
scipy.io.savemat(output_file, {'loaded_tensor_sub': data_3d})

주요 함수 설명

  1. os.path.join(directory, f)
    • 경로와 파일명을 운영체제에 맞게 결합
    • Windows: \, Linux/Mac: / 자동 처리
  2. os.listdir(directory)
    • 지정된 디렉토리의 모든 파일/폴더 목록 반환
    • 리스트 형태로 파일명들을 제공
  3. f.endswith('.mat')
    • 문자열이 특정 접미사로 끝나는지 확인
    • Boolean 값 반환 (True/False)
  4. scipy.io.loadmat(mat_file)
    • MATLAB .mat 파일을 Python dictionary로 로드
    • 키는 변수명, 값은 NumPy 배열
  5. np.stack(data_list, axis=1)
    • 배열들을 지정된 축을 따라 쌓아서 차원 증가
    • axis=1: 두 번째 차원으로 쌓기
    • axis=-1: 마지막 차원으로 쌓기 (동적 처리)
  6. scipy.io.savemat(output_file, dict)
    • Python 데이터를 MATLAB .mat 파일로 저장
    • dictionary 형태로 변수명과 데이터 매핑

2단계 : 절댓값 데이터 처리 [160, 160, 394]

추가된 처리

data = np.abs(data)
목적 : 연결성의 방향성보다는 강도에 집중 - 양의 상관관계와 음의 상관관계를 모두 연결성 있음으로 간주 - 뇌 영역 간 상호작용의 절대적 크기 측정

3단계 : 데이터 시각화

load('C:/Users/USER/Desktop/spectrum/output_data.mat');
% 비교할 슬라이스 인덱스 
slice_indices = 1:9; 
figure; 
num_slices = length(slice_indices); 
num_rows = ceil(num_slices / 3); 
% 3개마다 개행 
for i = 1:num_slices 
    subplot(num_rows, 3, i); 
    imagesc(loaded_tensor_sub(:, :, slice_indices(i))); 
    colorbar; 
    title(['Slice ' num2str(slice_indices(i))]); 
end
기능 : 각 피험자별 뇌 연결성 매트릭스를 히트맵으로 시각화

4단계 : 데이터 통합 [160, 160, 2, 394]

import scipy.io 
import numpy as np 

data_mat = scipy.io.loadmat('C:/Users/USER/Desktop/spectrum/output_data.mat') 
data_3d = data_mat['loaded_tensor_sub'] 

data_mat2 = scipy.io.loadmat('C:/Users/USER/Desktop/spectrum/output_data2.mat') 
data_3d2 = data_mat2['loaded_tensor_sub'] 

combined_data = np.stack((data_3d, data_3d2), axis=2)

output_file = 'C:/Users/USER/Desktop/spectrum/output_data3.mat' 
scipy.io.savemat(output_file, {'loaded_tensor_sub': combined_data})
결과 : 원본값과 절댓값을 하나의 4차원 배열로 통합

5단계 : 최종 데이터 확인

load('C:/Users/USER/Desktop/spectrum/output_data3.mat'); 
% 차원 선택
data_3d_new = 0; 
slice_indices = 1:9; 
figure;
num_slices = length(slice_indices); 
num_rows = ceil(num_slices / 3);
for i = 1:num_slices 
    subplot(num_rows, 3, i); 
    % 차원 선택 
    if data_3d_new == 0 
        imagesc(squeeze(data_3d(:, :, 0, slice_indices(i)))); 
    elseif data_3d_new == 1 
        imagesc(squeeze(data_3d(:, :, 1, slice_indices(i)))); 
    end 
    colorbar; 
    title(['Slice ' num2str(slice_indices(i))]); 
end

결론

첨부파일/Pasted image 20250618143307.png 위의 사진은 12,720개의 뇌 연결성에 대해 학습된 GCN-AE 모델이 미치는 영향력을 높은 순으로 정렬한 결과를 보여준다. 1~3번 째 연결성과 4~5번 째 연결성 사이에 간격이 있는 것을 확인할 수 있다. 영향력이 가장 높은 3개의 연결성은 기저핵(Basal Ganglia)과 배측 전두엽(Dorsal Frontal Cortex) 연결성, 방추회 (Fusiform Gyrus)와 측소뇌(Lateral Cerebellum) 연결성, 그리고 전방 전두엽 피질(Anterior Prefrontal Cortex)과 하두정소엽(Inferior Parietal Lobule) 연결성이다.