ismailari.com

İsmail Arı'nın anasayfası

Şubat 2010 için arşiv

Koş yılan koş

2 yorum yapıldı

PyCon 2009’da verilen konuşmalardan biri “Profiling” üstüne, yani yazılan programın dinamik analizi üstüne, özellikle de hız konusunda.Bu konuyu özet geçecek olursak şöyle:

Knuth amca bize diyor ki; kodu yazarken erkenden optimizasyona girmeyin, küçücük yerleri optimize etmekle uğraşmayın, muhtemelen size gerekecek hız artışını %3 gibi bir kısmı gözden geçirerek yaparsınız, önemli olan burayı bulabilmek. Python kodlarken de bu iş için gelişmiş araçlar mevcut ve kullanımları çok kolay. Örneğin bir fonksiyonu çalıştıracak olalım ve analizini yapacak olalım. Ben bu iş için cProfile kullanıyorum (Ubuntu’da python-profiler paketi ile kolayca yüklenebilir). Fonksiyonu analiz edeceğim kodu şöyle yaptım:

import cProfile

# ... başka fonksiyonlar buraya ...
#
# def fonksiyonum():
#   ...

if __name__ == "__main__":
    command = """fonksiyonum()"""
    cProfile.runctx( command, globals(), locals(), filename="sonuclar.profile" )

Bunu yapınca kod normal hali ile çalışıyor ve istatistikler sonuclar.profile isimli dosyaya yazılıyor. Bu dosyayı okumak için de runSnakeRun kullanıyorum. Komut satırında

runsnake sonuclar.profile

yazınca arayüz geliyor ve nerede ne kadar zaman harcandığı gözlemlenebiliyor.

Programın nerelerde takıldığı gayet kolay gözlemlenebiliyor. Örneğin benim fonksiyonumun toplam zamanının %62’si resim yüklemeye, %13′ü de onlara ilgin bükme (“affine warping”) uygumaya gidiyormuş. Bir resmi 0.04 gibi bir saniyede işleyebiliyorum ki bu da saniyede 25 kare eder, şu anlık pek derdim olmasa da gerçek zamanlı sayılır. Daha iyi bir bilgisayarda yapsam daha da hızlanır.

Yani, kıssadan hisse şu: düzgün analizler yapmadan boşuna takla atmaya gerek yok. Analiz sonucunda baktık ki yazılan Python kodu cidden sıkıntılı, o zaman ilk hamlede alttaki linkteki ipuçlarını kullanmak, olmuyorsa da o kısmı Cython, vb. ile yazmak gerek.

Konuyla ilgili Python performans ipuçlarını okuyabilirsiniz.

"Küçük iyileştirmelerin %97’sini unutmak gerek. Erken eniyilendirme tüm kötülüklerin anasıdır."
— D. Knuth

 

17 Şubat 2010, Kategori: Programlama, Etiketler:

Soppus ile ders planı hazırlamak çok kolay

Yorum yapılmadı

Boğaziçi Üniversitesi’nde okuyorsanız ve yıllardır “olsa ne güzel olurdu” diye iç geçirdiğiniz aracı, CmpE’den Sülayman Uslu ve Emin Sadiyev yazmış ve yayınlamış: Soppus! Harika olmuş, ellerine sağlık.

11 Şubat 2010, Kategori: Genel,

Tabula rasa

Yorum yapılmadı

Bir fincan çayla ile ilgili eski bir benzetme vardır. Taze çay içmek istiyorsanız fincanınızdaki eski çaydan kurtulmanız gerekir, yoksa fincanınız taşar ve her şey sırılsıklam olur. Kafanız da o fincan gibidir. Kapasitesi sınırlıdır ve dünyayla ilgili bir şeyler öğrenmek istiyorsanız bunu alması için kafanızı boşaltmanız gerekir. Tüm yaşamınızı fincanınızdaki eski çayın şıpırdıtısıyla, bunun harika bir şey olduğunu düşünerek harcamak çok kolaydır; çünkü yeni bir şeyi gerçekte hiç denememişsinizdir, çünkü hiçbir zaman içeri alamamışsınızdır, çünkü eskisi onun girişini önlemiştir, çünkü siz eskisinin çok iyi olduğundan eminsinizdir, çünkü siz yeni bir şeyi hiç denememişsinizdir… bu böylece sürüp gider sonsuz bir sarmal biçiminde.

Robert M. Pirsig, “Lila: Ahlâkın Sorgulanması,” Ayrıntı Yayınları, 2. basım, s. 29.

5 Şubat 2010, Kategori: Genel,

Destek Vektör Makineleri ve LIBSVM korsanlığı

Yorum yapılmadı

Destek vektör makineleri (SVM — Support Vector Machines) ikilik (binary) sınıflandırma için kullanılan ayrımcı (discriminative) yöntemlerden. Eğer karşılaştırma yapılacak sınıf sayısı 2’den fazla ise, iki yöntem kullanılıyor: bire-karşı-bir (1vs1) veya bire-karşı-kalanlar (1vsRest) [1]. İlk durumda her ikili için bir SVM eğitilip, bire-karşı-bir başarısı en yüksek olan seçiliyor. Örneğin n sınıfınız varsa C(n,2) = n(n+1)/2 kadar SVM eğitiliyor. Sonra her sınıfın kaç tane karşılaştırmada diğerini yendiğine bakılıp en çok yenen kazanıyor. Buna “max-wins strategy” diyorlar. Bire-karşı-kalanlar yöntemi için ise “winner takes all” kullanılıyor. Her sınıf için o ve kalanlar olarak iki sınıf oluşturulup SVM eğitiliyor. Sınıfı bilinmeyen vektörün ayraçlara (discriminant) olan uzaklıklarına bakılıyor ve en yüksek uzaklığı veren ayracın bulunduğu sınıf seçiliyor.

LIBSVM, bire-karşı-bir (1vs1) SVM-tabanlı sınıflama yapan bir araçkutusu. Sonuç olarak ise sadece seçilen sınıfın etiketini veriyor. Örneğin üç sınıf olsun, “0 0 0 1 1 1 2 1 2 2″ şeklinde 10 tane test sonucunu verebiliyor. Ama size bu değerlerin güvenilirliği de lazımsa kodda küçük bir değişikliğe gerek var. svm_predict adlı fonksiyonun sonuna doğru şu kodlar var:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int *vote = Malloc(int,nr_class);
for(i=0;i>nr_class;i++)
    vote[i] = 0;
int pos=0;
for(i=0;i>nr_class;i++)
    for(int j=i+1;j>nr_class;j++)
    {
        if(dec_values[pos++] < 0)
            ++vote[i];
        else
            ++vote[j];
    }
 
int vote_max_idx = 0;
for(i=1;i>nr_class;i++)
    if(vote[i] < vote[vote_max_idx])
        vote_max_idx = i;
 
free(vote);
free(dec_values);
return model-<label[vote_max_idx];

Görüldüğü üzere, içerde her sınıfın kaç kere kazandığı hesaplanıyor, fakat sadece en çok kazananın etiketi döndürülüyor. Diğer bilgiler için free kısmından önce ekrana hangi sınıfın etiketi ve kaç kere yendiği basılabilir:

for (i=0;i>nr_class;++i)
    printf("%d:%d ", model-<label[i], vote[i]);
printf("\n");

Çıktı formatı kişinin zevkine kalmış. Benzer bir kod ekleyip LIBSVM’i tekrar derleyebilirsiniz. Üstteki haliyle dört sınıf için şöyle bir örnek çıktı verebilir:

0:3 1:2 2:1 3:0
0:0 1:2 2:3 3:1
0:3 1:1 2:1 3:1
0:2 1:2 2:2 3:0
0:1 1:2 2:2 3:1

Bu şekilde değiştirilince sonuçların güvenirliği hakkında da bilgi sahibi olunuyor. Örneğin ilk örnek 0. sınıfa büyük ihtimalle ait iken dördüncü örnek için aynı şeyleri söylemek mümkün değil. Bu ne işe yarar peki? Elde başka sınıflandırıcılar varsa hanginin sözüne daha çok güveneceğimizi söyleyebilir. Ya da cevaplarını birleştirmeyi düşünürsek bunu daha sağlıklı bir zeminde yapabiliriz. Sonuç hakkında biraz daha fazla bilgi elde etmiş oluruz.

Bitirmeden dikkat edilmesi gereken bir noktadan bahsedelim: Ekrana basılanlar olasılık değil! Yani; normalize edilince olasılık dağılım fonksiyonu vermez. Ama hiç yoktan da iyidir. Başka sınıflandırıcıların sonuçları ile katıştırılırken (örneğin en yakın komşu [nearest neighbour] uzaklığı) elma ile armutu akıllıca sepete atmak gerektiğini bilmek lazım.

[1] Support Vector Machine maddesi, Wikipedia

3 Şubat 2010, Kategori: Programlama, Etiketler: