windowsからsshとmakeする環境構築
自宅のメインで使ってるPCはWindowsなのだが、ここからも研究室のサーバーとかにsshしたいし、makeもしたい、その他もろもろの作業もしたい。
Cygwinを使うとCygwinの中と外で環境が別物になってしまうのが少し嫌いだった。かといってLinuxの仮想マシンを構築するほどでもない。そこでMinGW+msys+minttyの環境を構築することに。
以下、メモ程度に。
- 公式ページの"Get Started"に従ってMinGWとmsysをインストール。
- 使いやすいシェルが欲しいので、minttyをインストール
Windowsで最高のターミナルを構築する方法 - 純粋関数空間
mintty を使えるようにする | dogmap.jp
これらを参考にした。
- minttyの設定で表示をsjisにする。
- lsで日本語ファイル名が表示出来なかったので
msysのls.exeで日本語ファイル名を… - methaneのブログ
あたりに従って直す。
これでmakeもできるしsshもできる。いろいろできる。快適。
Pythonで型変数っぽいこと
Pythonで、インスタンスを作る時のオブジェクトの型を実行時に決めるにはどうすればいいのか、と少し悩んだ
つまり
ふつうPythonであるオブジェクトのインスタンスを作るときは、
instance = MyClass(*param)
とするけれど、ここで、どのクラスのオブジェクトを作るかを実行時に変化するような状況。
apply関数を使うのかなーと思って試したけどどうもうまくいかない。
結局、単に
var = MyClass instance = var(*param)
でいいらしい。呆気無すぎる…
実験
class Test: def __init__(self,message): self.message=message def echo(self): print self.message a=Test b = a("hoge") b.echo()
結果
うむ。あっけない。基本がなっていなかったようです。
グラフィカルラッソやってみた
けっこう前の話になるけど、
ふと思い立ったのでグラフィカルラッソのアルゴリズムを実装してみた。
入力として、なにかの分散共分散行列を貰った時に、
をそこそこ効率的にもとめるアルゴリズムのこと。
http://www.geocities.co.jp/Technopolis/5893/course_machine_learning_2010.html
にあるスライドあたりを参考にしてます。
#coding: utf-8 from numpy import * from numpy.linalg import * def GraphicalLasso(S,l): (dim,m) = S.shape #対角成分をまずセットする L = diag(diag(S)) + 2*l sdiag = diag(S) for k in xrange(dim): if k==0: continue print k beta=zeros(k) sk = S[k,:k] sdiagk = sdiag[:k] #列ごとの最適化。 epsilon=1e-8 oldbeta=beta import itertools for time in itertools.count(): beta = (sk - dot(S[:k,:k],beta) + beta*sdiagk) / sdiagk #shrinkage gamma = 2.0 * l / sdiagk big = where(abs(beta)>gamma) small = where(abs(beta)<=gamma) print big beta[big] -= (gamma*sign(beta))[big] beta[small] = 0 #収束条件は適当に。 if norm(beta-oldbeta) < epsilon: break oldbeta[:]=beta Lnew = -L[k,k]*beta L[k,:k] = Lnew L[:k,k] = Lnew return L
これでそこそこ動いているようだ。
Cython+Numpyメモ
いろいろと必要があってCythonとNumpyを使うことになりましたが、少し嵌ったのでメモ
数値計算にはPython+Numpyを利用していましたが、(禁忌とされる)データに対して直接forループを回さなければならないような状況に陥ったので、仕方なくCythonを導入。
CythonからNumpy.arrayにアクセスしたい時は、ナイーブな方法で行うとオーバーヘッドが大きい。
そのため、配列へのアクセスを高速に行うための仕組みがCythonにあります。
- Working with Numpy
- http://docs.cython.org/src/tutorial/numpy.html#efficient-indexing
このあたりの公式文書を参照のこと。Pythonのオブジェクトとして扱うのではなく、きちんと型と次元を指定してやって、もっとC寄りの配列を直接いじる感じ。
さて、この機能を利用するために冒頭で
import numpy as np cimport numpy as np
としてnumpyのCのヘッダを読みこんでやらないといけません。
これをコンパイルするために、ドキュメントを参照しながら適当にsetup.pyを作り、
$ python setup.py build_ext --inplace
としてコンパイルを実行すると、ありとあらゆるコンパイルエラーが出たあとに、
error: command 'gcc' failed with exit status 1
とのたもうて落ちる。cythonでCのコードを生成するのは問題なくできるので、Cをコンパイルする段での問題なのは明らかだったのですが、なかなか問題が解決できず詰まるなどしていました。。
結論から言うと簡単なことで、gccにnumpyにまつわるヘッダファイルの所在を教えてあげなければいけない、ということだったようです。
numpy用のインクルードパスはnumpy.get_numpy_include()で取得できるので、setup.pyを上手く書き換えてやって
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext import numpy setup( name="CPWOPTcritical", cmdclass={"build_ext":build_ext}, ext_modules=[Extension("hoge",["hoge.pyx"], include_dirs=[numpy.get_numpy_include()]#ここでインクルードパスを指定 )] )
としてやれば、うまくコンパイルが通りました。
もっと早く気づいていれば…