Bilimsel Makalelerden Algoritma Gerçekleme
Çevirmenin Notları
Bu, Emmanuel Goossaert'in Code Capsule ismindeki günlüğünde How to implement an algorithm from a scientific paper başlığıyla yayınladığı yazının izin alınarak yapılmış bir çevirisidir.Yazardan yaklaşık üç sene önce izin almış ve hemen çeviriye başlamıştım ama çeviriye ara verince geri dönmem bu zamanı buldu. Yazı hala güncelliğini koruduğu için şimdi yayımlamanın da mantıksız olmadığını düşünerek çeviriyi tamamladım.
Sanırım orijinal yazıda "faducial points" olarak geçen ifade "fiducial points" olmalı. Çeviriyi fiducial points'e göre yaptım.
"The use of statistical analysis shows a minimum of driving from the author" ile ne denmek istendiğini anlayamadığım için bu kısmı çevirmedim.
Wash-off, durulama ve yıkama anlamına geliyor. Ayrıca WaSH, water, sanitation and hygiene (su, sanitasyon ve hijyen) için bir akronimmiş. Wash-off implementation ile ne denmek istendiğini tam çıkaramadığım için kullanıldığı yerdeki anlam içinde kabul edilebilir olan son gerçekleme ifadesini kullandım.
Kodlamada yorumlar için her zaman İngilizce kullanmak iyi bir fikir olsa da ne anlama geldiklerini göstermek için yazıya çevirilerini de ekledim.
Bu yazı, bilimsel bir makaleden algoritma gerçeklemek için kısa bir kılavuzdur. Kitap ve bilimsel yayınlardan pek çok karmaşık algoritma gerçekledim ve bu yazı araştırırken, okurken, kodlarken ve hata ayıklarken öğrendiklerimi özetliyor. Açıkçası bu yazı, sadece bilgisayar bilimleriyle ilgili alanlardaki yayınlarla sınırlıdır. Bununla birlikte aşağıda sunulan önerileri ve doğru uygulamaları her türlü makale ve gerçeklemeye uygulayabilirsiniz.
1 – Başlamadan önce
Bir teknik makaleyi okuyup gerçekleme yapmaya başlamadan önce gözden geçirmeniz gereken birkaç nokta vardır. Böyle bir projeye başlamak üzere olduğunuz her zaman bunları dikkatlice tamamladığınızdan emin olun.1.1 – Kodlamadan kaçınmak için özgür bir gerçekleme bulun
Alan hakkında daha çok bilgi edinmek amacıyla makaleyi gerçeklemek istemiyorsanız onu gerçeklemenize gerek yoktur. Aslında istediğiniz makaleyi koda dökmek değil makaleyi gerçekleyen koddur. Bu yüzden herhangi bir şeye başlamadan önce birkaç gün internette özgür bir gerçekleme bulmaya çalışmalısınız. Şunu bir düşünün: kod arayarak iki gününüzü harcamayı mı yoksa halihazırda var olabilecek bir algoritmayı gerçekleyerek iki ayınızı ziyan etmeyi mi istersiniz.1.2 – Hedefinize ulaşmak için daha basit yollar bulun
Kendinize ne yapmaya çalıştığınızı ve daha basit çözümlerin ihtiyaçlarınızı karşılayıp karşılayamayacağını sorun. Sonuç istediğinizin sadece %80'i olsa bile başka bir yöntemi – örneğin makaleyi gerçeklemenizi gerektirmeyen ve iki gün içinde çalıştırabileceğiniz veya varolan özgür kütüphaneleri kullanan bir taneyi – kullanabilir misiniz? Bununla ilgili daha çok bilgi için 80-20 Verimlilik Kuralı yazıma bakınız.1.3 – Yazılım patentlerine dikkat edin
ABD'deyseniz yazılım patentlerine dikkat edin. Bazı makaleler patentlidir ve bunları ticari uygulamalarda kullanmak başınızı belaya sokabilir.1.4 – Makalenin alanıyla ilgili daha çok bilgi edinin
Hesaplamalı Sinirbilim bağlamında Destek Vektörü Makineleri kullanımı hakkında bir makale okuyorsanız, o zaman Makine Öğrenmesi ve DVM'ye alternatif olabilecek farklı türde sınıflandırıcılar hakkında kısa bir giriş yazısı ve ayrıca şu anda yapılan araştırmaları öğrenmek için Hesaplamalı Sinirbilim hakkındaki genel makaleleri de okumalısınız.1.5 – Motive kalın
Hiç makale gerçeklemediyseniz ve/veya makalenin alanına yeniyseniz okuma çok zor olabilir. Ne olursa olsun, matematiksel eşitliklerin miktarının ve karmaşıklığının cesaretinizi kırmasına izin vermeyin. Ayrıca, hız sorun değildir, makaleyi istediğinizden daha yavaş anladığınızı hissetseniz bile çalışmaya devam edin ve sonrasında makalede sunulan kavramları ağır ağır ve istikrarlı bir şekilde anladığınızı görecek ve art arda tüm zorlukları aşacaksınız.2 – Üç çeşit makale
Rastgele bir makale seçmek ve onu hemen gerçeklemeye başlamak hiçbir zaman iyi bir fikir değildir. Birçok makale vardır ve bu da bir sürü çöp olduğu anlamına gelir. Tüm yayınlar üç kategoriye sığdırılabilir:2.1 – Çığır açıcı makale
Bazı gerçekten ilginç, iyi yazılmış ve özgün araştırmalar vardır. Bu makalelerin çoğu üst düzey üniversitelerden veya bir problem üzerinde altı ila on yıldan beri çalışan daha küçük üniversitelerdeki araştırma takımlarından gelir. İkinci gruba girenleri fark etmek zor değildir: bu tipte makale yazanlar makalelerinde kendi yayınlarına referans verirler, bir süredir problem üzerinde uğraştıklarını gösterirler ve yeni çalışmalarını yayınların doğrulanmış bir kaydı üzerine temellendirirler. Ayrıca çığır açıcı makaleler genellikle alanında en iyi dergilerde yayımlanmaktadır.2.2 – Taklit makale
Bazı araştırma grupları sadece çığır açan takımların çalışmalarını takip eder, çığır açıcı makalelere iyileştirmeler önerir ve iyileştirmelerinin sonuçlarını yayımlar. Bu makalelerin çoğu uygun istatiksel analiz yönünden eksiktir ve hatalı bir şekilde iyileştirmelerin orijinal algoritmayı alt ettiği sonucuna varılır. Bu iyileştirmeler çoğu zaman gereksiz ek karmaşıklık dışında bir şey getirmez. Ancak tüm taklit makaleler kötü değildir. Bazıları iyidir, fakat bunlar nadirdir.2.3 – Çöp makale
Bazı araştırmacılar ya ne yaptığını bilmez ya da gerçekten çok kötüdürler. Bunlar sadece ders verdikleri akademik kurumdaki durumlarını ve ayrıcalıklarını korumaya çalışır. Finansmana ihtiyaç duyarlar ve bunun için bir şeyler yayımlamaları gerekir, bu herhangi bir şey olabilir. Dürüst olanları size sonuç bölümünde başarısız olduğunu ve sonuçların sadece %N oranında (burada N kötü bir değerdir) doğru olduğunu söyler. Ama bazı kötü olanları yalan söyler ve araştırmalarının büyük bir başarı olduğunu söyler. Yayın okudukça çöp makaleleri fark etmek ve bunlardan kurtulmak kolaylaşır.3 - Bilimsel bir makale nasıl okunur
Konuyla ilgili zaten çok şey yazıldı, bu yüzden çok fazla yazamayacağım. İyi bir başlangıç noktası, Srinivasan Keshav tarafından yazılan How to Read a Paper'dır. Aşağıda bilimsel yayınları okurken faydalı bulduğum birkaç nokta var.3.1 – Doğru makaleyi bulun
Uygulamak istediğiniz, bütün bir çalışma alanını başlatan orijinal bir makaledir. İyi ama henüz olgunlaşmamış çığır açıcı bir makaleye gerçekten çeşitli iyileştirmeler ve daha çok tutarlılık getirdiğini düşünüyorsanız, bir taklit makaleyi seçmek de bazen sorun değildir.Diyelim ki başlangıç noktanız olarak bir makaleniz var. Bu makalenin çevresinde biraz araştırma yapmanız gerekir. Bunun için strateji, ilgili yayınları ve makalenin sonundaki "Referanslar" bölümünde listelenen yayınları aramaktır. Google Akademik'e gidin ve başlıkları ve yazarları arayın. Bulduğunuz makalelerden herhangi biri, orijinalinden daha iyi bir iş çıkarmış mı? Eğer öyleyse, ilk etapta bakmakta olduğunuz makaleden kurtulup bulduğunuz yeni makaleyle ilerleyin. Google Akademik'in bir başka harika özelliği de belirli bir makaleden alıntı yapan makaleleri bulabilmenizdir. Bu gerçekten harika, çünkü yapmanız gereken tek şey bir makaleden diğerine atıf zincirini takip etmek ve sonunda bu alandaki en yeni makaleleri bulacaksınız. İyi bir makaleyi bir başlangıç noktasından bulmak, geçerli makalede alıntı yapılan makaleleri ve mevcut makaleden alıntı yapan makaleleri aramakla ilgilidir. Zaman içinde ileri geri hareket ederek hem kaliteli hem de gereksinimlerinize uyan makaleyi bulmalısınız.
Önemli: Bu basit keşif ve tahmin aşamasında, makaleleri okumamalı ve tam olarak anlamamalısınız. Doğru makaleyi bulmak için bu arama, sadece makalelere göz gezdirerek ve çöp olanları tespit etmek için içgüdülerinizi kullanarak yapılmalıdır (bu deneyimle birlikte gelir).
3.2 – Ekranda okumayın
Yayını kağıda yazdırın ve kağıt versiyonunu okuyun. Ayrıca, her sayfaya daha fazla yazdırmak için boyutu küçültmeyin. Evet, böyle yapmazsanız üç sayfa kağıttan tasarruf edersiniz, ancak bu küçük karakterleri okumaktan daha çok yorulacağınız için zaman kaybedersiniz. Okumak için iyi yazı tipi boyutu 11 ila 13 punto arasındadır.3.3 – İyi zamanlama ve iyi yer
Gecenin köründe bir makale okumayın, bunu, günün hala beynin taze olduğu anlarında yapın. Ayrıca, sessiz bir alan bulun ve iyi aydınlatma kullanın. Benim okuduğumda, doğrudan belgeyi gösteren bir masa lambam var.3.4 – Keçeli kalemler ve notlar
Önemli bilgileri bir keçeli kalemle işaretleyin ve kenarlardaki boşluklara okurken kafanızda ne tür fikirler ortaya çıktığını not edin.3.5 – Tüm terimlerin tanımlarını bilin
Çoğunlukla haber makaleleri ve kurmaca yazın okumaya alışkın olduğunuzda, beyniniz, bilmediğiniz sözcüklerin anlamını, içeriği bir çıkarım aracı olarak kullanarak anlamlandırmak için eğitilir. Bilimsel yayınları okumak farklı bir alıştırmadır ve en büyük yanlışlardan biri, bir kelime için yanlış anlam çıkarmaktır. Mesela bu cümleyle "Bu bölünme yaklaşımının sonuçları hala bulanık yapılardan muzdariptir". Burada "bölünme" ve "yapı" kelimelerinin Türkçe'de genel anlamları vardır, ancak Bilgisayarla Görme alanında da özel anlamları vardır. Bu kelimelerin bu makalede özel bir anlamı olduğunu bilmiyorsanız, dikkat etmeden okurken beyniniz bu kelimeler için genel anlamlarını kullanacak ve sonuç olarak çok önemli bazı bilgileri kaçırmış olabileceksiniz. Bu nedenle, (i) kelimelerle ilgili varsayımlardan kaçınmalısınız ve şüphe duyduğunuzda, yayının yazıldığı alandaki kelimeyi arayıp bulun, (ii) yayındaki daha önceden bilmediğiniz kendine özgü tüm kavram ve kelimeleri bir kağıda sözlük olarak yazın. "Referans noktası" ve "parçalı afine dönüşümü" gibi kavramlarla ilk kez karşılaşırsanız kesin tanımlarını aramalı ve sözlüğünüze yazmalısınız. Kavramlar, dil etkin beyin kısayollarıdır ve yazarların amacını daha hızlı anlamanızı sağlar.3.6 – Sonuçta istatistiksel analiz arayın
Yazarlar kendi algoritmaları için yalnızca bir ve başka bir algoritma için yine yalnızca bir eğri sunuyor ve "bakın, bizim algoritmamız %20 daha doğru" derlerse, çöp okuduğunuzu bilirsiniz. Okumak istediğiniz şey: "N örnekten oluşan bir test kümesinde, algoritmamız, iki örnekli bir t-testi kullanarak %5'lik bir p-değeri ile önemli bir gelişme gösterir." İstatistiksel analizin kullanılması, sonuçların genelleme için güvenilir olabileceğinin kanıtıdır (yazarlar sonuçlarını daha seksi göstermek için yalan söylemediği sürece ki, bu da her zaman gerçekleşebilir).3.7 – Makaleyi açıklayan sonuçların, ihtiyacınız olanları verdiğinden emin olun
Diyelim ki, fotoğraftaki tüm yüzleri bulabilecek bir algoritma istiyorsunuz. Makalenin yazarları, modellerinin 80 farklı kişiden 10 poz (10 x 80 = 800 fotoğraf) kullanarak eğitildiği ve eğitim setiyle yüz tespitinin doğruluğunun %98 olduğunu, ancak test setiyle (eğitim sırasında kullanılmayan resimlerle) %70 olduğunu söylüyor. Bu ne anlama geliyor? Görünüşe göre, algoritmanın düzgün şekilde genelleştirme yapmasıyla ilgili sorunlar var. Algoritma eğitim setinde kullanıldığında iyi performans gösterir ama gerçek dünyadaki durumlar için kullanıldığında daha kötü performans gösterir. Belki de bu noktada varmanız gereken sonuç, bu makalenin ihtiyaç duyduğunuz şey için yeterince iyi olmadığıdır.3.8 – Yazarlar tarafından kullanılan girdi verilerine dikkat edin
Bir web kamerasıyla yüz tanıma yapmak istiyorsanız ve yazarlar yüksek çözünürlüklü bir kamerayla çekilen resimleri kullandıysa, algoritmanın sizin durumunuzda iyi performans göstermeme olasılığı vardır. Algoritmanın sizinkine benzer veriler üzerinde test edildiğinden emin olun, aksi takdirde gerçek dünya kurulumunuzda tamamen kullanışsız olan harika bir gerçekleme ortaya çıkar.3.9 – Yazarlar da insandır
Yazarlar insandır ve bu nedenle hata yaparlar. Yazarların kesinlikle haklı olduğunu varsaymayın ve bir denklemin anlaşılması ya da izlenmesi gerçekten zorsa yazarların orada hata yapıp yapmadıklarını kendinize sorun. Bu sadece makalede bir yazım hatası veya işlemde bir hata olabilir. Her iki durumda da, öğrenmenin en iyi yolu denklemleri kendinizin çözmesi ve sonuçlarını doğrulamaya çalışmasıdır.3.10 – Değişkenleri ve işleçleri anlama
Bir yayının gerçeklenmesindeki ana görev, makaledeki matematik denklemlerinin kod ve verilere çevrilmesidir. Bu, kodlamaya geçmeden önce denklemlerin ve bu denklemler üzerindeki işlemlerin %100'ünü anlamanız gerektiği anlamına gelir. Örneğin, "C = A . B" farklı bir anlama gelebilir. A ve B basit sayılar olabilir ve "." operatörü bir çarpma olabilir. Bu durumda C, iki A ve B sayısının çarpımı olacaktır. Ancak, belki de A ve B matristir ve "." matris çarpma operatörünü temsil eder. Bu durumda, C, A ve B matrislerinin çarpım matrisi olacaktır. Bir başka olasılık, A ve B'nin matris olması ve "." İfadesinin terim-terim çarpım operatörü olmasıdır. Bu durumda, her bir C(i,j) elemanı, A(i,j) ve B(i,j) elemanının çarpımıdır. Değişkenler ve operatörler için notasyonlar bir matematiksel konvansiyondan diğerine ve bir araştırma grubundan diğerine değişebilir. Tüm değişkenlerin ne olduğunu (skaler, vektör, matris veya başka bir şey) ve tüm operatörlerin bu değişkenlerde ne yaptığını bildiğinizden emin olun.3.11 – Veri akışını anlayın
Bir makale, denklemlerin art arda birbirini takip etmesidir. Kodlamaya başlamadan önce N denkleminin çıktısını, N+1 denkleminin girişine nasıl bağlayacağınızı bilmelisiniz.4 – Prototiplendirme
Makaleyi okuyup anladığınızda, prototip oluşturma zamanı gelmiştir. Bu çok önemli bir adımdır ve kaçınılması zaman ve kaynak israfına neden olabilir. C, C++ veya Java gibi dillerde karmaşık bir algoritma gerçeklemek çok zaman alabilir. Makale hakkında kendinize güvenseniz ve algoritmanın işe yarayacağını düşünseniz bile, algoritmanın çalışmama ihtimali vardır. Yani, sadece gerçekten çalışıp çalışmadığını kontrol etmek için en kirli ve mümkün olan en hızlı şekilde kodlama yapabilmek istemelisiniz.4.1 – Prototiplendirme çözümleri
Bunun için en iyi çözüm, Matlab, R, Octave veya SciPy/NumPy gibi daha yüksek düzeyde çok yönlü bir dil veya ortam kullanmaktır. Matematiksel bir denklemi C++ ile göstermek ve sonra sonuçları elle kontrol etmek için yazdırmak o kadar kolay değildir. Aksine, Matlab'a denklemler yazmak ve sonra bunları yazdırmak son derece kolaydır. C++'ta iki ila üç haftanızı alan bir iş, Matlab'da iki günde olacaktır.4.2 – Prototiplendirme hata ayıklama işlemine yardımcı olur
Bir prototipe sahip olmanın avantajlarından biri, C++ sürümünüzü yaptığınızda Matlab prototipiyle C++ uygulaması arasındaki sonuçları karşılaştırarak hata ayıklayabilmenizdir. Bu fikir, aşağıdaki "Hata ayıklama" bölümünde daha da geliştirilecektir.4.3 – Son gerçekleme sorunları önceden bilinir
Prototipinizde kesinlikle yazılım tasarım hataları yapacaksınız ve bu, hem süreçlerde hem de verilerde zorlukların nerede olduğunu tespit edebildiğiniz için iyi bir şeydir. C++ sürümünü kodlayacağınız zaman, yazılımı nasıl daha iyi tasarlayacağınızı bileceksiniz ve prototip oluşturma adımını gerçekleştirmeseydiniz üretemeyeceğiniz kadar temiz ve sağlam bir kod üreteceksiniz (bu, Frederick Brooks'un The Mythical Man-Month'ta sunduğu "kullan at sistem" fikridir).4.4 – Makalede sunulan sonuçları doğrulayın
Makalenin "Deney" bölümünü dikkatlice okuyunuz ve test verilerini, yazarların kullandığına benzer şekilde kullanarak deney koşullarını mümkün olduğu kadar aynı şekilde yeniden üretmeye çalışın. Bu, yazarların elde ettiği sonuçları tekrar üretme şansınızı arttırır. Benzer koşulları kullanmamak, gerçeklemenizde bir hata olarak kabul edebileceğiniz davranışına yol açabilir, oysa durum sadece gerçeklemenizi doğru verilerle beslememenizden kaynaklanıyor olabilir. Benzer verilere dayanarak aynı sonuçları tekrarlayabildikten sonra farklı veriler üzerinde teste başlayabilirsiniz.5 – Doğru dili ve kütüphaneleri seçin
Bu aşamada, yayında sunulan algoritma ve kavramları açık bir şekilde anlamış olmalısınız ve algoritmanın aslında üretimde kullanmak istediğiniz girdi verileri üzerinde çalıştığını gösteren bir çalışan prototipiniz olmalıdır. Artık yayını, üretimde kullanmak istediğiniz dil ve çatıyla gerçeklemekten oluşan bir sonraki adıma geçmenin zamanı geldi.5.1 – Var olan sistemler
Çoğu zaman, üretim dili ve kütüphaneler önceden var olan sistemler tarafından belirlenir. Örneğin, resimde aydınlatma normalizasyonu için Java'da kodlanmış bir kütüphanede bir algoritma kümeniz var ve bir yayından yeni bir algoritma eklemek istiyorsunuz. Bu durumda açıkça görülüyor ki bu yeni algoritmayı C++ ile değil Java ile kodlayacaksınızdır.5.2 – Gerçeklemenin gelecekteki kullanımlarını tahmin edin
Size bir dil empoze eden önceden var olan bir sistem yoksa, o zaman algoritmanın tahmin edilen kullanımlarına dayanarak dil seçimi yapılmalıdır. Örneğin, uygulamanızın dört ila altı ay içinde iPhone'a aktarılacığına inanıyorsanız, kodu bir Objective-C uygulamasına kolayca ve her şeye sıfırdan başlamak zorunda kalmadan entegre etmenin tek yolu olduğu için Java yerine C/C++'ı seçmelisiniz.5.3 – Algoritmayı tamamen veya kısmen çözen mevcut kütüphaneler
Farklı dillerde bulunan kütüphaneler de üretim dilinin seçimini yönlendirebilir. Uygulamak istediğiniz algoritmanın, temel bileşen analizi (principal component analysis, PCA) ve tekil değer ayrışması (singular value decomposition, SVD) gibi iyi bilinen cebir tekniklerini kullandığını düşünelim. PCA ve SVD'yi sıfırdan kodlayabilirsiniz ama bir hata varsa bu, bir hafta boyunca hata ayıklamaya neden olabilir ya da bu teknikleri uygulayan bir kütüphaneyi yeniden kullanabilir, bu kütüphanenin konvansiyonunu ve matris sınıfını kullanarak uygulamanızın kodunu yazabilirsiniz. İdeal olarak, gerçeklemenizi alt görevlere ayırmalı ve bu alt görevleri halihazırda gerçekleyen kütüphanelerin olabildiğince çoğunu bulmaya çalışmalısınız. Yalnızca belirli bir dil için kullanılabilen mükemmel kütüphane kümesini bulursanız, o dili seçmelisiniz. Ayrıca, kütüphane seçiminin mevcut kodu yeniden kullanmak ve bağımlılıkları en aza indirmek arasında bir ödünleşim olması gerektiğini unutmayın. Evet, gerçeklemeniz için gereken her alt görev için bir kodun olması iyidir, ancak bunun için 20'nin üzerinde kütüphaneye bağımlılık oluşturulması gerekiyorsa bu çok pratik olmayabilir ve uygulamanızın gelecekteki kararlılığını tehlikeye atabilir.6 – Gerçekleme
İşte yayınları gerçeklemedeki deneyimlerimden bazı ipuçları6.1 – Doğru hassasiyeti seçin
Hesaplamanız için kullanacağınız tür dikkatlice seçilmelidir. Genellikle float yerine double kullanmak çok daha iyidir. Bellek kullanımı daha çok olabilir, ancak hesaplamadaki hassasiyet büyük ölçüde gelişecek ve genellikle buna değer. Ayrıca, 32 bit ve 64 bit sistemler arasındaki farklara vakıf olmalısınız. Yapabiliyorsanız, altta yatan türün (float veya double, 32-bit veya 64-bit) enkapsüle edilmesi için kendi türünüzü yaratın ve kodunuzda bu türü kullanın. Bu, C/C++'ta bir tanımla veya Java'da bir sınıfla yapılabilir.6.2 – Her şeyi belgeleyin
Aşırı belgelemenin bir projeyi önemli ölçüde yavaşlatabileceği doğru olsa da, karmaşık bir teknik makalenin gerçeklenmesi durumunda, her şey hakkında yorum eklemek istersiniz. Projede çalışan tek kişi siz olsanız bile dosyalarınızı, sınıflarınızı ve yöntemlerinizi belgelemelisiniz. Doxygen veya reStructuredText gibi bir konvansiyon seçin ve buna bağlı kalın. Geliştirmenin ilerleyen zamanlarında, bazı sınıfların nasıl çalıştığını veya bazı yöntemleri nasıl gerçeklediğinizi unutacağınız bir an olacak ve kodu belgelediğiniz için kendinize teşekkür edeceksiniz!6.3 – Kodunuzda yararlandığınız makaleye referanslar ekleyin
Gerçeklediğiniz makaledeki her denklem için makaleyi (yazarları ve yılı) ve paragraf numarasını veya denklem numarasını gösteren bir yorum eklemeniz gerekir. Bu şekilde, daha sonra kodu tekrar okuduğunuzda, kodu doğrudan makaledeki kesin konumlarla ilişkilendirebilirsiniz. Bu yorumlar şöyle görünmeli:// See Cootes et al., 2001, Equation 2.3veya
// See Matthews and Baker, 2004, Section 4.1.2
// Bkz. Cootes ve arkadaşları, 2001, Denklem 2.3
// Bkz. Matthews ve Baker, 2004, Bölüm 4.1.2
6.4 – Değişken isimlerinizde matematiksel gösterimlerden kaçının
Diyelim ki algoritmadaki bir nicelik, A ile ifade edilmiş bir matristir. Daha sonra algoritma, matrisin dA = (dA/dx, dA/dy) olarak belirtilen iki boyut üzerindeki eğimini gerektirir. O zaman değişkenlerin ismi "dA_dx" ve "dA_dy" değil, "gradient_x" ve "gradient_y" olmalıdır. Benzer şekilde, bir denklem sistemi bir yakınsama testi gerektiriyorsa, değişkenler "prev_dA_dx" ve "dA_dx" değil, "error_previous" ve "error_current" olmalıdır. Kullanılan makalenin yazarlarının harf gösterimleri ne olursa olsun her zaman temsil ettikleri fiziksel niceliklere uygun olarak isimlendirin (örneğin "dA_dx" değil "gradient_x" şeklinde) ve yine her zaman soldan sağa doğru daha özgünden daha az özgün olanı (örneğin, "x_gradient" değil "gradient_x" şeklinde) belirtin.6.5 – İlk aşamada optimizasyon yapmayın
Kodunuzun hangi bölümünün optimizasyona ihtiyaç duyacağından tam olarak emin olamayacağınızdan tüm optimizasyonları daha sonraya bırakın. Olası bir optimizasyonu her gördüğünüzde bir yorum ekleyin ve aşağıdaki gibi optimizasyonun nasıl uygulanması gerektiğini birkaç satırda açıklayın:// OPTIMIZE HERE: computing the matrix one column at a timeveya
// and multiplying them directly could save memory
// OPTİMİZE ET: her seferinde matrisin bir sütununu hesaplamakBu şekilde, daha sonra kodunuzdaki optimizasyonun mümkün olabileceği tüm konumları bulabilir ve nasıl optimize edeceğiniz konusunda taze ipuçları alabilirsiniz. Gerçeklemeniz tamamlandığında Valgrind gibi bir profil oluşturucuyu veya kullandığınız programlama dilinde ne varsa onu çalıştırarak nerede optimizasyon yapabileceğinizi bulabileceksiniz.
// ve onları doğrudan çarpmak belleği daha az kullanabilir
6.6 – UPA oluşturmayı mı planlıyorsunuz?
Geçerli kodunuzu zamanla büyüyecek olan bir UPA için temel olarak kullanmayı planlıyorsanız gerçekten kullanılabilir olan arayüzler oluşturma tekniklerinin farkında olmalısınız. Bunun için, Joshua Bloch tarafından How to Design a Good API and Why it Matters (İyi bir UPA Nasıl Tasarlanır ve Bu Niçin Önemlidir) sunumunda özetlenen "kütüphaneye karşı kodlama" tekniğini tavsiye ederim.7 – Hata ayıklama
Yeni bir algoritma uygulamak, daha önce hiç yemediğiniz bir yemeği yapmak gibidir. Tadı iyi olsa bile, tadının bu olup olmaması gerektiğini asla bilemezsiniz. Şimdi şanslıyız, çünkü yemek yapmanın aksine, yazılım geliştirmenin bir gerçeklememize duyduğumuz güveni arttırmak için yararlı bir numarası var.7.1 – Sonuçları diğer gerçeklemelerle karşılaştırın
Hataları ayıklamanın iyi bir yolu, kodunuzun sonuçlarını, aynı algoritmanın mevcut bir gerçeklemesinin sonuçlarıyla karşılaştırmaktır. Yukarıda sunulan "Başlamadan önce" bölümündeki tüm görevleri doğru yaptığınızı varsaydığım için algoritmanın mevcut bir gerçeklemesini bulamamış olmalısınız (yoksa makaleyi gerçeklemek yerine bulduklarınızı kullanmış olurdunuz!). Sonuç olarak, bu aşamada sahip olduğunuz diğer tek gerçekleme daha önce programladığınız prototiptir.Bu nedenle buradaki fikir, algoritmanın her aşamasında prototipin ve üretim uygulamasının sonuçlarını karşılaştırmaktır. Sonuçlar farklıysa iki gerçeklemeden biri yanlış bir şey yapıyordur ve siz de bunu hangisinin yaptığını ve bunun arkasında yatan nedeni bulmalısınız. Kesinlik değişebilir (prototip x = 1.8966, üretim kodu x = 1.8965 değerini verebilir) ve karşılaştırma elbette bunu dikkate almalıdır.
7.2 – Makaleyi okuyan insanlarla konuşun
Her iki gerçekleme (prototip ve üretim) için de tüm adımlar aynı sonuçları verdikten sonra kodunuzun hatasız olduğundan emin olabilirsiniz. Bununla birlikte, makaleyi anlamada hata yapma riskiniz vardır. Bu durumda, her iki gerçekleme de her adım için aynı sonuçları verir ve gerçeklemelerinizin iyi olduğunu düşünürsünüz ama bu sadece her iki gerçeklemenin de aynı derecede yanlış olduğunu kanıtlar. Ne yazık ki, bu tür sorunları tespit etmenin bir yolu yok. En iyi seçenek, makaleyi okuyan birini bulmak ve bu kişiye algoritmanın emin olmadığınız kısımları hakkında sorular sormaktır. Makalenin yazarlarına bile sormaya çalışabilirsiniz, ancak cevap alma şansınız çok düşüktür.7.3 – Değişkenlerinizi görselleştirin
Geliştirme yaparken algoritmanın kullandığı değişkenlerin içeriğine göz kulak olmak her zaman iyi bir fikirdir. Sadece sahip olduğunuz matrislerdeki ve verilerdeki tüm değerleri yazdırmaktan bahsetmiyorum, gerçeklemenizdeki tüm değişkenlere uyarlanmış görselleştirme numaraları bulmaktan bahsediyorum. Örneğin, bir matrisin bir görüntünün gradyanını göstermesi gerekiyorsa, o zaman kodlama ve hata ayıklama sırasında, yalnızca görüntü matrisindeki sayı değerlerini değil, bu gradyan görüntüsünün yer aldığı bir pencere göstermeniz gerekir. Bu şekilde, gerçek bir görüntüyü işlediğiniz verilerle ilişkilendirirsiniz ve değişkenlerden birinde, olası bir hatayı belirten bir sorun olduğunda bunu tespit edebilirsiniz. Yaratıcı görselleştirme püf noktaları, görüntüleri, serpme diyagramlarını, grafikleri veya sadece 1000 sayıdan oluşan aptalca bir liste olmayan ve üzerinde zihinsel bir görüntüyü ilişkilendirebileceğiniz her şeyi içerir.7.4 – Veri setini test etme
Gerçeklemenizi denemek için veri üretmek çok zaman alabilir. Ne zaman yapabilirseniz veritabanları (yüz veritabanı, metin veritabanları, vb.) veya bu tür veriler için veri üretme araçları bulmaya çalışın. Hiçbiri yoksa, elle 1000 örnek üreterek zaman kaybetmeyin. Hızlıca 20 satırlık bir veri oluşturucu kodlayın ve işi onunla halledin.Sonuç
Bu yazıda bir bilimsel yayının gerçeklenmesi için doğru uygulamaları gösterdim. Bunların yalnızca benim kişisel deneyimlerime dayalı olduğunu ve onlara körü körüne ve kelime kelimesine bağlanmamanız gerektiğini unutmayın. Okurken ve kodlarken her zaman dikkatinizi verin ve yukarıdaki önerilerden hangisinin projenize uyacağını belirlemek için muhakemenizi kullanın. Uygulamalardan bazıları projenize yardımcı olacağına zarar verebilir ve bunu bulmak tamamen size kalmış.Şimdi gidin ve birkaç havalı algoritma gerçekleyin!
Code Capsule'de her yeni yazı yayımlandığında bir bildirim e-postası almak için günlüğün sağ üst köşesinde yer alan formu doldurarak bültene abone olabilirsiniz.
Her zamanki gibi bu gönderinin altında da yorumlar açık ve daima sorulardan, düzeltmelerden ve katkılardan mutluluk duyarım!
Kaynaklar
How to Read a Paper (Bir Makale Nasıl Okunur) - Srinivasan KeshavHow to Design a Good API and Why it Matters (İyi Bir UPA Nasıl Tasarlanır ve Bu Neden Önemlidir) - Joshua Bloch
The Mythical Man-Month (Çalışan-Ay Efsanesi) - Frederick Brooks
The 20 / 80 Productivity Rule (80-20 Verimlilik Kuralı) - Emmanuel Goossaert
Google Akademik
Yorumlar
Yorum Gönder
sen de yaz yaz yaz buraya yaz bütün sözlerini