PyGSPは、EPFL(スイス連邦工科大学ローザンヌ校)の研究グループが公開しているグラフ信号処理(Graph Signal Processing, GSP)に関するPythonのライブラリです。
Python及びMATLAB版が存在し、MATLAB版は「Graph Signal Processing Toolbox」という名前で提供されています。
MATLABは有償のため使用可能な方が限定されると思いますので、今回はPython版であるPyGSPを使ってグラフ信号処理を体験してみたいと思います。
外部サイト:PyGSP: Graph Signal Processing in Python(Github)
グラフ信号処理とは
グラフ信号処理(Graph Signal Processing)は、言葉通りグラフを入力とした信号処理技術です。
グラフとは何か
グラフとは「頂点(Vertex)」と、頂点同士を繋ぎ合わせる「辺(Edge)」から成るデータ構造です。一例としてFacebookのようなSNSを想像してみてください。
このとき、頂点は登録しているユーザーであり、辺は例えば誰と誰が友達関係であるか(友達関係であるところは繋がっている)を表します。
グラフ信号とは、このようなグラフを入力に信号処理を行う技術です。
通常は頂点の上に、信号値が乗ります。例えばこれはSNSであればユーザーの年齢等の情報です。
グラフ信号処理とは何か
「信号処理」というと、人により思い浮かべるものは異なると思いますが、信号処理の代表的な技術として「フーリエ変換」があります。
フーリエ変換を行うことで、信号の周波数を計算することができます。
このようなフーリエ変換を行う対象は、時間的に一定の間隔で信号値が並ぶ音声波形や、画素上に信号値が並ぶ画像データなどの、規則的に配置されるデータを入力に取ります。
すなわち、一般の信号処理とは、規則的に配置されるデータに対する信号処理です。
一方、グラフ信号処理とは通常の信号処理をさらに拡張したもので、前述のSNSが保有するグラフデータなどの、グラフを入力(より厳密に言えばグラフの上に存在する信号値(以下グラフ信号)を入力)に信号処理を施すことのできる技術の総称です。
例えば、グラフ信号処理の領域では「グラフフーリエ変換」と呼ばれる変換が定義されており、これに基づくとグラフ信号の周波数成分を計算することができます。
通常の信号処理と同じく、低周波成分は元の信号の大局的な特徴を表現します。一方、高周波成分はグラフの特定の頂点で激しく変化しているグラフ信号を表現します。
例えば、SNSで20代の9人と50代の1人が相互に友人関係になっているようなグラフが存在するとき、年齢をグラフ信号として周波数成分を計算(グラフフーリエ変換)し、低周波成分のみからグラフ信号を復元(グラフフーリエ逆変換)すると、グラフ上の頂点上に乗るグラフ信号(年齢)は、大体みんな20代という結果になります。
PyGSPの導入方法
それでは、実際にグラフ信号処理をPythonで行えるライブラリであるPyGSPの導入を行ってみます。
手順1 pip install pygspでPyGSPをインストール
pipが使える環境であれば、以下のコマンドでPyGSPのインストールが可能です。
pip istall pygsp
対応するPythonバージョンは2022年6月現在「Python 2.7 / 3.4 / 3.5/ 3.6」のいずれかとなりますのでPythonのバージョンには注意してください。私はpython3.6の仮想環境上にPyGSPをインストールしました。

手順2 デモコードで動作確認
導入はこれで完了ですので、公式から公開されているデモ用のコードで動作を確認してみましょう。以下のコードを実行してテストしました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np
from pygsp import graphs, filters
G = graphs.Logo()
G.estimate_lmax()
g = filters.Heat(G, tau=100)
DELTAS = [20, 30, 1090]
s = np.zeros(G.N)
s[DELTAS] = 1
s = g.filter(s)
G.plot_signal(s, highlight=DELTAS, backend='matplotlib')
以下のような実行結果が表示されると、正常に動作しています。

まとめ
PyGSPを用いたグラフ信号処理のプログラム作成に向けて、PyGSPの導入を行いました。次回はPyGSPを用いて具体的なグラフ信号処理に取り組んでみたいと思います。