普段PythonはCLIで使っていて、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.
%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モジュールを呼び出す形で使っています