chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

WSLにjupyterを入れる→HeatMapを動かす

普段PythonCLIで使っていて、jupyter等は使っていなかった。が。。子供の修論でHeatMap解析でエラーが出ているとかで少し手伝いすることになり、jupyterを入れてみる。Windows環境ではなく、wsl上のUbuntuに入れることにする。
wslを起動して、プロンプトから以下を打ち込む。この手順ですんなりJupyter notebookが入った。

pip3 install Jupyter
pip3 install jupyterlab
pip3 install pandas
pip3 install numpy
pip3 install SciPy
jupyter-lab --ip='0.0.0.0'

jupyter起動時にアクセス方法の説明が出るので、そのURLにアクセスする

    To access the server, open this file in a browser:
        file:///home/sumi/.local/share/jupyter/runtime/jpserver-797-open.html
    Or copy and paste one of these URLs:
        http://ubuFV4:8888/lab?token=d90d6fxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5785673
        http://127.0.0.1:8888/lab?token=d90d6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb5785673

Jupyterは使えるようになった。次に、HeatMap解析プログラムをJupyterに貼り付けて、データを読み込まして動かしてみる。
HeatMapのプログラムを動かすにはパッケージが不足しており以下を追加した*1

python3 -m pip install  matplotlib
python3 -m pip install  seaborn
python3 -m pip install  scikit-learn

実行してみると、”The condensed distance matrix must contain only finite values.”というエラーが出る。 np.app(np.isifinite(y))がFalseなんだろう。yって何なのか?

File ~/.local/lib/python3.10/site-packages/scipy/cluster/hierarchy.py:1064, in linkage(y, method, metric, optimal_ordering)
   1061     raise ValueError("`y` must be 1 or 2 dimensional.")
   1063 if not np.all(np.isfinite(y)):
-> 1064     raise ValueError("The condensed distance matrix must contain only "
   1065                      "finite values.")
   1067 n = int(distance.num_obs_y(y))
   1068 method_code = _LINKAGE_METHODS[method]

ValueError: The condensed distance matrix must contain only finite values.

jupyterでもpdbが使えるらしいので、pdbを有効化

%pdb on

pdbを使ってyを調べてみる

ipdb>  type(y)
<class 'numpy.ndarray'>
ipdb>  np.isfinite(y)
array([ True,  True,  True, ...,  True,  True,  True])
ipdb>  np.all(np.isfinite(y))
False
ipdb>  np.isfinite(y)
array([ True,  True,  True, ...,  True,  True,  True])
ipdb>  len(np.isfinite(y))
19322436

yとはnumpyのndarray型(配列何だろう)。isfiniteで有限?かをチェックするのだが、要素数19322436のうち、いくつかがisfinite()の結果がFalseなんだろう。要素数が多すぎてどうやって調べたらいいのやら。有限でないデータはサンプルから取ってしまってもいいぐらいなのだが、どのサンプルで怒られているのか特定が難しい。が、、、実行途中で結果報告がなされていて、特定の遺伝子ですでにNaNとかになっていた。

エラー原因と思われる遺伝子の元データを確認、多分0が入ってるとNaN -infになるのだろうと推測

$ grep AT2G26570.2 231029_2.txt
AT2G26570.2     113.9666667     45.93333333     157.5666667     82.53333333
AT2G26570.2     257.9666667     0       142.0333333     0
AT2G26570.2     321.3666667     0       78.63333333     0
AT2G26570.2     90.4    107.7   93.3    104.6666667
AT2G26570.2     130.48  98.13333333     86.8    84.26666667
AT2G26570.2     133.26  145.6333333     13.6    100.8666667
AT2G26570.2     67.26   79.06666667     84.3    163.2333333
AT2G26570.2     115.96  120.9   62.46666667     83.43333333

$ grep AT2G19520.1  231029_2.txt
AT2G19520.1     47.76666667     56.16666667     217.6   78.5
AT2G19520.1     0       0       0       400

0であることにも意味があるのだが、なぜ値の0が扱えないのか根本的な理由が分からない。workaroundとして、0に近い値(0.00001)等に置き換えて演算させる。エラーは解消したものの、指定したクラスター数にならないのはなぜか。
使ってるのがseabornのheatmap/clusterなのだが、ブラックボックスとして使っているため計算根拠が分からない。clusterについて計算するアルゴリズムをある程度理解しないと、正しく動いてるのかどうかも分からない。以下は全データのサブセットで描画した例

自分の仕事ではなく子供の手伝いで、、これ以上深堀していると自分の課題が進められないので、一旦ここまでとする。


FFTを訪ねて[前編]電気屋としての理解を探る - The Negligible Lab
PIC AVR 工作室 FFTの計算と複素数の入門
Fast Fourier Transform (FFT) — Python Numerical Methods
Fast Fourier Transform (FFT) Algorithm Implementation In Python | by Vincent T. | 0xCODE | Medium
フーリエ変換の意味と応用例 | 高校数学の美しい物語
FFT(高速フーリエ変換)を完全に理解する話 #AtCoder - Qiita

*1:pipの呼び出し方が違うが、過去Python2/3の両方が入ってる時に、pipだけで起動すると2か3かどっちのpipかわからなくなった。ので、python3からpipモジュールを呼び出す形で使っています