Blog Arşivleri

Yeni blog: PythonBilim

Yaz geldi, dersleri bitirdik. Dönem sonu sınavlarını okuyup son notları da verdikten sonra eğlenceli işlerime dönebileceğim. Öncelik elimdeki araştırma probleminde. Gerekli simülasyon programı hazır; önümüzdeki aylarda simülasyonu sistematik şekilde işleyip sonuçları yazılı hale getirmekle meşgul olacağım. Bitirebilirsem buradan duyururum.

Diğer bir planım için bu hafta ilk adımı attım. Python ile bilimsel programlama konularını işleyen PythonBilim isimli bir bloga başladım. İlk yazılar temel Python programlama ile ilgili olacak, daha sonra sayısal analiz ve hesaplamalı bilimle ilgili konulara gireceğim. Aslında, birbiri üzerine eklenen bir ders notu demeti hazırlamak istiyorum.

Malum, marifet iltifata tabidir. İlgilenenlerin hatalarımı ve eksiklerimi bildirmesinden, yorum yaparak veya konuk yazar olarak katkıda bulunmasından mutluluk duyarım.

PythonBilim projesi sebebiyle muhtemelen bu bloga eskisinden daha seyrek yazmak zorunda kalacağım.

Türkiye illerinin komşuluk çizgesi

Vilayetler arasındaki komşuluk bağlantılarını topladım geçen gün. İlleri bir nokta gibi düşünelim ve ortak bir sınırı olan iki ili arasına bir çizgi çizelim. Meselâ İstanbul’un iki komşusu var: Tekirdağ ve Kocaeli. Buna karşılık daha merkezi bir yerde olan Ankara’nın coğrafi komşusu daha çok: Konya, Kırşehir, Çankırı, Eskişehir, Bolu, Aksaray, Kırıkkale.

Bütün illerin komşularını bu şekilde listeleyince şöyle bir çizge (“graph”) elde ediyoruz.

İllerin komşuluk ağı

İllerin komşuluk ağı. Büyütmek için tıklayın.

Noktalar il merkezlerinin nispi konumuna göre yerleştirildi, o yüzden gerçek haritayı andıran bir biçimi var. Enlem ve boylam bilgilerini buradan aldım. Haliyle kıyı ve sınır şehirlerinin az, iç şehirlerin ise çok komşusu var. Deniz veya göl üzerinden komşulukları saymadım.

En çok komşusu olan iller dokuzar komşuyla Konya ve Erzurum. Bunların ardından gelen Bolu, Yozgat, Sivas, Erzincan ve Diyarbakır’ın sekizer komşusu var. Yalova ve Hakkâri’nin ikişer, Kilis’in ise sadece bir komşusu var.

İllerin ortalama komşu sayısı 4,86.

Bu çizge kendi başına çok önemli bilgiler vermez. Vilayet sınırları bir ölçüde tarihsel dinamiklerle belirleniyor olsa da, çoğunlukla keyfe keder şekilde, veya iktidarların oy toplama arzusuyla çizilmiş olduğundan, komşuluk analizi çok derin bir anlayış getirmeyecek. Ama eğlence için bu ağın özelliklerine bakabiliriz.

Buradaki analizleri ve görsellemeleri Python ve NetworkX modülü ile yaptım. Kaynak kodunu ve gerekli veri dosyalarını buradan indirebilirsiniz.

Öbeklenme katsayısı

Bir noktanın öbeklenme (clustering) katsayısı basitçe, o noktanın iki komşusunun ayrıca komşu olması (yani üçünün bir üçgen oluşturması) oranıdır. Bu sayı Yalova, Karaman, Hakkâri ve Iğdır için tam bir, Kilis içinse (tek komşusu olduğundan) sıfır. Diğerleri ara değerlerde. Konya ve Erzurum gibi geniş illerin çok komşusu var, ama bu komşuların çoğu birbirinin komşusu değil, o yüzden onların katsayıları sırayla 0,28 ve 0,25.

Ortalama öbeklenme katsayısı 0,48. Yani rastgele bir ilin rastgele seçilen iki komşusunun birbirlerine de komşu olmaları ihtimali yarıya yakın.

Çizgenin geçişliliği (transitivity), yine öbeklenmeyi sıfırla bir arasında ölçen başka bir katsayı. Çizgedeki toplam üçgen sayısının, toplam üçlü (iki kenarla birleştirilmiş üç nokta) sayısına oranının üç katı (çünkü bir üçgende üç üçlü var) olarak tanımlanıyor. İller çizgesinin geçişlilik katsayısı 0,395.

“Uzaklık” ölçüleri

Bu çizgedeki kenarlar yolları temsil etmiyor; sadece komşuluk ilişkisini gösteriyor. O yüzden ağdaki genel “uzaklık” kavramını coğrafi mesafeyle karıştırmamak lâzım. Bu kısımda “uzaklık” dediğimde, bir noktadan diğerine en az kaç adımda gidildiğini kastediyorum.

İller çizgesinde ortalama en kısa “uzaklık” 4,88.

Her bir il için, diğer illere olan en kısa “uzaklık”ların ortalamasını aldığımızda, sırayla Kırklareli (7,25), Edirne (7,12) ve Tekirdağ (6,92) en uzakta. Yanılmayın, bu Boğazlar’ın araya girmesinden değil (çizgede Boğaz yok, sadece komşuluk var), sınıra ve Marmara Denizi’ne dayandıkları için az komşuları olmasından.

Bu sayı Sivas (3,50), Kayseri (3,51), ve Yozgat (3,53) için en küçük.

Merkezilik

Bir noktanın çizgedeki “merkezî”liği değişik amaçlar için farklı farklı tanımlanabilir. Bunlardan biri uzaklık merkeziliği, yani bir noktanın diğer bütün noktalara “uzaklık”larının tersinin ortalaması. Buna göre sırayla Sivas, Kayseri ve Yozgat uzaklık bakımından en merkezi iller. (Çizgedeki uzaklığın coğrafi tanıma birebir uymadığını hatırlatayım — A ilinden B iline, C ili üzerinden iki adımlık komşuluk olabilir, ama bu yol kilometre olarak çok daha uzun olabilir.)

Bütün il çiftleri arasındaki en kısa “yol”lardan kaç tanesinin belli bir ilden geçtiği, o ilin aradalık merkezîliğini (betweenness centrality) verir. Bu sayı da 0 ile 1 arasındadır. Bu merkezîlik tanımında da Sivas (0,33) ve Yozgat (0,22) en üstte, ardından Erzincan (0,21) geliyor.

Bir noktanın öneminin, komşusu olduğu noktaların önemlerinin toplamına orantılı olduğunu varsayabiliriz. Bu varsayım, iki basit matematiksel adımdan sonra bizi bir özvektör denklemine götürür, o yüzden bu göstergeye özvektör merkezîliği (eigenvector centrality) adı verilir.

Özvektör merkezîliğinde ilk üç sırada Konya (0,25), Yozgat (0,23) ve Ankara (0,22) var. Son dört sıra ise İstanbul (0,007), Tekirdağ (0,004), Edirne (0,003) ve Kırklareli (0,002) tarafından işgal edilmiş.

Bu değişik merkezîlik tanımlarının hepsinde orta Anadolu şehirleri, beklenebileceği gibi, üst sırada.

Sonuç

Çıkarılacak pek bir sonuç yok burada, çünkü kullandığım ağ neredeyse mânâsız. Sadece komşuluk ilişkilerinden oluşuyor. Bazı kategorilerde Sivas, Erzurum, Konya gibi tarihsel öneme sahip şehirler üste çıksa da, İstanbul, Ankara, İzmir gibi yoğun sanayi ve ticaret faaliyeti olan büyük şehirler “taşra” gibi kalıyor. Bariz ki bu modelle ciddi jeopolitik çıkarımlar yapılamaz. Amacım zevk için biraz oynamaktı. Bu çizge bir veri olarak burada dursun, belki daha kapsamlı bir model kurarken işe yarar.

Daha iyi bir model için iller aralarındaki ana yollara göre bağlanabilir, bu bağlantılara ulaşım hacmine göre ağırlık değerleri konabilir, sınır ve kıyı illerine dış ticaretten dolayı daha fazla ağırlık verilebilir, ilçeler de hesaba katılabilir.

Sıra sıra sayılar — çözüm

Sıra sıra sayılar” bulmacasına katkıda bulunan, ilgilenen herkese teşekkürler. Doğrusu bu problem benim de başta tahmin ettiğimden daha ilginçmiş. İlgilenenler için teorisine dair bazı notları aşağıda aktarıyorum.

Genel kural şöyle: İlk satırda 1 ile başlarız. Satırda “bir tane 1” vardır, o yüzden ikinci satıra “1 1” yazarız. İkinci satırda “iki tane 1” olduğu için üçüncü satıra “2 1” yazarız. Sonraki satırlar:
“bir 2 bir 1” = “1 2 1 1”
“bir 1 bir 2 iki 1″ = 1 1 1 2 2 1”
“üç 1 iki 2 bir 1” = “3 1 2 2 1 1”
şeklinde gider.

Elbette rastgele bir sayı dizisiyle de başlayıp aynı kuralla evirtebiliriz.

Bu yazının geri kalanını okuyun

Uzayda bir deney: Elektrikli çubuk etrafında su damlaları

Uluslararası Uzay İstasyonu (ISS) astronotu Don Pettit, yerçekimsiz ortamda küçük fizik deneyleri yapıyor. Bunlardan birinde, plastik bir örgü şişini bir kağıt sürerek elektrikliyor ve yakınına şırıngayla su damlacıkları fışkırtıyor. Damlacıklar şişin etrafında dönüyor ve aynı zamanda şişe paralel olarak ileri geri gidiyorlar.

Bunun (en azından benim için) hoş ve şaşırtıcı tarafı damlaların bir noktadan sonra geri dönmesi. Tabii şiş ve damla karşı yüklü oldukları için damlanın (çok hızlı değilse) geri gelmesi beklenir, ama geri gelme hareketinin damla şişten uzaklaşmadan başlaması ilginç.

Temel fizik kullanarak bunun simülasyonunu yapmak kolay. Aşağıda verdiğim Python kodu, SciPy ile bu işi yapıyor. Görselleştirmeyi matplotlib veya Visual Python ile yapabiliriz.

Damlayı, bir metre uzunluktaki bir çubuğun ortası hizasında çubuğa beş santim mesafeden, ve çubuğa paralel bir düzlemde fışkırtırsak şöyle güzel bir yörünge elde ediyoruz.

Damlanın iki ayrı hareketi var: Çubuğa dik bir dairesel hareket (başlangıç hızını bunu elde edecek şekilde ayarladık) ve çubuk boyunca ileri geri hareket. Aynı videoda gördüğümüz gibi. Görüldüğü gibi damla çubuktan uzaklaşmadan geri dönüyor, yani çubuğun kenarına doğru bir potansiyel enerji duvarı var. Eğer damlanın paralel hızı biraz daha fazla olursa (kodda vx0 = -2*vz0 yapmayı deneyin) damla çubuktan kurtulup uzaklaşır gider.

Daha uzak mesafelerden başlayınca yörünge daha karmaşıklaşıyor. Meselâ aşağıdaki yörüngede damla çubuğun orta noktasından 50 santim uzaklıkta başlıyor.

Eğer damla çok uzaktan başlarsa çubuk bir nokta gibi görüneceği için yörünge yine basitleşir, bir düzlemde elips haline gelir.

Kullandığım Python kodu aşağıda. Parametrelerle oynayarak ilginç davranışlar gözleyebilirsiniz. İsterseniz bir tane daha damlacık ekleyip, damlacıkların birbirlerini itişini de denkleme katarak kaotik bir dans seyredebilirsiniz. VPython üç boyutlu çizim yaptığı için fareyle görüntüyü döndürebilir, içeri dışarı zumlayabilirsiniz.
Bu yazının geri kalanını okuyun

İki yeni preprint

Yeni yılın ilk yazısında geçen yılki araştırma işlerimi özetleyeyim istedim. Herkese mutlu, neşeli, sağlıklı ve özgür bir 2012 dileğiyle.

Kanaat dinamiği

Geçen yıl bu zamanlar, kanaat dinamiği konusunda giriştiğim bir çalışmayı yazmıştım. O sırada makaleyi Physica A‘ya göndermiştim; iki ay sonra suratıma attılar. Hiç utanmadan aynen Advances in Complex Systems‘e gönderdim. Yaklaşık altı ay sonra epeyce etraflı hakem raporları geldi; büyük değişiklikler istiyorlardı. Eh, yeni bir konuya tek başına girip el yordamıyla çalışınca böyle şeylere hazırlıklı olmak lâzım.

Hakem raporları başta moral bozucu olsa da, sebat ettiğinizde makaleyi daha kaliteli hale getirmenize yardımcı oluyorlar. İki aylık revizyonla müsveddeyi yarı yarıya tekrar yazdım; teorik hesaplar ekledim ve literatürü bir daha tarayıp makaleye daha iyi yedirdim. Kısalsın diye önceki versiyonun son kısımlarını sildim, ama eklenen malzeme sebebiyle yine de epey uzun kaldı.

Yeni halini Kasım sonunda dergiye gönderdim, halen ikinci değerlendirmeyi bekliyorum. İlgilenenler preprinti ArXiv’de bulabilirler: http://arxiv.org/abs/1112.4624

Tekrarlanabilir araştırma” prensiplerine uyarak, araştırmada kullandığım programların kaynak kodlarını (C ve Matlab) makaleyle beraber gönderdim. ArXiv sayfasında da aynı programlar mevcut. Bu programlarla sistemin davranışının animasyonunu gözleyebilir, sistemi otomatik olarak tekrar tekrar başlatıp istatistiklerini çıkarabilir, yer darlığından anlatamadığım veya aklıma gelmeyen davranışları inceleyebilirsiniz.

Kullandığım programları vermek fazladan zahmet çıkardı ama bunun çok önemli olduğuna inanıyorum. Yazılan programlar bir hesaplamalı bilim çalışmasının ayrılmaz parçalarıdır, o yüzden okuyucuya sunulmaları gerekir. Merak eden okuyucu baştan yazma zahmetine katlanmadan programı kendi çalıştırabilmeli, varsa hataları bulabilmeli, veya isterse yeni özellikler ekleyebilmeli.

Daha da önemlisi, programlarınızı başkasının da kullanabileceği şekilde düzenlerken bazı hataları da fark edebilirsiniz. Bende öyle oldu; temel simülasyon algoritmamda bir uyumsuzluk buldum ve sonuçları daha az verimli ama doğru bir algoritmayla tekrar ürettim.

Çok kişi kapalılığı tercih eder çünkü kapalılık zor durumda paçayı kurtarmalarını sağlar. Programları makaleyle beraber vermesem, ve gayretli biri programı baştan yazıp benimkiyle çelişen sonuçlar bulsa, “programda hata yapmışsındır” deyip işin içinden çıkabilirim. Karşılaştırmak için kaynak kodunu isteyen olursa “virüs sildi” diyebilirim veya okunamayacak karmakarışık bir kod gönderebilirim. Ama bu iyi bilimcilik olmaz. Nasıl ki bir matematikçi teoremlerinin ispatlarını vermeliyse, bir deneyci deney düzeneğini tarif etmeli ve edindiği verileri tam yayınlamalıysa, bilimsel programlar da aynen yayınlanmalı ve denetlenmeli, yoksa akıl yürütme sürecinde boşluklar oluşur.

Manyetik alandaki parçacıkların hareketi

Bu makale istemeden kanaat dinamiği ile aynı zamana denk geldi. American Journal of Physics fizik eğitimine yönelik makaleler yayınlayan bir dergidir. Ağustos sayısında uzay fiziği ve astronomi araştırmalarının fizik eğitiminde kullanılması hakkında bir özel sayı için bir makale çağrısı gördüm. Şansıma, evliya sabrıyla bana katlanan Richard Wolf sayesinde elektrik yüklü parçacıkların (elektron, iyon) manyetik alandaki hareketleri hakkında üç beş bilgi kırıntısı edinmiştim. Böyle bir makale için çok uygun bir konu olduğunu düşündüm.

Uzay fiziği ve plazma fiziği kitaplarında parçacık dinamiği en ince ayrıntısına kadar anlatılır, ama standart derslerin kitaplarında rastlanmaz. Yazık, çünkü meselâ adiabatik değişmezler gibi soyut konuları somutlaştırmak için güzel bir örnek teşkil ederler. Bu konunun temel kavramlarını özetleyip biraz da hesaplamalı problemler eklersem, klasik mekanik, elektromanyetizma, ve hesaplamalı fizik derslerinde kullanılabilecek bir malzeme hazırlamış olurum diye düşündüm.

Dünyanın manyetik alanında olup bitenleri basitçe özetledikten sonra, radyasyon kuşağı tabir edilen bölgedeki parçacıkların hareketini gösterdim. Hareket bayağı enteresandır; kendi üzerine iki kat sarılmış bir sarmal gibi:

Bu dinamikte değişik büyüklükler ve hızlarda seyreden üç ayrı periyodik hareket var. Her biri için, yaklaşık sabit olan bir “adiabatik değişmez” tanımlayıp, hareketi bunlar cinsinden ifade etmek mümkün, ki harcıâlem bir yöntemdir.

Kendi öğrenciliğimde fiziksel problemleri program yazarak incelemeye heves ederdim, ama konular hiç programlamaya uygun şekilde sunulmazdı. Ders kitaplarının çoğu hâlâ bu yönden eksiktir. Bu yüzden bu konuyu hesaplama odaklı şekilde sunmaya çalıştım. Okuyucunun şekilleri kendi üretebileceği, değiştirip denemeler yapabileceği Python programları hazırladım. Makalenin sonuna, basitten karmaşığa doğru, birbirini destekleyen oniki hesaplama problemi ekledim. Makalenin tamamında, problemler dahil, aktif araştırma ile pedagojiyi dengelemeye çalıştım.

Anlaşılan doğru düşünmüşüm ki hakem raporları olumlu geldi. İstenilen birkaç küçük değişiklikten sonra hakemlerden kabul aldı, şimdi editoryal incelemede. İlgilenenler için preprint ve programlar ArXiv’de: http://arxiv.org/abs/1112.3487

Hamiş

Ikına sıkına yaptığın ıvır zıvır işleri amma da ballandırarak anlattın, görgüsüz” demek geçebilir içinizden. Ne diyeyim, haklısınız. Başkaları blogunda çocuğunu, kedisini, köpeğini anlatır, ben de bunları anlatıyorum, ne yapayım.

Python programlama dersi

Bitirdiğimiz dönemde Python programlamaya giriş dersi verme şansım oldu. Python’u yıllardır ufak çaplı hesaplama işleri için kullanıyordum ve çevreme de tavsiye ediyordum, ama bilgimde boşluklar olduğunun da farkındaydım. Bir şeyi öğrenmenin en iyi yolu onu öğretmektir dedim ve bir seçmeli dersi Python’a uyarladım.

Ders hafta arka arkaya üç saat, bilgisayar laboratuarında 10 kişilik bir grupla işlendi. Her kavram için hem bolca kısa örnek, hem de konuları sentezleyen mânâlı programcıklar göstermeye çalıştım.

Dersin resmi adı “Scripting Languages” olduğu için ilk haftayı script (betik) dillerinin ne olduğunu, “sistem programlama” dilleri C/C++ vs.den farklarını irdelemeye ayırdım. Betik dillerinin tercih edildiği uygulama alanlarını sıraladım: Sistem yönetimi; programları bağlamak ve yönlendirmek (gluing and steering); GUI oluşturma, hızlı prototip geliştirme; tek seferlik (throwaway) programlar; metin işleme; Web uygulamaları; varolan yazılımları genişletme.

John Ousterhout’un “Scripting: Higher Level Programming for the 21st Century” makalesini ve CIO’da yayınlanan “PHP, JavaScript, Ruby, Perl, Python, and Tcl Today: The State of the Scripting Universe” tartışmasını genel okuma olarak verdim.

Ders bilgisayar laboratuarında pratik olarak yapıldığından ikinci haftada ilk iş Python ve IDLE kurdurdum. Ardından Mark Lutz‘un “Learning Python“unu (3. edisyon) takip ederek genel Python programlamayı işlemeye başladık.

Lutz iyi ve kapsamlı bir kitap; boşluk bırakmadan her şeyi anlatıyor fakat bazen materyali gereksiz yere uzatıyor ve tekrarlıyor. Bir de biraz aykırı bir sırası var. Stringleri, listeleri, dosyaları didik didik ediyor ama atamalar ve if, while, for yapıları daha sonra geliyor. Eminim tecrübeden kaynaklanan iyi bir sebebi vardır ama bana biraz tuhaf geldi.

Dersin yaklaşık 6-7 haftası temel Python ile geçti. “Learning Python”u 17. bölüme kadar (functional programming) takip ettik. Biraz fazla uzadı. Hem kitapta konular sündürülüyor, hem ilk haftalarda birer saati problem çözmeye ayırdık. Aslında temeller için 3-4 hafta kâfi.

Temellerden sonra bir hafta Matplotlib ile grafik çizme çalıştık, ardından bir hafta urllib ile webden veri indirip işleme ve görsellemeden bahsettik. Bir hafta düzenli ifadelere (regular expressions) ayırdık. Sonraki hafta komut satırı argümanları ve optparse ile opsiyon derlemekten bahsettik; subprocess modülü ile alt program çalıştırmayı inceledik.

Sondan bir önceki hafta Tkinter ile grafik arayüz oluşturma alıştırmaları yaptık. Şahsen çok zevkli buldum; daha fazla vakit ayırabilmek isterdim. Son haftayı öğrencilerin sunuşları ile geçirdik.

Bazı önemli konuları işleyemedik: Modüller, OOP, C/Python birleştirmesi, CGI ve Web programlama, threading, …

Dersi tekrar verirsem şöyle bir plan takip etmeyi düşünüyorum:

  • Betik dillerine giriş ve kurulum: 1 hafta
  • Temel Python programlama (OOP hariç): 4 hafta
  • Matplotlib ile grafikler: 1 hafta
  • Düzenli ifadeler ve metin işleme: 1 hafta
  • Komut satırı argümanları, optparse, urllib: 1 hafta
  • Tkinter: 2 hafta
  • Süreç yönetimi, multiprocessing (veya multithreading): 1 hafta
  • Modüller ve OOP: 2 hafta
  • C/Python birleştirme: 1 hafta

Python dersi veriyorsanız veya Python kullanan bir programcıysanız, derste örnek olarak yaptırılabilecek uygulamalar, sık kullandığınız modüller gibi, bilişim öğrencilerine faydalı olacak tavsiyelerinizi almaktan mutluluk duyarım