pyprocessing

pythonでprocessingっぽいことをやろうというプロジェクトが立ち上がってた。

pyprocessing

楽しみ。

bruceとかでかっこいいプレゼンが出来るようになると嬉しい。

「ブックビジネス2.0」を読んだ

電子書籍が普及しまくったら図書館ってどういう位置づけになるの?とかそういう疑問があって電子書籍やビジネスに関する本なども読んでいる。

というより、論文がpdf化している割には使いづらいのが気に入らない。doiとかつけといてアトミックな単位がそこか?とか思っている。例えばReal World Haskellみたいにパラグラフ毎にコメントを入れられるようにして、フリーズした状態じゃなくてもっと流動的な知識のストレージの受け皿みたいなのが、必要なんじゃないかなぁと。そういったCGM的なインフラって出来ないもんかね?

ProductName ブックビジネス2.0 - ウェブ時代の新しい本の生態系
岡本 真,仲俣 暁生,津田大介,橋本大也,長尾真,野口祐子,渡辺智暁,金正勲
実業之日本社 / ¥ 1,995 ()
在庫あり。

  • 可処分時間の食い合い
    • アテンションエコノミーとかそういうあたり?
  • デジタル時代の本に対する所有感は「検索できる」ということ
  • アマゾンの読者レビューの問題点
  • 面白い本とは
    • 読み手の読書の動機づけが充分
    • 未知の内容が書かれている
    • 難易度や趣味が今の自分に適合する
  • 図書館という仕組みの制度設計が限界を迎えている
  • オペレーティングシステムとしての図書館、アプリケーションとしての図書館
  • ストックフォト業界の行方
  • 利便性が高ければ有料でも
  • コンテンツ優位の時代

igraphを使ってmaximum common substructure(MCS)を求める

MCSを求めるには比較したい二つの化合物のModular Productを求めて、それの最大クリーク探索をすればいい。

Modular Productとは

  • 二つのグラフの属性の対応が同じノードが両方共隣接していてエッジの属性が同じ場合
  • 二つのグラフの属性の対応が同じノードが両方共隣接していない場合

にエッジを張ったグラフ。

これを作ってあとはigraphの最大クリーク探索メソッドで

import openbabel as ob
from igraph import *

sm1 = 'OCC(N)=O'
sm2 = 'O=CC(N)=O'

obc = ob.OBConversion()
obc.SetInAndOutFormats('smi','smi')

source = ob.OBMol()      
obc.ReadString(source,sm1)
source_atoms = [a for a in ob.OBMolAtomIter(source)]

target = ob.OBMol()      
obc.ReadString(target,sm2)
target_atoms = [a for a in ob.OBMolAtomIter(target)]

pairs = []
for i in range(len(source_atoms)):
    for j in range(len(target_atoms)):
        if source_atoms[i].GetAtomicNum() == target_atoms[j].GetAtomicNum():
            pairs.append((source_atoms[i].GetIdx(),target_atoms[j].GetIdx()))

p = []
for x in range(len(pairs)-1):
    for y in range(x+1,len(pairs)):
        u = pairs[x]
        v = pairs[y]
        if u[0] != v[0] and u[1] != v[1]:
            sb = source.GetBond(u[0],v[0])
            tb = target.GetBond(u[1],v[1])
            if sb != None: sbo = sb.GetBondOrder()
            if tb != None: tbo = tb.GetBondOrder()

            if (sb == None and tb == None) or (sb != None and tb != None and sbo == tbo):
                p.append((pairs.index(u),pairs.index(v)))

g = Graph(p)
mc = g.largest_cliques()
for c in mc:
    print [pairs[i] for i in c]

実際にはline graph(エッジとノードを入れ替えたグラフ)のModular Productをもとめてクリーク探索したほうが計算量がかなり減るらしい。

が、今回はやっていない。

igraphでクリーク探索

igraphはRとPythonのbindingがあるのにチュートリアルがほとんどなさげなので、ネットワーク分析の本があると手っ取り早く知れて良い。

ProductName ネットワーク分析 (Rで学ぶデータサイエンス 8)
鈴木 努
共立出版 / ¥ 3,465 ()
在庫あり。

クリーク探索

こんなネットワークからクリークを探してみる

cliquetest

g <-matrix(c(0,1,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,
             0,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,0,0,1,
             0,1,0,0,0),nrow=7,ncol=7,byrow=TRUE) 
a <- graph.adjacency(g)
maximal.cliques(a)
[[1]]
[1] 0 1 2

[[2]]
[1] 1 6

[[3]]
[1] 0 2 4

[[4]]
[1] 2 3 4 5

[[5]]
[1] 3 6

追記 100818

Pythonの場合

a = [[0,1,1,0,1,0,0],
[1,0,1,0,0,0,1],
[1,1,0,1,1,1,0],
[0,0,1,0,1,1,1],
[1,0,1,1,0,1,0],
[0,0,1,1,1,0,0],
[0,1,0,1,0,0,0]]

g = GraphBase.Adjacency(a,mode=ADJ_UNDIRECTED)
g.maximal_cliques() # [(0, 1, 2), (1, 6), (0, 2, 4), (2, 3, 4, 5), (3, 6)]
g.largest_cliques() # [(2, 3, 4, 5)]

amen alley

hospitalのpodcast聴いてて amen alley /danny byrdやばすぎ!とか思ったら、すでにyoutubeにあがっていた。

これいつリリースされんだろかね。

昔のでも聴いとくか。

ProductName スーパーサイズド
ダニー・バード,ケビン・マーク・トレイル,T-レイシー,レッド
Third-Ear JPN Ltd. / ¥ 2,415 (2008-05-28)
在庫あり。

MCSSTanimotoで組んだネットワークのメリット

MCSSTanimotoで組んだネットワークのメリットはなんといってもエッジの属性にMCSの情報(smilesとかInChi)をのっけられることであろう。

mcs-net

import sys
from Gaston import MCSSTanimoto,Gaston
import openbabel as ob

obc = ob.OBConversion()
obc.SetInAndOutFormats("sdf", "smi")

input = "pc_sample.sdf"
mol = ob.OBMol()
next = obc.ReadFile(mol,input)
mols = [mol]

while next:
    mol.StripSalts(14)
    mols.append(mol)
    mol = ob.OBMol()
    next = obc.Read(mol)

mols = mols[1:11]

for i in range(len(mols)-1):
    for j in range(i+1,len(mols)):
        sys.stdout.flush()
        mcs = MCSSTanimoto(mols[i],mols[j])
        if mcs.score() > 0.2:
            print "%s\t%s\t%s\t%s\t%2.3f" % (mols[i].GetTitle(), "mcs", \
            mols[j].GetTitle(), obc.WriteString(mcs.mcs).split()[0], mcs.score())

でも、実際に組んでみたら、解釈が意外に難しそうなことに気がついた。MCSSTanimotoのアルゴリズム自体が問題なのかもしれない。

MCSよりはmolblaster的に細切れにしてみて最頻出のフラグメントからネットワークを組んでいくか、ありがち置換基の定義済みテーブルを使って類似性の高い置換基動どうしをつなぐという経験ベースのアプローチのほうが直感的かもしれないなぁ。

SMSD (Small Molecule Subgraph Detector)を使う

GastonでMCSを探索するのは色々無理があったようで、どうするかな困った困ったと探していたら、SMSDを見つけた。cdkには既に組み込まれているらしくてさっきビルドしてみたんだけど、よく考えたらCDKの使い方あんまよくわかんないや、、、ってことでGUIで遊んだ。

ちなみに、java6でビルドしないといけないので、osx(10.5)の場合は環境変数を設定した。

SMSD

とりあえず、vildagliptinsitagliptinのMCSをもとめた。

SMSD

なんで5員環と6員環がマッチしてるんだろうか?あとでペーパーちゃんと読もうっと。

追記openbabelでのdiscussもあった

Pythonで外部コマンドがPATHに存在するか探す

SWIGでgastonのPythonバインディング作るのがいいのかもしれないけど、SWIG力が足りないので、外部コマンドから使っている。

os.environ['PATH']で探してみたけど、普通はどうやるんだろうか

if 'gaston' not in reduce(lambda a,b: a+b,[os.listdir(d) for d in \
    os.environ['PATH'].split(':') if os.path.isdir(d)]):
    print "gaston: command not found"
    exit()
os.system("gaston %d %s %s > /dev/null 2>&1" % (freq,gasfile,output))

引き続き化合物のネットワークをいじっている

ノード間で類似性が最大となるような関係にひとつだけエッジを張るようにしてみた。

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

import pybel

mols = list(pybel.readfile("sdf", "pc_sample.sdf"))
fps = [x.calcfp() for x in mols] 

for i in range(len(fps)-1):
    max_sim = 0
    max_name = ""
    for j in range(i+1,len(fps)):
        sim = fps[i] | fps[j]
        if sim > max_sim: 
            max_sim = sim
            max_name = mols[j].title
    print "%s\t%s\t%s\t%2.3f" % (mols[i].title, 'sim', max_name, max_sim)

ついでに類似度属性で色が変わるようにしてみた。

network

わからん。さっきのエッジに加えて類似性が高い化合物同士のエッジは加えてみた。

for i in range(len(fps)-1):
    max_sim = 0
    max_name = ""
    targets = []
    for j in range(i+1,len(fps)):
        sim = fps[i] | fps[j]
        if sim > max_sim: 
            max_sim = sim
            max_name = mols[j].title
        if sim > 0.7:
            print "%s\t%s\t%s\t%2.3f" % (mols[i].title, 'sim', mols[j].title, sim)
    if len(targets) == 0:
        print "%s\t%s\t%s\t%2.3f" % (mols[i].title, 'sim', max_name, max_sim)

network2

ちょっとまとまりが出てきたけど、あれだなぁ。もとのsdfがそもそもあかんのかなぁ。

で、最小全域木(MST)で描くことも考えたけど化合物間の類似性の最小経路を求めてもなぁ、、、とか思ってヤル気がおきない。類似性でつないだネットワークのMSTの意義ってなんなんだろうなぁと。

なんやろかー、なんやろかー。論文もう一回ちゃんと読んでみようかなぁ。

「労働ダンピング」を読んだ

ブックオフにて。アマゾンの星の多さの割になんというか同意できない内容が多くて、そういう主張を読むという意味ではなかなか興味深かった。労働者は会社に搾取されているっていう前提で、幸せに生きる権利を獲得しなければみたいなスタンスかな。本書からは社員がなんかの目的のために集まって結果できた法人形態が会社っていう立ち位置はさらさら感じさせない。

もちろん正規、非正規にも触れていていて雇用の流動化は悪っていう主張っぽい。

ProductName 労働ダンピング―雇用の多様化の果てに (岩波新書)
中野 麻美
岩波書店 / ¥ 819 ()
在庫あり。

あと、紙切れが挟まってた。栞として便利だったのでそのまま挟んで使った。

1281613384

ということは著者は社民よりってこと?それとも共産かな、わからん。

  • 健康に有害なストレスを生み出す長時間労働や職場環境こそ改善しなければならないのだが、一定時間を超えたら産業医の指導や健康診断の実施によって労働者の健康対策を講じるというでは、労働者個々人の健康問題に収斂されてしまいかねない
  • 労働時間規制は、「何時間働けるか」ということではなく「何時間労働から開放されて時自分のための自由な時間を確保できるか」という生活の自由の確保に存在根拠があった
  • グローバル化は、本来ならば、これまでにない物質的進歩をもたらし、すべての人々に生産的で、より良い仕事を与え、貧困の撲滅に大きな貢献を擦る可能性がある
    • この主張の根拠がよくわからなかった
  • 安心して働ける仕事としてイメージされるもの
    • 働き手にふさわしい力と役割を発揮できる
    • 働き手の生活や健康、人格が大事に尊重できる
    • 自立して将来を見通しながら生きる基盤となる
  • 登録型という雇用自体この社会に認めてはならない働き方
  • 労働時間差を理由とする処遇格差が差別であるという考え方が自然に受け入れられる働き方が「ワーク・ライフバランス」というものだろう

理想はまぁその通りだと思うんだけど、それを達成しようとする手段に組合臭を強く感じた。

モチベーション3.0とかハイコンセプトが、自分で未来を切り開こう的な前向きな内容なのに対して、本書は、企業に奪われた「幸せという宝箱」を奪還しようというRPG的な内容かなぁ。まぁ、宝箱の中には「安定雇用」も「正規雇用」も入ってなくてスッカラカンだとおもうんだけどねぇ。