統合情報理論(IIT)を扱うためのライブラリPyPhiの導入

## まえがき

[『意識はいつ生まれるのか ー脳の謎に挑む統合情報理論ー』](https://www.amazon.co.jp/dp/B01GJOQSO2)という本を読み、統合情報理論というものに興味を持ちました。

・「入力に対して出力がある」だけでは神経細胞だろうとand回路だろうと同じことで、意識があるとは言えない。
・統合情報理論において、意識とは(大雑把に言うと)「多様な情報を統合する能力」のことを指す。
・この「多様な情報を統合する能力」をΦと呼称する。ある組織の持つΦは計算によって定量化することができる。

というもの。

面白そうだなあ、と思いつつ本を読んでいてもΦの計算方法は具体的には出てきません。

仕方ないのでネットでいろいろ調べてみると、pythonでΦの値を計算することができるライブラリというものを見つけました。

公式ページ
https://pyphi.readthedocs.io/en/latest/index.html

Φの計算方法もちゃんと書いてあるぞ、どれどれ....↓

https://journals.plos.org/ploscompbiol/article/file?id=10.1371/journal.pcbi.1006343.s001&type=supplementary
 (全227ページ!!!!)
計算方法は複雑だしとにかく量が多いしでなかなかしんどかったので、とりあえず導入方法と実際の使用例だけまとめます。

具体的な計算方法は別の記事で。

## 導入

```
pip install pyphi
```

で導入を行います。ただしこれは**maxOSとLinux**用に作られたライブラリと書かれていて、実際に自分のwindowsで試したところエラーが出ました。

windowsの場合はcondaコマンドを使用します。

```
conda install -c wmayner pyphi
```
これで導入できます。

また、google Colaboratoryを使用するならpipから導入可能です。

```
!pip install pyphi
```

## 使用例

まず以下のような有向グラフを考えます。(図はnetworkxを用いて出力しました)

![rapture_20200422164134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356208/a3f38938-5310-cafe-1de9-9e665a56e3f5.jpeg)


隣接行列で表すと


```math
  \boldsymbol{CM} = \left(
    \begin{array}{ccc}
      0 & 1 & 1 \\
      1 & 0 & 1 \\
      1 & 1 & 0
    \end{array}
  \right) 
````
という形ですね。

これらの三つの要素は全て1か0どちらかの状態を持っています。

それぞれが2通り持っているので、合わせて$2^3=8$通りの状態があります。並べてみましょう。

|  A  |  B  |  C  |
| ---- | ---- | ---- |
|  0  |  0  |  0  |
|  1  |  0  |  0  |
|  0  |  1  |  0  |
|  1  |  1  |  0  |
|  0  |  0  |  1  |
|  1  |  0  |  1  |
|  0  |  1  |  1  |
|  1  |  1  |  1  |

それぞれの要素は入力と出力を持ち、またそれ以外の要因で自身の状態が変化することはありません。$t$の状態（左)から各自が繋がった要素に対して入出力を行った結果、$t+1$での状態(右)のように変化したとします。

|| t ||||t+1| |
|---- | ----|---- |----| ----|---- | ----|
|  A  |  B  |  C  ||  A  |  B  |  C  |
|  0  |  0  |  0  |→|  0  |  0  |  0  |
|  1  |  0  |  0  |→|  0 |  0  |  1  |
|  0  |  1  |  0  |→|  1  |  0  |  1  |
|  1  |  1  |  0  |→|  1 |  0  |  0  |
|  0  |  0  |  1  |→|  1  |  0  |  0  |
|  1  |  0  |  1  |→|  1  |  1  |  1  |
|  0  |  1  |  1  |→|  1  |  0  |  1  |
|  1  |  1  |  1  |→|  1  |  1  |  0  |

この表を行列の形で表してみましょう。ただし左側($t$での状態)は標準化されてるので省略できます。

```math
  \boldsymbol{TPM} = \left(
    \begin{array}{ccc}
      0 & 0 & 0 \\
      0 & 0 & 1 \\
      1 & 0 & 1 \\
      1 & 0 & 0 \\
      1 & 0 & 0 \\
      1 & 1 & 1 \\      
      1 & 0 & 1 \\
      1 & 1 & 0 \\
    \end{array}
  \right) 
````

これをTPM(transition probability matrix, 遷移確率行列)といいます。この値が表しているのは1になる「確率」なので、実際には1とか0とかに限らず0.9とかもっと別の値が入ります。その場合は「0.9の確率でその地点が1になる」ことを示します。

では、このネットワークを作成しましょう。

````python
import pyphi
import numpy as np
tpm = np.array([
     [0, 0, 0],
     [0, 0, 1],
     [1, 0, 1],
     [1, 0, 0],
     [1, 0, 0],
     [1, 1, 1],
     [1, 0, 1],
     [1, 1, 0]
 ])
cm = np.array([
     [0, 1, 1],
     [1, 0, 1],
     [1, 1, 0]
 ])
labels = ('A', 'B', 'C')
# この場合のcmは省略可能
network = pyphi.Network(tpm, cm=cm, node_labels=labels)
```

作成したネットワークにおいて、Φを計算するための起点となる、A,B,Cの初期状態を設定します。この場合は(1, 0, 0)とします。

```python
state = (1, 0, 0)
```

計算の対象となるsubsystem(小システム、下部組織?)を決めます。今回は全要素を取ります。

```python
node_indices = (0, 1, 2)
subsystem = pyphi.Subsystem(network, state, node_indices)
# 今回はこれでも可
# subsystem = pyphi.Subsystem(network, state)
```

この初期状態をいろいろ弄ることで対象の持つ情報統合能力を測ります。

では肝心のΦを計算しましょう。

```python
pyphi.compute.phi(subsystem)
# 1.916665
```

できました。

今回の計算対象は先ほど貼った[計算方法の解説資料](https://journals.plos.org/ploscompbiol/article/file?id=10.1371/journal.pcbi.1006343.s001&type=supplementary)のものを使用し、同様の計算結果が220ページで導出されています。

具体的な計算方法は後々記事にまとめたいですが、詳しい手順を見たい方は公式から読んでみてください。

## 参考
ジュリオ・トノーニ『意識はいつ生まれるのか　脳の謎に挑む統合情報理論』亜紀書房

PyPhi公式ドキュメント
https://pyphi.readthedocs.io/en/latest/index.html