Postgresのstored functionで2次元配列を引数にし,Pythonから呼び出す

How to call a Postgres stored function with an matrix as an argument from Python

あまりサンプルがなかったので,簡単なものを作成してみた。その2。
ここを参考にした。

  • Postgres 16
  • Python 12

二次元配列で数字のリストを渡して,ストアドファンクションで合計を計算し,返す

Postgresql

Python

Postgresのstored functionで配列を引数にし,Pythonから呼び出す

How to call a Postgres stored function with an array as an argument from Python

あまりサンプルがなかったので,簡単なものを作成してみた。

  • Postgres 16
  • Python 12

配列で数字のリストを渡して,ストアドファンクションで合計を計算し,返す

Postgresql

Python

ジョブスケジューラのエラー

大学のスパコンはジョブ管理システム PBSによってジョブスケジュールを行なっているのですが,
最近変わったのか,Pythonで並列処理をしようとするとなぜかエラーが出るようになりました。

エラー

コード

これで実行スクリプトはこんな感じ

解決方法

ここにありました。

簡単に解決するためには,Pythonコードの一番上に

これを入れるだけ。Numpyを呼ぶ前に呼ぶ必要があるので,シェルスクリプトで呼んでもいいですし,Pythonの一番上で環境変数に設定してやってもいいです。

Mac OS 11.4でpip pdftotext

M1Macで何故か素直に入らなかったのでメモ

環境

  • M1 Mac book Air
  • OS: 11.4
  • python: Intel miniconda3
  • python version:3.8.5

手順

brewでPdftotextを入れる

~/.zshrcに追加

pipでpdftotextライブラリを入れる 

M1 MacでのPython

M1 Mac book Air 購入したのですが,なかなか使いこなすにはハードルが高そうです。
特に,Pythonのモジュール類がうまく動かないものが多いです。

いろいろ書かれていますが,結論としては,Rosetta2を使うのが一番という結論。

brewのPythonを使うパターン

これは,ディープラーニング系のライブラリが全く入りません。
自分でGitHubからソースコード持ってきてインストールできるものもあるのですが
かなり厳しいです。

pyenvを使うパターン

brewと同様

miniforgeを使うパターン

これはarm用のライブラリもあるのですが,全部はない模様。。

rosetta2でminiconda

これが簡単ですね

これでIntelと同様に使えます。多少遅くなっているのでしょうが気にしない

VSCodeのjupyter notebookが起動しない

最近VSCodeをアップデートしたところ、PythonのNotebookが起動しなくなりました。

これでずーと待ったのちに、タイムアウト。

こちらに解決方法が!!

どうやら、Pythonのモジュールと干渉しているようですので、バージョンダウン。

これで無事起動できました。

KLDivergenceとJSDivergence

Pythonのコード作成したのでメモ

KLダイバージェンス

$$D_{KL}(P||Q) = \sum_x p(x) \, \log \frac{P(x)}{Q(x)}$$

JSダイバージェンス

$$D_{JS}(P||Q)=\frac{1}{2}\bigg\{ D_{KL}(P \, || \, R)+D_{KL}(Q \, || \, R) \bigg\}$$
$$R = \frac{P + Q}{2}$$

プログラム

ここを参考に

データ

まずはデータの準備

ヒストグラム

KLダイバージェンス

JSダイバージェンス

実験

まずはaとbの分布を調べます。

KLダイバージェンスはaとbを入れ替えると値が変わりますが、JSダイバージェンスでは同じです。

つぎに、分布間でのKLダイバージェンスとJSダイバージェンスの値を調べます

結果を見ると、距離の遠い順にKLダイバージェンス、JSダイバージェンスの値が大きくなっています。KLダイバージェンスの場合には、どちらを基準にするかによって変わってくるので注意が必要みたいですね。

BERTモデルをPytorchのモデルへ変換

Tensorflowで作成したBERTモデルを、Pytorchへ変換します。

こちらに方法が書いています。

モデル

モデルを自分で計算して作ってもいいのですが、公開しているものがあるので、そちらを使います。

KNP

こちらはKNPを使って分かち書きしたWikipedia日本語版を元に作成しています。
あまりKNPを使ったことはないのですが、実際に使うときにはMeCabで分かち書きをしても大丈夫でしょう。

SentencePiece

こちらのものは同じく日本語Wikipediaを用いて、SentencePieceによる分かち書きをしたものです。

Transformers

Pytorchで用いるのライブラリです。以下のコマンドでインストールしておきます。

変換

SentencePieceで作成したモデルにはPytorch用のモデルがついていませんので、変換してみます。
こちらには以下のファイルが含まれています。

このコマンドでpytorch_model.binというファイルへ変換します。

numpyのエラー

tensorflowのサンプルを動かそうとしたときのエラー

どうやら、numpyが壊れているらしい?

これで解決

VAEを用いたなりすまし検知を書き直してみる

こちらの記事「VAEを用いたUNIXセッションのなりすまし検出」はソースコードが完全に公開されていないので、補完してみました。

環境

  • macOS 10.14
  • python 3.7

データ準備

まず、データを準備します。こちらからダウンロードします。ダウンロードしたら、解凍し、Fasttext用にデータを結合します。各ユーザの前半の5000は訓練用のデータで、なりすましがないデータですので、これをすべてのユーザから抽出します。ユーザごとに一行にコマンドをスペースでつないで作成します。全部で五十行になります。

Fasttextによるベクトル化

単語をfasttextによりベクトル化します。50次元を使っています。fasttextはpipでインストールしたものでもOKです。

UMAPによる可視化

元記事では出現頻度の高いコマンドから200取り出して、可視化していますが、面倒なので、modelの単語列から上位50単語を抜き出して可視化します。

モデル

元記事のものではそのままでは動かなかったので多少修正しています。

入力データ

入力データを作成します。ファイルから再度読み込んで、訓練データを上位4000コマンド、テストデータを4001から5000コマンドで作成します。また、元記事と同様にUser2を使っています。

訓練

Earlystoppingを入れました。訓練は100コマンドをひとかたまりとして訓練しています。

結果の可視化

訓練データでのLossを可視化します

テスト

最後に、1%の確率でなりすましが入っているという各ユーザの5001行目からのデータをつかって、Lossを可視化します。同様に100コマンドをひとかたまりとして、100個分をテストしています