はじめに
概要
本日は、神経科学で頻繁に使われる機械学習手法である次元削減について学びます!次元削減とは、高次元空間のデータを低次元空間に変換することを指します。イントロでは、バイロン・ユーが次元削減を行ういくつかの方法を紹介し、神経集団活動の潜在的な低次元構造を調査するためにそれらがどのように使われるかを説明します。チュートリアル1では、今回扱う主要な次元削減手法である主成分分析(PCA)の基礎知識を設定します。特に、直交正規基底、基底変換、相関などの重要な線形代数の要素を復習します。チュートリアル2では、PCAの具体的な数学的背景、すなわちPCAの計算方法とデータを主成分に射影する方法を扱います。チュートリアル3では、データを正確に表現するために必要な次元数(または主成分数)を評価する方法を説明します。最後にチュートリアル4では、非線形の次元削減手法であるt-SNEを簡単に紹介します。アウトロでは再びバイロン・ユーが登場し、次元削減と脳-コンピュータ・インターフェースの関連について語ります。
次元削減は神経科学で様々な目的で常に使われる基本的な機械学習手法です。神経科学者は、データをより少ない次元に圧縮し、さらなる解析やモデリングに適した形にする単純なデータ解析ツールとして利用します。例えば、神経データから画像の全ピクセルをデコードするのは、数百から数千次元に及ぶため困難です。代わりに、画像の低次元版に圧縮し、これまで学んだ手法やモデル(例えば「モデルフィッティング」での線形回帰)を使ってデコードできます。また、低次元でデータを可視化することで理解が深まります。例えば「ディープラーニング」では、PCAを使って深層ネットワークやマウスの脳の内部表現を可視化します。さらに、次元削減は脳内の低次元構造の存在や形成過程などを考察・調査するためにも使えます。ボーナスデイの「オートエンコーダー」の資料を見ると、この点についてより深い洞察が得られます。
# @title Install and import feedback gadget
from vibecheck import DatatopsContentReviewContainer
def content_review(notebook_section: str):
return DatatopsContentReviewContainer(
"", # No text prompt
notebook_section,
{
"url": "https://pmyvdlilci.execute-api.us-east-1.amazonaws.com/klab",
"name": "neuromatch_cn",
"user_key": "y1x3mpx5",
},
).render()
feedback_prefix = "W1D4_Intro"
ビデオ
# @markdown
from ipywidgets import widgets
from IPython.display import YouTubeVideo
from IPython.display import IFrame
from IPython.display import display
class PlayVideo(IFrame):
def __init__(self, id, source, page=1, width=400, height=300, **kwargs):
self.id = id
if source == 'Bilibili':
src = f'https://player.bilibili.com/player.html?bvid={id}&page={page}'
elif source == 'Osf':
src = f'https://mfr.ca-1.osf.io/render?url=https://osf.io/download/{id}/?direct%26mode=render'
super(PlayVideo, self).__init__(src, width, height, **kwargs)
def display_videos(video_ids, W=400, H=300, fs=1):
tab_contents = []
for i, video_id in enumerate(video_ids):
out = widgets.Output()
with out:
if video_ids[i][0] == 'Youtube':
video = YouTubeVideo(id=video_ids[i][1], width=W,
height=H, fs=fs, rel=0)
print(f'Video available at https://youtube.com/watch?v={video.id}')
else:
video = PlayVideo(id=video_ids[i][1], source=video_ids[i][0], width=W,
height=H, fs=fs, autoplay=False)
if video_ids[i][0] == 'Bilibili':
print(f'Video available at https://www.bilibili.com/video/{video.id}')
elif video_ids[i][0] == 'Osf':
print(f'Video available at https://osf.io/{video.id}')
display(video)
tab_contents.append(out)
return tab_contents
video_ids = [('Youtube', 'zeBFyRaoVnQ'), ('Bilibili', 'BV1Cf4y117b6')]
tab_contents = display_videos(video_ids, W=854, H=480)
tabs = widgets.Tab()
tabs.children = tab_contents
for i in range(len(tab_contents)):
tabs.set_title(i, video_ids[i][0])
display(tabs)
スライド
# @markdown
from IPython.display import IFrame
link_id = "khbwu"
print(f"If you want to download the slides: https://osf.io/download/{link_id}/")
IFrame(src=f"https://mfr.ca-1.osf.io/render?url=https://osf.io/{link_id}/?direct%26mode=render%26action=download%26mode=render", width=854, height=480)
# @title Submit your feedback
content_review(f"{feedback_prefix}_Intro")