Saturday, October 30, 2010

Dizin Karsilastirmak, Uyan Elementleri Bulmak

R dilindeki match() cagrisinin karsiligi Numpy'da nedir? Mesela:
a = c(1,2,5,4,3)
b = c(2,3)
print (match(b,a))
Bu cagrida a icinde b elementlerine uyan ogelerin 'indis' degerleri geri getirilir. Sonuc:
[1] 2 5
Python ile sunlari yapabiliriz:
import numpy as np

a = np.array([1,2,5,4,3])
b = np.array([2,3])
match = np.in1d(a, b)
Eger in1d cagrisinin 'match' sonucunu ekrana basarsak,
[False  True False False  True]
Bu dizinde 'a' icinde 'b' ile uyumun oldugu yerler 'True' digerleri 'False' ile isaretli. Simdi indis degerlerini istiyorsak, ufak bir numara ile bunu hallederiz. np.arange(0,len(a)) ile bir 'indis dizini' yaratiriz, 0,1,...,N diye gider (N = len(a)), onun uzerinde in1d()'den gelen sonucu 'filtre' olarak kullanirsak, gerekli indis degerlerini elde ederiz.
print np.arange(0,len(a))[match]
Sonuc
[1 4]
Not: Python indis baslangici olarak 0 aliyor (C gibi), R 1 aliyor, 1,4 ile 2,5 arasindaki bir fark ondan.

Friday, October 29, 2010

PyMC Yerine JAGS ve rpy

Not: MCMC icin en iyi secenek su anda A. Gelman'in Stan ve PyStan paketleri.

Python ile MCMC kodlamasi icin PyMC paketini gozden gecirdik, ne yazik ki performanstan memnun kalmadik, diger yandan WinBUGS'in arayuzu son derece kullanissiz (Windows / Wine gerektiriyor), bu sebeple surekli kullanim icin tek alternatif kaldi: Python icinden rpy2 kullanarak JAGS cagirmak.

JAGS kurulusunu isledik, bu program WinBUGS'in tamamen yerine gecmeye talip bir paket.

Tamamen Unix seviyesinde, komut satirindan calisir, iletisime gecilmesi (interfacing) temiz.

rpy2 kullanimi icin su yazimizdaki ornek koda bakilabilir, JAGS kullanimi icin su yazidaki kod faydali. JAGS WinBUGS ile ayni dosya formatini kullanmakta, yeni bir dil ogrenmeye gerek yok. Andrew Gelman'in tum ornekleri zaten bugs dilini kullaniyor, bu acidan da farklilik olmayacak. Tum rpy2, JAGS, Python orneklerinin bir arada oldugu en iyi kod parcasi surada bulunabilir.

Monday, October 11, 2010

Iki Listeyi Her Turlu Eslesmeye Gore Gezmek

Iki listeyi, bu listedeki elemanlarin her turlu eslesmesinin olusturdugu ikilileri gorerek gezmek istiyorsak itertools paketi iyi isler. Mesela a ve b listelerini soyle gezebiliriz:
import itertools

a = ['foo', 'bar', 'baz']
b = ['x', 'y', 'z', 'w']

for (r,s) in itertools.product(a, b):
print r,s
Ustteki kod su sonucu verecek:

foo x
foo y
foo z
foo w
...
baz y
baz z
baz w

Yani iki listenin her turlu kombinasyonu tek bir satirla gezilebilmis oluyor.

Saturday, October 9, 2010

Objeleri Yazip Okumak - Pickle

Python pickle servisi herhangi bir nesneyi alip dosyaya yazabilmek yetenegine sahip. Bir dictionary objemiz oldugunu dusunelim:

dict = {}
dict['a'] = 33
dict['b'] = 55

Bu nesneyi soyle dosyaya yazariz

import pickle
output = open('dict.pkl', 'wb')
pickle.dump(dict, output)

Geri okumak icin

f = open("dict.pkl")
dict= pickle.load(f)
f.close()

Friday, October 8, 2010

JAGS

Not: MCMC icin en iyi secenek Gelman'in Stan paketi.

R dilinde MCMC hesaplari yapmak icin WinBUGS'a alternatif bir paket JAGS. Once jags, sonra rjags, sonra R2jags paketlerinin kurulmasi tavsiye edilir. jags kaynaklardan kurulur, suradan.

http://www-fis.iarc.fr/~martyn/software/jags/

Bilinen ./configure, sudo make install. Geri kalan paketleri kurmak icin R komut satirindan

install.packages("rjags")
install.packages(R2jags")

Ubuntu uzerinde su hatayi gorurseniz,

libjags.so.2: cannot open shared object file: No such file or directory

O zaman sudo ldconfig ile so kutuphanelerini guncellemek yeterli.

JAGS nasil kullanilir? R icinden ornek bir kullanim Andrew Gelman'in kitabindaki radon ornegidir. Bugs icin yazilmistir ama JAGS'e gecirmek icin bugs() cagrisini jags() yapmak yeterli. Bu sebeple BUGS'dan JAGS'e gecis cok rahat. R kodu basinda
library(R2jags)
..
radon.1 <- jags (radon.data, radon.inits, radon.parameters,
"radon.1.bug", n.chains=3, n.iter=10)
Radon Ornegi

Wednesday, October 6, 2010

Deprem Verisi ve Python (Earthquake Data)

USGS sitesinden aldigimiz centennial (yuz yillik) deprem verisini biraz temizledik, onemli kolonlari sectik ve Python Numpy loadtxt ile yuklenebilecek hale getirdik. Bu veriyi ve onu okuyan ornek Python script'i ekteki zip dosyasinda bulabilirsiniz. Ornek olarak iki veri noktasini ekrana basiyoruz: 1999 Izmit ve 1906 San Fransisco depremleri. Ornek komutlar soyle:
print q[(q[:,0] == 1999) & (q[:,1] == 8) & (q[:,2] == 17)]

print q[(q[:,0] == 1906) & (q[:,1] == 4) & (q[:,2] == 18)]
English: You can find a scrubbed version of the centennial earthquake data (from USGS site) shared below. We also included a sample Python script that shows how to filter based on date. As an example we display two events, one on 1999 Turkey, the other 1906 San Fransisco.

Dosyalar

Saturday, October 2, 2010

Lme4 C Koduna Girmek

Lme4 (ya da herhangi bir R kutuphanesinin) C kodunu degistirip, bu yeni kodlari R'den islettirmek istersek, sunlari yapabiliriz:

C kodunu degistirecegimiz R kutuphanesini herhalde install.packages ile kurmusuzdur, ona tekabul eden kaynak kodlari buluruz. Versiyon no'suna bakalim; home yani ~ altinda R dizini altindaki pakete gidelim. Bizim icin bu ~/R/i486-pc-linux-gnu-library/2.11/lme4. Bu dizin altinda DESCRIPTION dosyasinda hangi versiyon oldugu yaziyordur.

Bu versiyona ait kaynak kodu Internet'ten bulup indiririz. Bu kaynakta istedigimiz degisikligi yapariz. Derlemek icin make.sh icinde sunlari yazdik:

#!/bin/sh
gcc -std=gnu99 -fPIC -g -O2 -c lmer.c -o lmer.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -fPIC -g -O2 -c init.c -o init.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -fPIC -g -O2 -c local_stubs.c -o local_stubs.o -I/home/burak/R/i486-pc-linux-gnu-library/2.11/Matrix/include/ -I./src -I/usr/share/R/include/
gcc -std=gnu99 -shared -o lme4.so init.o lmer.o local_stubs.o -llapack -lblas -lgfortran -lm -L/usr/lib/R/lib -lR

Kutuphane lme4.so yaratilinca bu dosyayi R altindaki so uzerine kopyalarsak, eski kod yerine bizimki islemeye baslar.

cp lme4.so ~/R/i486-pc-linux-gnu-library/2.11/lme4/libs/

Biz R kodlarini "R -f test.R" seklinde isletiyoruz, yani her cagrida yeni bir process baslatiliyor, degisen so kutuphanesi hemen bir sonraki cagrida isleme konacaktir.