Чтобы вернуть данные в формат изображения, вам нужно выполнить NiftiMasker.inverse_transform (). Для этого необходимо сохранить размеры в пространстве вокселей.
Итак, теперь, как работает конвейер, вы используете уменьшение размерности в пространстве вокселей. На всякий случай, если вы хотите уменьшить размерность в предметном пространстве, вы измените следующее:
pipe = Pipeline([('niftimasker',niftimasker),
('scaler',scaler),
# ('pca',pca)
])
X = pipe.fit_transform(imgs)
X_reduced = pca.fit_transform(X.T).T
Затем вы примените обратное преобразование следующим образом:
component_image = niftimasker.inverse_transform(X_reduced)
Затем, чтобы получить каждый Для отдельного предметного компонента изображения вы будете использовать index_image из nilearn.image. Например, это изображение для первого предметного компонента:
component1_image = index_img(component_image,0)
Тем не менее, я думаю, что вы заинтересованы в уменьшении проницаемости в пространстве вокселей. Поэтому, чтобы сохранить размеры вокселей для обратного преобразования, вам необходимо получить индекс каждой функции вокселей, выбранной при уменьшении размерности PCA. Сохраните ваш конвейер таким, каким он был у вас изначально, и выполните следующие действия:
X = pipe.fit_transform(imgs)
components = pca.components_
#In your case 2, but replace range(2) with range(n_components)
most_important = [np.abs(components[i]).argmax() for i in range(2)]
Затем разбейте массивы nan на x предметов и y вокселей: (в вашем случае 30 x 229007)
comp1, comp2 = np.tile(np.nan, [30,229007]), np.tile(np.nan, [30,229007])
for x,y in enumerate(X):
comp1[x,most_important[0]] = y[0]
comp2[x,most_important[1]] = y[1]
Затем примените обратное преобразование к каждому компоненту:
component1_image = niftimasker.inverse_transform(comp1)
component2_image = niftimasker.inverse_transform(comp2)
Теперь у вас будет 2 изображения, каждое из которых содержит 30 субъектов и 1 действительное значение вокселя, представляющее выбранный компонент. Вам решать, как агрегировать воксел компонента по 30 объектам, в этом случае я просто собираюсь использовать функцию среднего изображения из nilearn.image:
mean_component1_image = mean_img(component1_image)
mean_component2_image = mean_img(component2_image)
Наконец, в обоих случаях построите график соответствующее изображение. В уменьшенной версии вокселей вы увидите небольшое изменение в двух изображениях в измерении X (вторая диаграмма), но вряд ли Y и Z. Я использую plot_glass_brain из nilearn.plotting:
plotting.plot_glass_brain(mean_component1_image)
plotting.plot_glass_brain(mean_component2_image)
To используйте наложения, настройте карты цветов, чтобы упростить их визуализацию, и другие параметры построения см. в этом и других руководствах по nilearn:
https://nilearn.github.io/plotting/index.html#different -display-mode
Дайте мне знать, если у вас есть еще вопросы.