Чем думает рыба?


In [ ]:
!wget https://github.com/goto-ru/Unsupervised_ML/raw/20779daf2aebca80bfe38401bc87cf41fc7b493d/03_zebrafish/zebrafish.npy -O zebrafish.npy
#alternative link: https://www.dropbox.com/s/hhep0wj4c11qibu/zebrafish.npy?dl=1

Данные

  • Сейчас в вашем распоряжении - данные о мозговой активности малька рыбы вида Danio Rerio https://en.wikipedia.org/wiki/Zebrafish .
  • Мальку введено вещество, которое светится от электрической активности (например, от спайков нейронов). Мальки почти прозрачны, поэтому такое свечение видно извне.
  • Сами данные содержат 240 фотографий головной части рыбки, на которых видна мозговая активность в каждой точке. Каждая фотография имеет размер 230 x 202 пикселей
  • Ваша задача - попытаться восстановить структуру мозга рыбки. Для этого можно попытаться найти, например, группы нейронов, реагирующих вместе или с одинаковой частотой.
  • Никакой разметки в данных нет, поэтому вам придётся использовать методы понижения размерности и кластеризации, чтобы эффективно анализировать данные.


In [ ]:
import numpy as np
data = np.load("zebrafish.npy")/255.

In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline

tick0 = data[:,0]
tick0_image = tick0.reshape(230, 202)

print "размер 1 картинки:", tick0_image.shape

plt.imshow(tick0_image.T);

In [ ]:
#мини-библиотека для рисования рыбы
from zebrafish_drawing_factory import draw_component

draw_component(data[:,0])

Временные ряды

  • Посмотрим на активность отдельных пикселей в течение времени:
  • Попробуйте вручную найти какие-то характерные группы нейронов

In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure(figsize=[10,10])
for i in range(0,240,10):
    plt.plot(data[i])

Поищем характерные группы нейронов

Давайте разложим временные ряды активности нейронов при помощи метода главных компонент.

Важно! в этой части задания объектом выборки является временной ряд активности 1 точки на картинке, а не картинка целиком.


In [ ]:
from sklearn.decomposition import PCA

pca = <создайте и обучите PCA с 20+ компонентами>

In [ ]:
data_pca = <преобразуйте данные в пространство главных компонент pca.transform>

Визуализируем компоненты


In [ ]:
draw_component(data_pca[:,1])

In [ ]:
draw_component(data_pca[:,2])

In [ ]:
from zebrafish_drawing_factory import draw_components

draw_components(data_pca[:,2],data_pca[:,3])

Поищем фичи


In [ ]:
def extract_features(impulses):
    """given time series(array) of region activity, compute some feature representation of those time series
    Ideas:
      - fourier transform
      - mean, variance and percentiles
      - sums of every k-th element with shift b
      """
    features = []<любые фичи>
    return features

In [ ]:
data_features = np.array(list(map(extract_features, data)))

print "shape:",data_features.shape

In [ ]:
from sklearn.decomposition import PCA

pca = <обучи PCA>

In [ ]:
data_pca = <преобразуй в пространство PCA>

In [ ]:
<визуализируй полученные компоненты>
draw_component(...)
draw_components(...)

Bonus: clustering in PCA space


In [ ]:
from sklearn.cluster import KMeans
from sklearn.mixture import GMM

<покластеризуй области изображения на основе двух полученных PCA-представлений, используй любой метод на выбор>

In [ ]:
cluster_ids = <предскажи номер кластера для каждого пикселя>

In [ ]:
#cluster_ids должен содержать по 1 чиселке на пиксель
assert np.prod(cluster_ids.shape) == (230*202)

In [ ]:
plt.imshow(cluster_ids.reshape(230,202),cmap='spectral')