top of page

Blog Posts

Writer's pictureHüseyin GÜZEL

Veri Biliminde İlerlemenin Anahtarı: Matematiksel Programlama

Bugün bu makalede bir dart tahtasına rastgele gerçekleştirilen atışları simüle ederek Pi sayısının değerini yaklaşık olarak nasıl hesaplayabileceğimizi göreceğiz. Ve bu, henüz işin başındaki bir veri bilimcisinin özgeçmişine ekleyebileceği önemli bir beceri olan Matematiksel Programlama alışkanlığını geliştirmeye yönelik küçük bir adım…



Peki Matematiksel Programlama nedir? Aslında özünde, matematiksel kavramları, özelliklede bir dizi hesaplamayı sistematik bir şekilde, kodlama alışkanlığı ile oluşturmaktır.


Bu tür bir programlama alışkanlığı, analitik ve veri bilimi alanında hemen hemen her gün çok çeşitli kalıplarla karşılaşması ve bunları anlamlandırması beklenen birinin kariyeri açısından son derece yararlı olacaktır.


Matematiksel programlama yeteneği, genellikle bir veri modeli oluşturmanın ilk adımı olan sayısal analizlerin hızlı bir şekilde prototipleşmesine de yardımcı olur.


 

Birkaç Örnek Problem


Peki, matematiksel programlama ile neyi kastediyoruz?


NumPy ve SciPy gibi çeşitli Python kütüphanelerinde yerleşik ve optimize edilmiş bir çok matematiksel fonksiyon mevcuttur, değil mi?


Evet, ancak bu, çeşitli sayısal hesaplama fonksiyonlarını sıfırdan kodlamanızı ve matematiksel programlama alışkanlığını kazanmanızın önünde bir engel olarak görülmemelidir.


İşte burada matematiksel programlama yeteneğinizi geliştirebileceğiniz rastgele birkaç örnek problem var, bunları çözerek bu yoldaki ilk adımlarınızı atabilirsiniz:

Gördüğünüz gibi, bu tür örnekler son derece ilginç ve gerçek hayatta karşılaşılabileceğiniz senaryolara yakındır. Dolayısıyla bunlar teknik, soyut veya stokastik simülasyonlar için kod yazma yeteneği kazanmanıza da katkıda bulunabilir.


İnternetten bazı matematiksel kavramlara veya hesaplamalara göz atarken, favori programlama dilinizde basit bir kod parçası ile bir kavramı ve hesaplamaları bir an önce oluşturma isteğini içinizde hissediyor musunuz?

Cevabınız: Evetse, tebrikler! Zira bu, matematiksel programlama alışkanlığınız var ve veri bilimi alanında tatmin edici bir şekilde kariyer basamaklarını çıkmak istediğiniz anlamına gelir.


Matematiksel Programlama Veri Bilimi için Neden Önemli Bir Beceridir?


Veri bilimi, pratiksel olarak sayılar ve sayısal analizlerle son derece dostane ve yakın bir ilişkiye ihtiyaç duyar. Ancak bu, karmaşık formül ve denklemlerin ezbere bilmesi gerektiği anlamına da gelmez.


Sayılarla bir takım kalıpları keşfetme ve basit düzeyde kodlar yazarak bunları hızlı bir şekilde test etme becerisi, henüz emekleme aşamasındaki bir veri bilimcisi için çok uzak bir ihtimaldir. Ama mesele bu uzak ihtimali bu yolda ilerleyerek aşmaktır.



Buradaki mesele şu ki, veri bilimi kapsam olarak bir çok farklı bileşenden meydan gelmesine karşılık; veri düzenleme, metin işleme, dosya işleme, veritabanı oluşturma, makine öğrenimi ve istatiksel modellemeler, görselleştirme, sunum vb. gibi sağlam bir matematiksel programlama becerisinden çok da fazlasını gerektirmez.

Matematiksel programlama becerisini geliştirmek için gerekli olan tüm unsurları tam olarak saptamak pek de mümkün değildir, ancak yaygın olanlarak bilinenlerden bazıları şunlardır:

  • Modüler programlama alışkanlığı edinmek,

  • Çeşitli olasılık teknikleri hakkında net bir fikre sahip olmak,

  • Doğrusal cebir, temel matematik ve soyut matematiğin temel konularını okuyabilme ve anlayabilme seviyesine ulaşmak,

  • Temel tanımlayıcı ve çıkarımsal istatistiklere aşina olmak,

  • Süreksiz ve sürekli optimizasyon yöntemleri hakkında temel fikirlere haiz olmak (doğrusal programlama gibi)

  • Veri bilimcilerinin fikirlerini test etmek istediği çekirdek sayısal kütüphaneler ve tercih edilen dildeki fonksiyonlar ile ilgili temel yeterliliğe sahip olmak,

Veri tasarımıyla ilgili olarak hangi temel öğeyi ve tasarım ilkeleriniz temeldeki açıklayan şu makaleyi okuyabilir.


Aslında bu makalede, Monte Carlo yöntemi olarak bilinen, ve bir dart tahtasına rastgele gerçekleştirilen atışları simüle ederek pi sayısının değerinin yaklaşık olarak nasıl hesaplayacağımızı gösteren çok basit bir örnek problemi tartışarak; nasıl matematiksel programlama yapabileceğimizi göreceğiz…


 

Monte Carlo: Bir dart tahtasına (çok miktarda) atış yaparak Pi sayısını hesaplama


Bu, bir dart tahtasına rastgele gerçekleştirilen atışları simüle ederek pi’nin değerini nasıl hesaplayabileceğimizi gösteren eğlenceli bir yöntemdir. Herhangi bir gelişmiş matematiksel analiz veya formül gerektirmez, ancak tamamen fiziksel (ama stokastik) bir sürecin öykünmesiyle pi’nin yaklaşık değerini hesaplamaya yarar.


Bu teknik yöntemin temel konsepti, rastgele bir süreci taklit ederek simüle eden Monte Carlo yönteminin şemsiyesi altında, çok sayıda kez tekrarlandığında, bazı ilgili matematiksel değerlerin birbirine yaklaştırılmasına yönelik bir yaklaşıma yol açmasıdır.</p>


Kare şeklinde bir tahtayı hayal edin.


Ardından, içinde daire şeklindeki bir dart tahtasının tüm kenarlara teget olduğunu varsayın.

Ve sonra, ona dart atışları gerçekleştirdiğinizi düşünün. Tabi rastgele. Bu, bazı atışların dairenin içine, bazılarının da dışına düştüğü anlamına gelir. Ama kare tahtanın dışına hiçbir dartın düşmediğini varsayın.


Dart atışı sürecinin sonunda, atılan toplam dart sayısına karşılık daire içine isabet eden dart kısmını sayın ve bu sayıyı 4 ile çarpın.


Ortaya çıkan bu sayı, pi olmalıdır. Ya da, çok fazla sayıda atış yaptıysanız pi sayısına daha yakın bir sayıdır bu.


 

Bu Yöntemdeki Temel Fikir Nedir?


Buradaki fikir son derece basittir. Çok sayıda dart atışı gerçekleştirdiğinizde, atışların dairenin içine isabet etme olasılığı; sadece dairesel alanının karesel alana olan oranıdır. Temel matematik yardımıyla, bu oranın pi/4 olduğunu çok kolay hesaplanabilirsiniz, ki bu yüzden pi sayısını elde etmek için bu sayıyı 4 ile çarparız.


Buradaki esas olan şey, dairenin (dairenin içine düşen dartların) fraksiyonunu olasılığa eşit hale getirmek için bir çok sayıda dart atışını simüle etmektir, ki bu rastgele bir olayın sadece çok sayıda denenmesinin limitsel hesabını geçerli kılan bir fikirdir.


 

Python Kodu


Python kodunu gösteren bir Jupyter not defteri, Github repomdan alıntılanmıştır burada. Lütfen kopyalamak veya çatallamaktan çekinmeyin.


Adımlar çok basit...


1- İlk adım olarak, bir dartın rastgele atışını simüle etmek amacıyla şunun gibi bir fonksiyon yazın.


def throw_dart():
    """
    Simulates the randon throw of a dart. It can land anywhere in the square (uniformly randomly)
    """
    # Center point
    x,y = 0,0
    # Side of the square
    a = 2
    
    # Random final landing position of the dart between -a/2 and +a/2 around the center point
    position_x = x+a/2*(-1+2*random.random())
    position_y = y+a/2*(-1+2*random.random())
    
    return (position_x,position_y)

2- Ardından ikinci adım olarak, bir dartın iniş koordinatları göz önüne alındığında dairenin içine isabet edip etmediklerini belirlemek için şunun gibi bir fonksiyon yazın,


def is_within_circle(x,y):
    """
    Given the landing coordinate of a dart, determines if it fell inside the circle
    """
    # Side of the square
    a = 2
    
    distance_from_center = sqrt(x**2+y**2)
    
    if distance_from_center < a/2:
        return True
    else:
        return False

3- Son adım olarak da, çok sayıda dart atışını simüle etmek ve kümülatif sonuçtan pi sayısının yaklaşık değerini hesaplayabilmek için şunun gibi bir fonksiyon yazın.


def compute_pi_throwing_dart(n_throws):
    """
    Computes pi by throwing a bunch of darts at the square
    """
    n_throws = n_throws
    count_inside_circle=0
    for i in range(n_throws):
        r1,r2=throw_dart()
        if is_within_circle(r1,r2):
            count_inside_circle+=1
            
    result = 4*(count_inside_circle/n_throws)
    
    return result

Ancak matematiksel programlamamız burada henüz bitmedi. Şimdi yaklaşık değerin ne kadar iyi olduğunu ve rastgele atış sayısı ile nasıl değiştiğini test etmeliyiz. Herhangi bir Monte Carlo deneyinde de olduğu gibi, daha fazla sayıda tekrar ederek yaklaşık değerin daha iyi seviyede olmasını bekleriz.


Bu veri biliminin ve analitiklerin özüdür. Beklenen çıktıyı yazdıran ve sadece bununla sınırlı bir fonksiyon yazmak yeterli değildir. Temel programlama yapılabilir, ancak bilimsel deneyde; hipotezin daha fazla araştırılması gerekir ve test edilmeden de sonuçlandırılamaz.

Şimdi bu denemeyi birkaç kez yapalım ve neler olduğunu görelim.
Pi sayısını artan sayıda rastgele atış ile hesaplamak

Burada, ortalamayı hesaplamak ve daha iyi bir yaklaşık değer elde etmek için çok sayıda rastgele atışın birkaç kez tekrarlanabileceğini gördük.


n = 5000000
sum=0
for i in range(20):
    p=compute_pi_throwing_dart(n)
    sum+=p
    print("Experiment number {} done. Computed value: {}".format(i+1,p))
print("-"*75)
pi_computed = round(sum/20,4)
print("Average value from 20 experiments:",pi_computed)

 

Basit Kodlar, Zengin Fikirler


Bu tekniğin arkasındaki teori ve kodlar son derece basit görünüyor. Ancak, bu gerçekleştirdiğimiz basit egzersizin arkasında, bazı oldukça ilginç fikirler gizli.


Fonksiyonel olarak bu programlamdaki yaklaşım: Tekniğin bir monolit kod bloğu kullanılarak kodlanabilmesiyle açıklanabilir. Bununla birlikte, burada görevlerin gerçek insan eylemlerini taklit eden basit fonksiyonlara nasıl bölünmesi gerektiğini görüyoruz.

  • dart atmak,

  • dartın iniş koordinatını incelemek ve dairenin içine isabet edip etmediğini belirlemek,

  • ve bu fonksiyonu keyfi olarak tekrarlamak

Büyük programlar için yüksek kaliteli kod yazmak açısından bu tür modüler programlama stilini kullanmak, öğretici ve çok faydalı olabilir.


Bu programlama stilinde, ortaya çıkan esas davranış modeli: Bu kodun hiçbir yerinde pi veya bir dairenin özelliklerini içeren herhangi bir formül kullanılmamış olmasıdır. Bir şekilde burada, pi’nin değeri; bir tahtaya rastgele bir grup dart atmak ve bir olasılık kesirini hesaplayabilmek için yapılan toplu eylemin sonucunu bulmaktır. Bu, matematiksel bir paternin karşılıklı etkileşimleri yoluyla benzer türde çok sayıda tekrarlanan deneyden ortaya çıktığını gösteren davranışlara bir örnektir.


Olasılığın tanımı: Olasılık tanımının iki geniş kategorisi ve iki şiddetli rakibi vardır: Frekansçılar ve Bayesciler. Bir frekansçı gibi düşünmek ve olasılığı bir olayın sıklığı (toplam rastgele deneme sayısının bir parçası olarak) tanımlamak kolaydır. Buradaki kodlama çalışmasında, bu özel olasılık kavramının rastgele denemelerin çok sayıda tekrarlanmasından nasıl ortaya çıktığını gördük.


Stokastik simülasyon: Dart atmanın temel fonksiyonunun merkezinde, bir tür rastgele jeneratör fonksiyonu kullanıldı. Şimdi, bilgisayar tarafından üretilen rastgele bir sayı, aslında rastgele değildir, ancak tüm pratik amaçlar için, böyle olduğu varsayılabilir. Bu programlama çalışmasında, Python’un rasgele (random) modülünden tek tip rasgele bir jeneratör fonksiyonu kullanıldı. Bu tür bir rasgeleleştirme yönteminin kullanımı, veri bilimi pratiğinde kullanılan güçlü bir yöntem olan stokastik simülasyonun kalbidir.


Tekrarlanan simülasyonlar ve görselleştirme ile fikri test etme: Genellikle, veri biliminde, çok sayıda simülasyon / deney temelinde test edilmesi gereken stokastik süreçler ve olasılık modelleri ile ilgileniriz. Bu nedenle, bu asimtotik terimlerle düşünmek ve veri modelinin ya da bilimsel fikrin geçerliliğini istatistiksel olarak sağlam bir şekilde test etmek zorunludur.


Özetle;


Burada matematiksel programlama alışkanlığını geliştirmenin ne anlama geldiğini gördük. Esasen, zihninizde geliştirdiğiniz matematiksel kavramları veya veri modellerini test etmeyi programlama alışkanlığı açısından değerlendirdik. Ve gördük ki, bu basit alışkanlık, henüz yolun başında olan bir veri bilimcisi için iyi seviyredeki uygulamaların geliştirilmesine yardımcı olabilir.

Basit geometriksel tanımlamalar, stokastik simülasyon kavramları ve sıklık (frekansçı) olasılığının tanımı kullanılarak, pi sayısının nasıl hesaplanabileceğinin bir örnek çözümünü analiz ettik.


Eğer daha zorunu arıyorsanız, rastgele bir yürüyüş eylemini simüle ederek pi sayısını hesaplayabilir misiniz?


Commentaires

Noté 0 étoile sur 5.
Pas encore de note

Ajouter une note
  • Beyaz LinkedIn Simge
  • Beyaz Facebook Simge
  • Beyaz Heyecan Simge

BU İÇERİĞE EMOJİ İLE TEPKİ VER

bottom of page