Thursday, December 23, 2010

Fourier Serileri, Transformu ve DFT

Friday, December 17, 2010

Scan Etmek icin Script

Otomatik olarak numaralandirarak sayfalari scan etmek icin basit bir script. 01'den baslayarak birer birer artirarak scan edip imaj dosyalarini yaratir, her scan sonrasi durur ve [enter] dugmesine basilmasini bekler, kullanici o sirada sayfa degistirebilir. Scanner parametreleri icin scanimage -L, mesela plustek:libusb:005:002 gibi bir sonuc.
import os, re, sys

def run_command(command):
result = []
f = os.popen(command, "r")
sys.stdout.flush()
for l in f.xreadlines():
result.append(l)
return result

def two_digitize(i):
if i < 10: return "0" + str(i)
return str(i)

i = int(sys.argv[1])
while True:
print two_digitize(i)
run_command("scanimage --resolution 200 -x 200 -y 100 -d [SCANNER PARAMETRELERI] \
--format=tiff > " + two_digitize(i) + ".tiff")
i += 1
r = raw_input(">")

Wednesday, December 15, 2010

Bilinen Varyasyonlar ve EM Algoritmasi

Onceki bir yazida 2 boyutlu birkac Gaussian karisimini gosterdik. Bu yazida biri 100 digeri 20 tane olmak uzere iki Gaussian'dan uretilen noktalari nasil modellenebilecegini gosterecegiz. Bu analiz icin genellikle kullanilan yontem EM yani Expectation Maximization algoritmasidir. Uretilen veri icinde "asiri" degerlerin oldugu ama geri kalani normal dagilima sahip bir veriyi modelleyecegiz. Asiri degerler nereden gelebilir? Olcum aletinde bir hata olabilir, arada sirada, yanlislikla asiri degerler kaydedilebilir. EM'e bu asiri degerlerin belli bir alanda odaklanacagini ongorerek o noktalar icin ufak bir kovaryans matrisini verebiliriz, ve o noktalari bir Gaussian altina atarak filtrelenmesini saglayabiliriz.

Not: EM birden fazla Gaussian karisim oranlarini, hem ortalama degerlerini (mu) hem de kovaryans degerlerini veriden hesaplayabilir. Bu ornekte bir kovaryansin bilindigini farz ediyoruz.

Bu algoritmanin neler yaptigina dikkat edelim: Birisi bize bir veri obegi veriyor, biz de diyoruz ki "herhalde bu veri icinde bazi ekstrem noktalar var". Buna gore bir kovaryans ayarliyoruz ve EM'i isletiyoruz, EM pat diye iki Gaussian icin orta noktayi bulup bize veriyor. Kovaryans ta bilmiyor olabilirdik, yine EM isletiyoruz ve bize iki tane Gaussian'i veriden cekip cikartiyor.

Bu onemli bir algoritma. Iteratif olarak isler, detaylar icin literature bakilabilir. Bitis ani log olurluk (likelihood) degerinin artik degismedigi andir.
import numpy as np
from matplotlib import pyplot as plt
import scipy.stats

def gen_data(dim):
sigma_1 = np.eye(dim)*20.0
sigma_2 = np.eye(dim)*2.0

x1 = np.random.multivariate_normal([40.,10.], sigma_1, size=100)
x2 = np.random.multivariate_normal([10.,30.], sigma_2, size=20)
x = np.append(x1, x2, axis=0)

lam_0_1 = np.eye(dim)
lam_0_2 = np.eye(dim)

mu_0_1 = np.array([[1, 1]]).T
mu_0_2 = np.array([[1, 1]]).T
return x.T

def norm_pdf(b,mean,cov):
k = b.shape[0]
part1 = np.exp(-0.5*k*np.log(2*np.pi))
part2 = np.power(np.linalg.det(cov),-0.5)
dev = b-mean
part3 = np.exp(-0.5*np.dot(np.dot(dev.transpose(),np.linalg.inv(cov)),dev))
dmvnorm = part1*part2*part3
return dmvnorm

def EM_known_variance(X, mu, sigma, pi, K, dim, size):
likelihood = -np.Inf
while True:
# E step
for i in range(size):
for k in range(K):
nom = pi[k]*norm_pdf(X[:,i], mu[:,k], sigma[:,:,k])
denom = 0
for j in range(K):
denom += pi[k]*norm_pdf(X[:,i], mu[:,j], sigma[:,:,j])
gamma[k,i] = nom / denom


# M step
N = np.zeros((dim, 1))
for k in range(K):
sum = 0
for i in range(size):
sum += gamma[k, i]
N[k,:] = sum

# new mu
for k in range(K):
sum = 0
for i in range(size):
sum += gamma[k, i]*X[:,i]
mu[:, k] = (1/N[k,:])*sum

# new pi
for k in range(K):
pi[k] = N[k,:] / size

# no estimation of new sigma, we left that one out
# for this example

new_likelihood = 0
for i in range(size):
sum = 0
for k in range(K):
sum += pi[k] * norm_pdf(X[:,i], mu[:,k], sigma[:,:,k])
new_likelihood += np.log(sum)

#print new_likelihood
#print mu[:,0]
#print mu[:,1]

if (np.abs(new_likelihood - likelihood)) < 1e-5: break
likelihood = new_likelihood

print "done"
return mu, pi


K = 2
dim = 2
size = 120
pi = np.ones(dim)*(1.0/K)
X = gen_data(dim)
#mu = np.random.rand(dim, K)*10.0
mu = np.ones((dim, K))*10.0
sigma = np.zeros((dim, dim, K))
gamma = np.zeros((K, size))
sigma[:,:,0] = np.eye(dim)*20.0
sigma[:,:,1] = np.eye(dim)*2.0

mu, pi = EM_known_variance(X, mu, sigma, pi, K, dim, size)
print "EM results"
print "mu", mu
print "pi", pi

Sunday, December 12, 2010

DJVU Numaralari

Kitaplardan scan edilmis imajlarin DJVU formati ile sıkıstırılabilecegini soylemistik. Ek bazi numaralar sunlar:

DJVU icinden bir sayfayi silmek icin (mesela birinci sayfayi silelim):

djvm -d dosya.djvu 1

Ayri bir PDF dosyasini DJVU dosyasinin basina eklemek icin:

Once PDF dosyasini pdf2djvu ile djvu haline getirmek lazim

pdf2djvu ek.pdf -o ek.djvu
djvm -i dosya.djvu ek.djvu 1

Sona eklemek icin

djvm -i dosya.djvu ek.djvu

Thursday, December 9, 2010

2 Boyutlu 2 Gaussian Karisimi, 3D

Iki boyutlu iki Gaussian karisimini alttaki kodlarla hesaplayip grafikliyoruz. Bazi notlar: scipy.stats.norm.pdf cagrisi tek bir skalar olasilik degeri dondurmesi gerekirken, bir matris geriye dondurdu. Bu matris belki ek islemden gecerek dogru sonu elde edilebilirdi, fakat pdf cagrisindan beklenen bu degildir. Bu sebeple pdf kodunu kendimiz yazdik.

Ayrica grafiklerken countour() cagrisi tek Gaussian ile calisti, fakat iki Gaussian problem cikardi. Bu sebeple duz plot() cagrisi kullandik.

Alttaki olasilik alanini hesaplatmak icin her x,y degerini her iki Gauss pdf'e geciyoruz, ve gelen sonuclari 0.5 ile (karistirma / agirlik carpanlari / mixing coefficients) carparak topluyoruz. Elde edilen sonucun kendisi de bir dagilimdir, yani karisimin entegrali alinirsa sonuc 1 gelmelidir.
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.stats

def norm_pdf(b,mean,cov):
k = b.shape[0]
part1 = np.exp(-0.5*k*np.log(2*np.pi))
part2 = np.power(np.linalg.det(cov),-0.5)
dev = b-mean
part3 = np.exp(-0.5*np.dot(np.dot(dev.transpose(),np.linalg.inv(cov)),dev))
dmvnorm = part1*part2*part3
return dmvnorm

fig = plt.figure()
ax = Axes3D(fig)

M = 100
a = np.linspace(0.,50.,num=M)
b = np.linspace(0.,50.,num=M)

arr = []
X = np.zeros((M, M))
for i in range(M):
for j in range(M):
x1 = norm_pdf(np.array([a[i],b[j]]), np.array([10,10]), np.eye(2)*10)
x2 = norm_pdf(np.array([a[i],b[j]]), np.array([40,40]), np.eye(2)*0.4)
X[i,j] = 0.5*x1 + 0.5*x2
arr.append([i, j, X[i,j]])

arr = np.array(arr)

ax.plot(arr[:,0], arr[:,1], arr[:,2], zs=0, zdir='z', label='zs=0, zdir=z')

plt.show()


3 Boyutlu Normal Dagilim, 3D

3 boyutlu bir normal dagilima (multivariate Gaussian) zar attirip grafiklemek icin su kodlar kullanilabilir. Iki tane 3d Gaussian plot ettik, farkli \mu degerleri var, ve kovaryanslarinda diagonal disinda degerler sifir, yani 3 degiskenin birbiri ile hic korelasyonu yok. Bu sebeple her dagilimin da grafikleri tam yuvarlak halde cikiyor.
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)

n1 = np.random.multivariate_normal([10,10,10], np.eye(3)*5, size=400)
print n1
n2 = np.random.multivariate_normal([30,30,30], np.eye(3)*0.4, size=40)
print n2

n = np.append(n1, n2, axis=0)

ax.plot(n[:,0], n[:,1], n[:,2], 'o', zs=0, zdir='z', label='zs=0, zdir=z')

plt.show()

Wednesday, December 1, 2010

Google Earth 6

Ubuntu uzerinde en son Google Earth versiyonunu isletmek icin apt-get install lsb-core islemini yapmak lazim. Bu yapildiktan sonra suradan bir bin dosyasi indirilir, uzerinde chmod u+x yapildiktan sonra isletilip kurulum yapilabilir.

Sınırlı Elementler Metodu (Finite Elements Method)


PDF