twitterでフォローされているか調べるスクリプト

ダイレクトメッセージを送れるかどうかで判断するみたいなつぶやきが流れてたので。

setでごにょれば良かろうと。

import twitter
api = twitter.Api(username='user',password='pass')
friends = set([u.name for u in api.GetFriends()])
followers = set([u.name for u in api.GetFollowers()])

print "follow and followed: "     + ",".join(list(friends.intersection(followers)))
print "not follow but followed: " + ",".join(list(followers.difference(friends)))
print "follow but not followed: " + ",".join(list(friends.difference(followers)))

ProductName みんなのPython 改訂版
柴田 淳
ソフトバンククリエイティブ / ¥ 2,940 ()
在庫あり。

SimpleSite Tutorial Part 3 (Pylons)

もう、自分でなんか作ったときにちゃんと読めばいいやって気分になってしまったので流し読み。

ProductName The Definitive Guide to Pylons
James Gardner
Apress / ¥ 4,522 ()
在庫あり。

Chapter 19

  • AuthKitの使い方
  • Permission毎にテンプレートを変える
  • Errorドキュメントをいじる
  • YUI Rich Text Editorを使う
  • Eggのビルド

ここまで読めばあとはなんかつくるだけ。というか作りたい物は決まっていて、文献管理システムをPylonsで書き直すのだ

横着おはありスクリプト

おは(ようを)あり(がとう)ではなくて おは(が)あり(ました)

つまり

isOha? :: Str -> Bool

なスクリプト。

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

import twitter
api = twitter.Api(username='user',password='pass')
oha = [r.user.screen_name for r in api.GetReplies() \
if r.text.encode('utf-8').find('おは') > -1]
thx = "@" + " @".join(oha) + "おはありです"
status = api.PostUpdate(thx.decode('utf-8'))

pypiにあるtwitterじゃなくてpython-twitterを使いたかったので、既にインストールされてたtwitterモジュールpythonモジュールのアンインストール - kokiyaの日記を参考に消した。

SimpleSite Tutorial Part 2 (Pylons)

Chapter14のチュートリアルをやった。簡単なblogみたいなものを作っていく(コメントシステム、タグ、認証系まで)三部作なんだけど、一つの章が分量があるので疲れる。

ProductName The Definitive Guide to Pylons
James Gardner
Apress / ¥ 4,522 ()
在庫あり。

  • SQLAlchemyで一対多、多対多の書き方
  • formencodeでカスタムバリデーションのつくりかた
  • あと最後におまけ程度にcssいじり

リスト内包表記で素数チェック

プログラミングHaskell読みはじめた。この本はHaskellプログラミングの入門書というよりは、Haskellプログラミングとはどういう考え方で書いていくかの入門書的な感じがする。いきなりこれ読んでもhaskellでコード書けないんじゃないだろうか。

4章のリスト内包表記の章で、ある数の因数を求める関数を定義して、それを用いて素数判定をしていたのでpythonでもやってみた。

def factors(n):
  return [x for x in range(1,n+1) if n % x == 0]

def is_prime(n):
  return True if len(factors(n)) == 2 else False

あとHaskellだと

[x|x <- xs | xs <- a]

でconcatenateできて便利なんでこれもpythonで、とか思ったんだけど

リストの要素が常にひとつのときのみ

a = [[1], [2], [3]]
[x for [x] in a] # [1, 2, 3]

ってやればできるんだけど、二つ以上の要素になった場合が分からんかった。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / 2940円 ( 2009-11-11 )


この本ほとんど疑似コード(?)なので考えるにはよいですな。お薦め。

The Definitive Guide to Pylons

届いてた

ProductName The Definitive Guide to Pylons
James Gardner
Apress / 4049円 ( 2008-12-22 )


そのうち読む

RBFネットワーク

Machine Learning 4章

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,459 ()
通常1~3週間以内に発送

  • k-meansで初期値決め
  • train
    • パーセプトロンの学習アルゴリズムと大体一緒

scipyにはB-splinesが用意されているのでそれを使ってみる

from pylab import *
from numpy import *
from scipy.signal import cspline1d, cspline1d_eval
x = arange(-3,10,0.05)
y = 2.5 * exp(-(x)**2/9) + 3.2 * exp(-(x-0.5)**2/4) + random.normal(0.0, 1.0, len(x))
spline = cspline1d(y,100)
xbar = arange(-5,15,0.1)
ybar = cspline1d_eval(spline, xbar, dx=x[1]-x[0], x0=x[0])
plot(x,y,'.')
plot(xbar,ybar)

b-splines

Pythonで多層パーセプトロン

Machine Learning 3章

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,459 ()
通常1~3週間以内に発送

要するにbackwars phaseを実装すればいいんでしょ?的な。実際書いてみると逆に誤差を伝播している感がある。

# Code from Chapter 3 of Machine Learning: An Algorithmic Perspective
# by Stephen Marsland (http://seat.massey.ac.nz/personal/s.r.marsland/MLBook.html)

# You are free to use, change, or redistribute the code in any way you wish for
# non-commercial purposes, but please maintain the name of the original author.
# This code comes with no warranty of any kind.

# Stephen Marsland, 2008
# modifiled by kzfm 2009

from numpy import *

inputs = array([[0,0],[0,1],[1,0],[1,1]])
targets = array([[0],[1],[1],[0]])

ndata,nin   = shape(inputs)
nout        = shape(targets)[1]
nhidden     = 2
beta        = 1
momentum    = 0.9
eta         = 0.25
niterations = 10001

weights1 = (random.rand(nin+1,nhidden)-0.5) * 2/sqrt(nin)
weights2 = (random.rand(nhidden+1,nout)-0.5) * 2/sqrt(nhidden)

# train
inputs = concatenate((inputs,-ones((ndata,1))),axis=1)
change = range(ndata)

updatew1 = zeros((shape(weights1)))
updatew2 = zeros((shape(weights2)))

for n in range(niterations):

    hidden = concatenate((1.0/(1.0+exp(-beta * dot(inputs,weights1))), -ones((shape(inputs)[0],1))),axis=1)
    outputs = 1.0 / (1.0+exp(-beta * dot(hidden,weights2)))
    error = 0.5 * sum((targets-outputs)**2)

    if (mod(n,1000)==0): print "Iteration: ",n, " Error: ",error    

    deltao = (targets-outputs) * outputs * (1.0-outputs)            
    deltah = hidden * (1.0-hidden) * (dot(deltao,transpose(weights2)))

    updatew1 = eta*(dot(transpose(inputs),deltah[:,:-1])) + momentum*updatew1
    updatew2 = eta*(dot(transpose(hidden),deltao)) + momentum*updatew2

    weights1 += updatew1
    weights2 += updatew2

    random.shuffle(change)
    inputs = inputs[change,:]
    targets = targets[change,:]

ちなみに、創薬系でのニューラルネットは論文とかは多いけど、実務ではあんまり使われないと思う(特にケミストよりになればなるほど)。というのは、実務においてはゴールするためにはこういうロジックで合成すればよろしいみたいな指針を提示しないといけないが、ニューラルネットでつくったモデルだとそういう解釈がしづらい。

なんか物がたくさんあって、フィルタリングしたいという要求には答えられるけど、何をどういう指針に従って創るかみたいな、創造(製造)律速な問題には使いにくい。

じゃぁ神経系は創造的ではないのかというと、それはまた違うんじゃないかなぁと思ったりもする。モデル化があれなのかなぁとも思うのだけど、、、、

Pythonでパーセプトロン

Machine Learningを読んでいる

ProductName Machine Learning: An Algorithmic Perspective (Chapman & Hall/Crc Machine Learning & Patrtern Recognition)
Stephen Marsland
Chapman & Hall / ¥ 6,459 ()
通常1~3週間以内に発送

numpyでパーセプトロンでORを訓練してみた(なにげにパーセプトロンとかニューラルネットワークの実装は初めてだったりする)。

from numpy import *
inputs = array([[0,0],[0,1],[1,0],[1,1]])
targets = array([[0],[1],[1],[1]])

nIterations = 6
eta = 0.25
nData = shape(inputs)[0]
nIn = shape(inputs)[1]
nOut  = shape(targets)[1]
weights = random.rand(nIn+1,nOut)

inputs = concatenate((inputs,-ones((nData,1))),axis=1)

for i in range(nIterations):
    outputs = where(dot(inputs,weights)>0,1,0)
    weights += eta*dot(transpose(inputs),targets-outputs)
    print "Iter: %d" % i
    print weights

print "Final outputs are:"
print where(dot(inputs,weights)>0,1,0) 

この本は、アルゴリズムに関して説明するのがメインの本らしいので、コードの解説はあんまなくて、詳しくはサンプルコード読めということらしいが、もう少し読んでみないとわからん。

夕焼けグリッチ

5x5のタイル状にしてみた。

1256111943

好みの夕暮れの色があるように、好みのノイズ量があるに違いないので、もう少しノイズの入れ方を考えないと。

import base64,re,Image
from random import randint

def glitch(infile,outfile):
    jpg_text = base64.encodestring(open(infile,"rb").read())
    glitched_text = ""
    count = 0
    width,height = Image.open(infile).size
    num = width * height / 10000
    for c in jpg_text:
        if c == '0':
            if randint(0,num) == 0:
                count += 1
                glitched_text += str(randint(0,9))
            else:
                glitched_text += c
        else:
            glitched_text += c
    glitched_jpg = base64.decodestring(glitched_text)
    open(outfile,"wb").write(glitched_jpg)
    return count
if __name__ == '__main__':
    for i in range(25):
        outfile = "test_%d.jpg" % i
        count = glitch("/Users/kzfm/yuki3.jpg",outfile)
        #print "%d: %d" % (i,count)

    tiled_im = Image.new('RGB',(1600,1200))
    tiled_px = tiled_im.load()
    for i in range(5):
        for j in range(5):
            n = 5*i+j;
            imgfile = "/Users/kzfm/python/test_%d.jpg" % n
            im = Image.open(imgfile)
            px = im.load()
            for x in range(320):
                for y in range(240):
                    nx = 320 * j + x
                    ny = 240 * i + y
                    tiled_px[nx,ny] = px[x,y]
    tiled_im.show()