<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>matplotlib / Drkcore</title><link>http://blog.kzfmix.com/matplotlib</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Thu, 18 Mar 2010 19:38:47 +0919</lastBuildDate><item><title>Machine Learning: An Algorithmic Perspective 12章</title><link>http://blog.kzfmix.com/entry/1268908138</link><description>&lt;p&gt;遺伝アルゴリズム&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/1420067184/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/41G8p6DFoAL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;Machine Learning: An Algorithmic Perspective (Chapman &amp; Hall/Crc Machine Learning &amp; Patrtern Recognition)&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
Stephen Marsland &lt;br /&gt;
Chapman &amp; Hall / ￥ 6,529 ()&lt;br /&gt;
通常2～3週間以内に発送&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Four Peaks Problemってのがあるらしい。目的関数が&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最初のビットからの連続した1の長さか最後のビットから連続した０の長さの大きいほう&lt;/li&gt;
&lt;li&gt;但し、両端の1,0の連続した数が10以上の場合は100ポイント獲得する。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目的関数はこんな感じ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
# -*- encoding:utf-8 -*-

from itertools import takewhile

def o(bits):
   return len(list(takewhile(lambda x: x == 1,bits)))

def z(bits):
       return len(list(takewhile(lambda x: x == 0,reversed(bits))))

def f(bits):
   reward = 100 if o(bits) &amp;gt; 10 and z(bits) &amp;gt; 10 else 0
   return max(o(bits),z(bits)) + reward


if __name__ == "__main__":
    bits1 = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
    bits2 = [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

    for bits in [bits1,bits2]:
        print "score: %d %s" % (f(bits),bits)

#score: 20  [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#score: 114 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;要するに素直に探索していくとローカルミニマムに落ちるようになっていて、ピークの数が4つあるのでFour Peaks Problem&lt;/p&gt;

&lt;p&gt;連続した1,0の長さでcontour plotを描いた。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/4peaks.png" alt="4-peaks problem" /&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
# -*- encoding:utf-8 -*-

def sim_score():
    for x in range(100):
        for y in range(100):
            if x + y &amp;gt; 100:
                yield 0
            else:
                score = four_peak(x,y)
                yield score

def four_peak(x,y):
    reward = 100 if (x &amp;gt; 10 and y &amp;gt; 10) else 0
    score = max(x,y) + reward
    return score

if __name__ == "__main__":
    from pylab import *

    delta = 1
    x = arange(0, 100, delta)
    y = arange(0, 100, delta)
    X, Y = meshgrid(x, y)
    Z = array([z for z in sim_score()])
    Z.shape = 100,100

    im = imshow(Z,origin='lower' ,alpha=.9)
    colorbar(im)

    cset = contour(X,Y,Z)   
    clabel(cset,inline=1,fmt='%1.1f',fontsize=10)

    hot()
    savefig('4peaks.png')
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Thu, 18 Mar 2010 19:38:47 +0919</pubDate><category>Python</category><category>matplotlib</category><category>machinelearning</category></item><item><title>LeadOptimizationをシミュレーションしたい</title><link>http://blog.kzfmix.com/entry/1268224769</link><description>&lt;p&gt;ふと、&lt;a href="http://twitter.com/kzfm/status/10254396549"&gt;つぶやいた&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;例えば&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;プロジェクトで500検体合成&lt;/li&gt;
&lt;li&gt;ひとつの親あたり5-25化合物くらいの子を合成する&lt;/li&gt;
&lt;li&gt;プロジェクトの人員の制限により、一度に10ラインまでしか同時に走らない
&lt;ul&gt;
&lt;li&gt;11番目以降はそれ以降のオプティマイゼーションは行われない&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;その時知りたいことは、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;{計画、合成、アッセイ、解析}というサイクルは何回まわるのか、&lt;/li&gt;
&lt;li&gt;有望そうな化合物だけど、人的リソースの関係で選択されなかった歴史はどこにあるか？&lt;/li&gt;
&lt;li&gt;バックアップ候補の化合物はどこら辺で現れるか（初期？中期？）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;あたり。&lt;/p&gt;

&lt;p&gt;現実の系に近づけるために、親化合物にはポテンシャルがあって、近傍探索すると、ポテンシャルの近くで活性が変化するモデル。あと同じライン（ブランチ）を継続して合成すると、ポテンシャル曲線が底に近づくのと、合成もSARに関する知識がついてくるので、活性は上がりやすくなって、かつ変動幅も小さくなるようにweightはだんだん小さくなるようにしてみた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
# -*- encoding:utf-8 -*-

# kzfm &amp;lt;kerolinq@gmail.com&amp;gt;

from random import random
import networkx as nx
import matplotlib.pyplot as plt


class Branch(object):
    """LeadOptimization flow"""

    count = 0

    @classmethod
    def inc_count(cls):
        cls.count = cls.count + 1
        return cls.count

    @classmethod
    def get_count(cls): return cls.count

    def __cmp__(self, other):
        return cmp(self.act, other.act)

    def __init__(self,potency,weight):
        self.num = Branch.inc_count()
        self.potency = potency
        self.weight  = weight
        self.act = self.potency + self.weight * random()

    def make_child(self,num_childs,potency,weight):
        return [Branch(self.potency + self.weight * random(),self.weight * 0.7) for i in range(num_childs)]

if __name__ == "__main__":
    max_comps        = 500
    initial_branches = 3
    nodesize         = []
    nrange           = []
    erange           = []
    generation       = 1
    heads = [Branch(0.3,1) for i in range(initial_branches)]
    G=nx.Graph()

    for h in heads: 
        nodesize.append(h.act * 30)
        nrange.append(generation)

    while Branch.get_count() &amp;lt; max_comps:
        new_heads = []
        generation += 1
        for branch in heads[:10]:
            for new_comp in branch.make_child(int(5+20*random()),branch.potency,branch.weight):
                nodesize.append(new_comp.act * 30)
                nrange.append(generation)
                erange.append(generation)
                G.add_edge(branch.num,new_comp.num)
                if new_comp.act &amp;gt; 0.75:
                    new_heads.append(new_comp)
        heads = new_heads
        heads.sort()

    nx.draw_spring(G, node_size=nodesize, node_color=nrange, edge_color=erange,alpha=0.7, \
cmap=plt.cm.hot, edge_cmap=plt.cm.hot, with_labels=False)
    plt.savefig("proj.png")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/proj.png" alt="project" /&gt;&lt;/p&gt;

&lt;p&gt;んーなんかいまいち。一応活性の強弱にあわせてノードのサイズが変わるようにしてみたんだけど、大きさがわからん。&lt;/p&gt;
</description><pubDate>Wed, 10 Mar 2010 21:56:46 +0919</pubDate><category>chemoinformatics</category><category>Python</category><category>network</category><category>matplotlib</category></item><item><title>matplotlibのバックエンドを切り替える</title><link>http://blog.kzfmix.com/entry/1203236735</link><description>&lt;p&gt;cronとか別にディスプレイ上に表示しなくていい場合は適当に引数を与えてやることでmatplotlibのバックエンドを切り替えることができる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;some_matplotlib.py -dAgg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;別にこんなことしなくてもuseしても同じことが出来るということを最近知った。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import matplotlib
matplotlib.use('Agg')
from pylab import * 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ただし、pylab呼び出しよりも先にやっておかないと&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RuntimeError:  matplotlib.use() must be called *before* pylab
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;と怒られる。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 11:19:02 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>SQLObjectとmatplotlibで血圧管理</title><link>http://blog.kzfmix.com/entry/1185866615</link><description>&lt;p&gt;前週末から風邪がひどくて、会社を休んで寝ている。今日は多少ボーっとするけど昨日よりはずっと楽なので蒲団の中でノートパソコンと戯れたり。で、この前の&lt;a href="http://blog.kzfmix.com/entry/1185455604"&gt;血圧管理のグラフ化&lt;/a&gt;をやってみた。はてなのグラフを二つ重ねるというのは僕も考えたんだけど、CUIから&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mybp -b 142,88
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とか&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mybp -b 142,88 -d 2007-07-31
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とタイプするだけのほうがなんとなく長続きしそうだし（今までの経験から）。とここまでエントリを書いたところで、はてなグラフでそんなのやってるの&lt;a href="http://subtech.g.hatena.ne.jp/miyagawa/20061016/1160994755"&gt;思い出した&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;むむーですよ。ま、pythonで書きたかった+綺麗なグラフが好きだった、、、ということで、書いたのは&lt;a href="http://wiki.kzfmix.com/kzwiki/lifehack"&gt;ココ&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;O/RマッパはSQLObjectで。クラスを定義したら、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class BloodPressure(SQLObject):
    sbp = IntCol()
    dbp = IntCol()
    date = DateCol(default=datetime.date.today(), unique = True)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;createTableメソッド呼ぶ&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;BloodPressure.createTable()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これで、実際にテーブルつくってくれるのでSQL文考えなくてよいし、テーブル作り直したいときにもdb消してもう一度createTableメソッド呼べばいいので心理的にも楽。&lt;/p&gt;

&lt;p&gt;matplotlibは&lt;a href="http://blog.kzfmix.com/entry/1185794268"&gt;昨日書いた&lt;/a&gt;のを。データが少ないと目盛りがおかしいけど、1週間も続ければきちんとなるでしょう。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/lf/mybp.png" alt="血圧" /&gt;&lt;/p&gt;

&lt;p&gt;それにしても僕の血圧やたら高いなぁ。困った困った。&lt;/p&gt;

&lt;p&gt;あとoptparseで固定引数の処理の仕方がよくわからなかったのだけど、&lt;a href="http://d.hatena.ne.jp/bonlife/20070704/1183565508"&gt;パスワード生成スクリプトをきっかけにoptparseを使ってみました&lt;/a&gt;を眺めたら解決した。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(options, args) = parser.parse_args()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここのargsに固定引数が入ってんのね。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 11:16:45 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>matplotlibを使う</title><link>http://blog.kzfmix.com/entry/1185794268</link><description>&lt;p&gt;pythonのグラフ描画ライブラリである&lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;で日付ごとにプロットするサンプル。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from pylab import *
from matplotlib.dates import MONDAY, WeekdayLocator
import datetime

start_date = datetime.date(2007, 5, 1)
end_date   = datetime.date.today()
delta = datetime.timedelta(days=1)

mondays   = WeekdayLocator(MONDAY)

dates = drange(start_date,end_date,delta)

s = rand(len(dates)) + 85
t = rand(len(dates)) + 80

fig = figure()
ax = fig.add_subplot(111)
ax.plot_date(dates, s, 'r--')
ax.plot_date(dates, t, 'bo-')

ax.xaxis.set_major_locator(mondays)
ax.autoscale_view()
ax.grid(True)
fig.autofmt_xdate()

title('My Blood Pressure')
xlabel('Date')
ylabel('Blood Pressure')

fig.savefig('datetest')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/datetest.png" alt="matplotlib" /&gt;&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 11:16:30 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>matplotlibのimportエラー</title><link>http://blog.kzfmix.com/entry/1197637565</link><description>&lt;p&gt;matplotlibを0.91.1にあげたら&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NameError: name 'gtk' is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とかでて動かなくなった。仕方ないのでsvnのrev4730を入れたら動いたけど、それでも&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  libpng: 1.2.22
 Tkinter: Tkinter: 50704, Tk: 8.4, Tcl: 8.4
wxPython: 2.8.4.0
         * WxAgg extension not required for wxPython &amp;gt;= 2.8
    Gtk+: no
         * pygtk present but import failed
      Qt: Qt: 3.3.8, PyQt: 3.17.3
     Qt4: no
   Cairo: 1.4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となっている。pygtkは入ってんのになー&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 11:15:50 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>pythonのdatetimeモジュール</title><link>http://blog.kzfmix.com/entry/1185631040</link><description>&lt;p&gt;&lt;a href="http://www.python.jp/doc/2.4/lib/module-datetime.html"&gt;6.10 datetime -- 基本的な日付型および時間型&lt;/a&gt;みながら。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import datetime
&amp;gt;&amp;gt;&amp;gt; datetime.date.today()
datetime.date(2007, 7, 28)
&amp;gt;&amp;gt;&amp;gt; d = datetime.date.today()
&amp;gt;&amp;gt;&amp;gt; d.month
7
&amp;gt;&amp;gt;&amp;gt; d.day
28
&amp;gt;&amp;gt;&amp;gt; d.year
2007
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で、matplotlibにはグラフを描きやすいようにmatplotlib.datesというモジュールがあって何日おきとか何年おきとかそんな感じの目盛りが簡単にうてる。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 11:04:14 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>macbookにscipy,ipython,matplotlibなどをインストール</title><link>http://blog.kzfmix.com/entry/1216423997</link><description>&lt;p&gt;portで。gccのコンパイルに結構時間がかかった(3時間くらい?)。途中で放って寝たので知らんけど。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install py-f2py
sudo port install py25-numpy
sudo port install py25-scipy
sudo port install py25-matplotlib +tkinter
sudo port install py25-ipython
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;あと、scipy,matplotlibのインストールが途中でこけるのだけど、再度同じコマンドを打てばいいらしい。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:51:04 +0919</pubDate><category>Python</category><category>matplotlib</category></item><item><title>matplotlibでレーダーチャート</title><link>http://blog.kzfmix.com/entry/1216719888</link><description>&lt;p&gt;元ネタは&lt;a href="http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg07087.html"&gt;Radar / Spider Chars&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;五角形にしたかったのでrule of fiveにPolar Surface Areaを加えておいた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
from matplotlib.projections.polar import PolarAxes
from matplotlib.projections import register_projection
from pylab import *

class RadarAxes(PolarAxes):
    """Class for creating a radar chart (a.k.a. a spider or star chart)        
    http://en.wikipedia.org/wiki/Radar_chart
    """
    name = 'radar'
    # use 1 line segment to connect specified points
    RESOLUTION = 1

    def draw_frame(self, x0, y0, r):
        verts = [(r*cos(t) + x0, r*sin(t) + y0) for t in theta]
        return Polygon(verts, closed=True)

    def set_varlabels(self, labels):
        self.set_thetagrids(theta * 180/pi, labels)

    def get_axes_patch(self):
        x0, y0 = (0.5, 0.5)
        r = 0.5
        return self.draw_frame(x0, y0, r)

if __name__ == '__main__':

    register_projection(RadarAxes)
    N = 5

    theta = 2*pi * linspace(0, 1, N+1)[:-1]
    theta += pi/2
    labels = ['HBA', 'HBD', 'cLogP', 'MWT', 'PSA']
    rule_of_five = [10, 5, 5, 500, 140]
    desc = [12, 3, 3.6, 532, 160]
    desc_rate = [100*desc[i]/float(v) for (i,v) in enumerate(rule_of_five)]

    ax = subplot(111, projection='radar')

    ax.fill(theta, [100]*N)
    ax.fill(theta, desc_rate)

    for patch in ax.patches:
        patch.set_alpha(0.5)

    ax.set_varlabels(labels)
    rgrids((20, 40, 60, 80, 100))

    grid(True)
    show()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/ro5_radar.png" alt="rule of five" /&gt;&lt;/p&gt;

&lt;p&gt;rule of fiveのように&lt;strong&gt;ある範囲内に収まっていること(超えるとリスク)&lt;/strong&gt;というような指標を表すのにレーダーチャートは適しているんだろうか。つまり充足している事を示すような面積の表現はいいのかなぁ。あと、レンジが負になったりするのでそれもどうかと思う。&lt;/p&gt;

&lt;p&gt;再考の余地はあるな。&lt;/p&gt;

&lt;p&gt;TODO:多変量がある決まったレンジ内に収まっているかどうかを視覚的に捉えやすい表現手段を探す。&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:50:43 +0919</pubDate><category>chemoinformatics</category><category>Python</category><category>matplotlib</category></item><item><title>matplotlibで格子のパターンをつくる</title><link>http://blog.kzfmix.com/entry/1224982692</link><description>&lt;p&gt;ちょっと描きたいものがあったので調べたらpcolormeshを使えばいいだけだった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from numpy import *
from pylab import *
a = rand(100,100)
pcolormesh(a)
colorbar()
savefig('colour.png')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src="http://www.kzfmix.com/images/blog/colour081026.png" alt="matplotlib" /&gt;&lt;/p&gt;
</description><pubDate>Tue, 12 Jan 2010 10:37:24 +0919</pubDate><category>Python</category><category>matplotlib</category></item></channel></rss>