작품의 목적
자폐 스팩트럼 장애(Autism Spectrum Disorder, ASD)는 개인마다 다양한 증상과 행동 양식을 보이는데 기존의 증상 중심의 진단 방법은 겉으로 표현되는 증상에 기반하여 생물학적 특성과 다를 수 있고 주관적 요소가 개입될 수 있어, 정확한 진단과 처방에 한계가 있다.
프로젝트 개념
핵심 아이디어
- 목표 : 인간의 뇌 연결도(connectivity)분석을 통한 자폐 스펙트럼 장애(ASD) 특성 파악
- 접근법 : 비지도 학습을 활용한 뇌 네트워크 패턴 분석
- 측정 방법 : 뇌의 특정 부분 값 변경 시 다른 부분의 변화율 기록
데이터 표현 방식
- 연결성 척도 :-1~1범위
- 1 : 동일한 값
- -1 : 정반대의 값
- 0 : 관련성 없음
데이터 구조
- 원본 데이터 : [160, 160, 394]
- 절댓값 데이터 : [160, 160, 394]
- 통합 데이터 : [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 동안 학습하였다.

인코더 신경망과 디코더 신경망을 이용하여 데이터의 특징으로 추출하는 대표적인 비지도 학습 인공 신경망 구조이다.
본 연구에서는 인코더 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})주요 함수 설명
os.path.join(directory, f)- 경로와 파일명을 운영체제에 맞게 결합
- Windows:
\, Linux/Mac:/자동 처리
os.listdir(directory)- 지정된 디렉토리의 모든 파일/폴더 목록 반환
- 리스트 형태로 파일명들을 제공
f.endswith('.mat')- 문자열이 특정 접미사로 끝나는지 확인
- Boolean 값 반환 (True/False)
scipy.io.loadmat(mat_file)- MATLAB
.mat파일을 Python dictionary로 로드 - 키는 변수명, 값은 NumPy 배열
- MATLAB
np.stack(data_list, axis=1)- 배열들을 지정된 축을 따라 쌓아서 차원 증가
axis=1: 두 번째 차원으로 쌓기axis=-1: 마지막 차원으로 쌓기 (동적 처리)
scipy.io.savemat(output_file, dict)- Python 데이터를 MATLAB
.mat파일로 저장 - dictionary 형태로 변수명과 데이터 매핑
- Python 데이터를 MATLAB
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결론
위의 사진은 12,720개의 뇌 연결성에 대해 학습된 GCN-AE 모델이 미치는 영향력을 높은 순으로 정렬한 결과를 보여준다. 13번 째 연결성과 45번 째 연결성 사이에 간격이 있는 것을 확인할 수 있다. 영향력이 가장 높은 3개의 연결성은 기저핵(Basal Ganglia)과 배측 전두엽(Dorsal Frontal Cortex) 연결성, 방추회 (Fusiform Gyrus)와 측소뇌(Lateral Cerebellum) 연결성, 그리고 전방 전두엽 피질(Anterior Prefrontal Cortex)과 하두정소엽(Inferior Parietal Lobule) 연결성이다.