Anacondaで仮想環境構築メモ

Anacondaで仮想環境をよく作るので、環境にまつわるコマンドなどのメモ。

仮想環境の確認方法

下記二通りの記述方法がある。

conda env list
conda info -e

仮想環境の新規作成

下記の様な形で仮想環境の新規作成を行える。

conda create -p <作成先ディレクトリ> <インストールモジュール>

この例はtensorflowの実行環境を準備した時のもの。

conda create -p ~/anaconda/envs/tensorflow anaconda

仮想環境の実行&終了

下記コマンドで仮想環境の実行が可能。

source activate <仮想環境名>

下記コマンドで仮想環境を終了することが可能。
ただし、仮想環境実行中のみ有効となる。

source deactivate

数を足し合わせる際の情報落ちへの対処法

大量の数を足し合わせる際に情報落ちをしてしまう問題への対処法メモ。
少数の数の足し合わせであれば情報落ちも無視していいレベルの場合もあるが、大量の数を足し合わせる際には無視できない数となる。また、expスケールなどの大きな数を取り扱うに当たっても注意が必要である。

logスケール変換

大量の数の下記のような和を考える。

{ \displaystyle
L = \sum^{n}_{k=1} l(k)
}

このまま計算してしまうと情報落ちが発生してしまうため、各{l(k)}{\log}スケールに変換して和の計算を行う。

{ \displaystyle
\begin{align}
\log L &= \log \left( \sum^{n}_{k=1} l(k) \right)  \\\\
&= \log l(k^{*}) + \log \left\{ \sum^{n}_{k=1} \exp \left( \log l(k) - \log l(k^{*}) \right) \right\}
\end{align}
}

ただし、 k^* = {\rm argmax}_k \ l(k)としている。
ここで、第一項は最大値をそのまま計算した値となり、第二項における \exp の計算は指数部分が全て負の値となり、情報落ちを抑えて計算することができる。

Pythonコード

この計算を計算するPythonのfunctionを下記のように作成した。

def log_sum(l_log):
    '''calculate sum of log'''
    max_log = max(l_log)
    l_log_minus = l_log - max_log
    out_value = max_log + np.log(np.sum(np.exp(l_log2_minus)))
    return out_value

Pythonで他階層にあるモジュールのimport

Pythonで他の階層にあるモジュールをimportする時のメモ。
PythonではPythonファイルを実行する際に、そのファイルが置いてあるディレクトリをルートとして扱ってしまうという仕様があるみたいで、上位の階層や、隣のディレクトリにあるファイルを簡単にimportすることができない。この問題にはよく遭遇するのでその時の解決方法を残しておく。

階層構造

例えば、階層構造として下記のようなディレクトリ構成になっていることを考える。Pythonファイル"aaa.py"から、"bbb.py"をimportしたいケースを考える。

[any directory]/
 ┣ AAA/
 ┃  ┗ aaa.py  : **現在実行しているPythonファイル**
 ┗ BBB/
    ┗ bbb.py  : **importしたいPythonファイル**

__init__.pyの配置

モジュールとして認識させるため、それぞれのディレクトリに"__init__.py"を配置する。中身は空で構わない。その時のディレクトリ構成は下記となる。

[any directory]/
 ┣ AAA/
 ┃  ┣ __init__.py  : **initファイルを追加**
 ┃  ┗ aaa.py  : **現在実行しているPythonファイル**
 ┗ BBB/
    ┣ __init__.py  : **initファイルを追加**
    ┗ bbb.py  : **importしたいPythonファイル**

Pythonコード

osモジュールを利用して現在のディレクトリを取得し、上位のパスをsysモジュールを用いてpathリストにappendする。そうすることで、一つ上位の階層をpathに加えることができるので、"bbb.py"をimportすることができる。

aaa.pyの中身

import os
import sys
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)

import BBB.bbb

MacでTex環境の構築&自動化メモ

MacTex環境を構築したのでメモ

Macの環境

MacBook Pro (Retina 13-inch、Early 2015)
OS X EI Capitan バージョン10.11.6

Texのダウンロード&インストール

MacTexを下記サイトからダウンロードしてインストールした。
MacTeX - TeX Users Group

Texファイルのコンパイル

TexファイルをAtomコンパイルしようとしたところ、デフォルトが"Latex"でのコンパイルとなっていたため、 日本語ファイルがコンパイルできなかった。Atomに入れたTex関連のパッケージは下記。

この環境だと、pLatexコンパイルができず。。。
色々調べて、Atomの上記パッケージのjsを修正すればpLatexの実行ができるというような記事を見つけて色々試したが、断念。 ターミナルからコンパイルすることにする。

ターミナルからのコンパイル方法

ターミナルからpLatexでのコンパイルを実行する方法は下記となる。大まかには、pLatexでのコンパイル→pbibtexのコンパイルpLatexでのコンパイル(2回、citationをつけるため)、DVIからPDFへの変換、となる。

cd [target directory]
platex -output-directory=[target output directory] [target file]
pbibtex [target file]
platex -output-directory=[target output directory] [target file]
platex -output-directory=[target output directory] [target file]
dvipdfmx -o [target pdf file] [target dvi file]

例)"testLatex.tex"からPDFを作成する。

cd /Users/~~/sampleLatex
platex -output-directory=./out testLatex
pbibtex ./out/testLatex
platex -output-directory=./out testLatex
platex -output-directory=./out testLatex
dvipdfmx -o ./testLatex.pdf ./testLatex.dvi

コンパイルの自動化

毎回上記のようなターミナル実行を行うことが面倒だったので、Pythonで自動化するコードを作成した。コードはGitHubにあげているため、そちらを参照。

github.com

実行方法

このコードの実行方法は下記となる。
まずディレクトリ構成を下記のように作成し、対象のPythonファイル、Texファイルを配置する。

[any directory]/
 ┣ compileTex/
 ┃  ┗ compile_pLatex.py  : **自動化用のPythonファイル**
 ┗ sampleLatex/
    ┣ out/
    ┃  ┗ testLatex.pdf  : **このディレクトリに最終アウトプットのPDFが出力される**
    ┗ testLatex.tex  : **PDFを作成したいtexファイル**

その後、下記コマンドを実行することで、PDF作成までのコマンドを全て実行するようにしている。

python compile_platex.py -d [target_directory] -f [target_file] -o [target_output_directory]

オプション引数の意味:

  • -d : 対象のディレクトリ名(必須)
  • -f : 対象のファイル(必須)
  • -o : 対象のアウトプットディレクトリ名(任意、デフォルト"out")

例えば、ディレクトリ構成を上記と同じような形にすると、コマンドは下記となる。

python compile_pLatex.py -d sampleLatex -f testLatex