Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 7 - Programlama Dilleri



Öncelikle tebrikler, üçüncü sınıfa geldiniz! Gerçek bilgisayar mühendisliğiyle, zevkli ve zorlayıcı derslerle bu yıl karşılaşacaksınız.

3. Sınıf 1. Dönem 

CS 315 - Programming Languages

Üniversiteye yeni başladığımda oryantasyonda bölüm başkanı bir konuşma yapmıştı. "Biz size programlama dili öğretmeyeceğiz. Biz size öğrenmeyi öğreteceğiz. " Yıllar sonra herhangi bir programlama dilinde ödev verdiklerinde ödevi yaparken dili de öğrenecek hale gelecekmişiz. 

Adam haklı.

Programlama dili diyince akla İngilizce, Çince gibi dil öğrenmek geldiği için bana gelen sık sorulardan biri "Kaç programlama dili öğretiyorlar? Hangileri?". Bu soru edebiyat okuyana "Kaç dil öğretiyorlar? Hangileri?" demekle aynı şey. Neden olduğunu bu derste anlıyoruz.

Aslında programlama dillerinin bir çoğunun işlevi aynıdır, aynı şeyi yaparlar. Fakat aynı şeyi yaparken karşılaşılan sorunları farklı bir şekilde çözerler. Bu derste de programlama dillerinin bu çözümleri nasıl uygulayabileceği örneklerle anlatılır. Yani programlama dilleri değil onların kökü, onların yapılışındaki kalıplar anlatılır ki yeni bir programlama dili çıktığında "Bu bunu nasıl yapmış?" şeklinde sorular sorarak programlama dilini çabucak kapasınız.

Örneğin bu java koduyla merhaba yazmak:

System.out.println ("Merhaba");

python:

print ("Sa")

Java kodundaki System bir class. (Classları birinci yazıda anlatmıştım.) Bunun içinde out diye bir parametre var, bu da aynı zamanda nesne (GidenAraba classında arabanınHızı vardı ya bunun Hız classının nesnesi olduğunu düşünün). Bunun bir de fonksiyonu var println diye. Anca onu çağırınca ekrana bir şeyler basabiliyoruz. Ölme eşşeğim ölme. Python çözmüş işi print() diye.

Java'da satırın bittiğini ; ile gösterirsiniz. Bu sayede aslında tek satıra bir sürü satır yazabilirsiniz. System.out.println("Merhaba");System.out.println("Naber");System.out.println("Anan nasıl");System.out.println("Baban nasıl"); diye. Python'da ; 'e gerek yoktur, Python satırın nerede bittiğini kendi anlar. Fakat eğer yukarıdaki gibi her şeyi bitişik yazarsanız anlayamaz. Dolayısıyla her şeyi bitişik yazamazsınız.

Aynı zamanda java'da kodun nerede başlayıp bittiğini { } ile gösterirsiniz.

Örnek:

if ( a > b )
{
    System.out.println("a b'den büyük");
}

System.out.println("bitti");

Burada { } ile if'in kapsamını yani kodun hangi kısmını koşula bağladığını gösteririz.

Yani bu durumda "a b'den büyük" cümlesi sadece a b'den büyük olduğunda ekrana yazdırılır fakat "bitti" her halükarda yazılır.

Python'da ise bunu yapmak için şunu yazmalısınız:

if ( a > b):
    print("a b 'den büyük")

print("bitti")

Bir fark yok gibi gözüküyor değil mi? Olay şu: her hangi bir programlama dilinde yazarken if'in neyi kapsadığını belirtmekle beraber kod okunaklı olsun diye taba basar veya dört tane boşluk bırakırık. Halbuki java boşlukları zaten sallamaz. Yani şu kod da pekala çalışır javada:

if ( a > b )
{
System.out.println("a b'den büyük");
}
System.out.println("bitti");

Ama bu kod pythonda çalışmaz:

if ( a > b):
print("a b 'den büyük")
print("bitti")

Çünkü python bu dört boşluk olayını kendine entegre etmiştir ve programcıları bunu kullanmaya zorlamaktadır, aynı zamanda kendi de if'in kapsamını anlamakta kullanmaktadır.

Bu dersin içeriğini uzun uzun anlatmak isterdim ama anlatması da anlaması da zor olacak. Kısaca özet geçiyorum o yüzden konuları. Ama iddia ediyorum bilgisayar mühendisliği okursanız en sevdiğiniz ders olacak.

Regular expressionlar

Harfler üzerinde işlem yapacağız diyelim. İşlemimize vereceğimiz bilinmeyen birden fazla a'dan veya a ile b'nin yan yana gelmesinden oluşmak zorunda. Yani a kabul, aa kabul, aaaaaaaaaa kabul, ab kabul. bbbbbbbb kabul değil. e^x kabul değil. Boş da kabul değil.

Tabii bunu olabilecek her a b kombinasyonu için if koyarak kontrol edemeyiz. 
if ( bilinmeyen == "a")
else if (bilinmeyen == "aa") 
olmaz yani.

Bunu aa*|ab olarak gösteririz ve verilen bilinmeyenin bu kalıba uyup uymadığına bakarız. Burada * "sonlu sayıda tekrar" demek yani yanyana sıfır veya sıfırdan fazla a. Başına bir tane a attık çünkü bilinmeyenin boş olmasını da istemiyoruz. | veya demek. Yani ya soldakini seçeceğiz ya sağdakini. ab'yi bitişik yazınca a'nın yanında b her zaman bonus geliyor.

Yani aa*|ab

a
aa
aaa
aaaaaaaaaaaaaaaaaa
ab

olabilir.

aa*|ab'ye regular expression denir.

Context free grammar 
Bu gramerler sayesinde kodun ne anlatmak istediği anlaşılır.

Bir gramer örneği:

ifade -> ifade toplama_işlemi terim | terim
terim -> terim çarpma_işlemi faktör | faktör
faktör -> '-' faktör | '(' ifade ')' | İSİM | SAYI

toplama_işlemi -> '+' | '-'
çarpma_işlemi -> '*' | '/'

Burada olay şu, ifade (bir satır koda yani sonu ; ile biten koda ifade deniyor) -> 'nın sağındaki şeye dönüşüyor, yani ya "ifade toplama_işlemi terim"e ya da sadece terime. terim ->'dan sonrasına, faktör de en sonunda İSİM veya SAYIya dönüşüyor. Bu kalıbı kullanarak bilgisayar kodu okuyor. 

Örneğin

elmasayısı + 5 * 3

Bu bir ifade. Sağdan başlayarak bunu en basit hale indirgiyoruz yani İSİM SAYI + - * /'ya indirgemeye çalışıyoruz.

ifade -> ifade toplama_işlemi terim oldu.

en sağdaki terim 'terim çarpma_işlemi faktör'e indirgendi. Faktörden de SAYI yani 3'e indirgendi.

ifade toplama_işlemi terim çarpma_işlemi 3 var elimizde.

çarpma_işlemi oluyor * (ifade toplama_işlemi terim * 3)

terim oluyor faktör, faktör oluyor 5.

toplama_işlemi oluyor +

son olarak ifade oluyor terim terim oluyor faktör faktör oluyor İSİM yani elmaSayısı

elmasayısı + 5 * 3 ifadesini elde ediyoruz.

Kısacası bilgisayar bu şekilde okuyor kodu. Kod İngilizce'den 010110111'lere bu şekilde çevriliyor.

Not: Niye ifade direkt 5 olmuyor da önce terim sonra faktör sonra 5 oluyor? Bunun nedeni işlem önceliği. Çarpma işlemiyle sadeleşen ifadeyi tanımlamak için faktör demeseydik hepsine aynı ismi verseydik bilgisayar aynı şeyi rastgele olarak farklı yorumlayabilirdi. Grameri bu şekilde oluşturunca muğlaklık gitmiş oldu. Detayları merak edenler için anahtar kelime: unambiguous grammar

Dersin ilk kısmı bu gramerleri yazabilmek veya koda çevirebilmekle geçer.

*

Ardından değişken isimleri ve yukarıda bahsettiğim kapsamlardan bahsedilir. Örneğin elmaSayısı diye bir değişken tanımladım ama bu elmaSayısı ismi nelerde geçerli. Örnek:

if ( bir şeyler) {
    int elmaSayısı = 10;
}

Örneğin bu java kodunda elmaSayısı sadece {} arasında tanımlıdır ve bunun dışında burada tanımladığınız elmaSayısını kullanamazsınız, ama {} dışında bir elmaSayısı varsa o kullanılır, tabii içindeki değer 10 olmayabilir bu durumda. Sıkıcı ve çok teknik olduğu için bu konuyu burada bırakıyorum.

Ardından ilk yazılarda bahsettiğim tiplerden ve bunların dilden dile nasıl değiştiğinden bahsedilir. örneğin java'da elmaSayısını "int elmaSayısı =10;" diye tanımlamanız gerekir ve ardından "elmaSayısı = "naberlen";" diyemezsiniz. Python'da ise elmaSayısı = 10 diye tanımlayıp ardından üzerine istediğinizi yazabilirsiniz. Tabii arkada çalışan işlemler farklıdır. Python eski elmaSayısını silip yerine string tutan bir elmaSayısı değişkeni tanımlar mesela ama çaktırmaz. Java'da bunları elle yapmanız gerekir.

Ardından fonksiyonların nasıl çalıştığından bahsedilir. Fonksiyonlar iç içe geçebilir (ikinci yazıda recursion kısmını hatırlayın) ve bu olay yüzünden farklı dillerde farklı davranabilirler çünkü. Geçtik. Son olarak exceptionlar anlatılır ama o kısmı boşverin.

Sıradaki yazıda görüşmek üzere.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 6 - Matematik ve Uygulamaları


Güncelleme: Lise müfredatından matris ve determinantlar kalktı diyenler oldu. Yazıda determinant yok. Matrisi kısaca açıklayayım, içine sayılar koyduğumuz kutulara matris denir. 3x4 boyutta bir matriste 3 satır 4 sütun bulunur. Birden fazla denklem çözerken bilinmeyenlerin katsayılırını kutulara yazarak çözebilir. İki matris çarpılıyorsa soldaki matrisin sütun sayısıyla sağdakinin satır sayısı eşit olmalı. Yani 2x4 matris ile 4x5 matris çarpılabilir. Oluşan matrisin boyutu 2x5 olur. Bu yazdıklarıma rağmen hala matrisli kısımları anlayamıyorsanız es geçebilirsiniz de, ziyanı yok.

Birinci sınıftaki Calculus dersleri pek önemli olmadığından kısa geçmiştim. Şimdi bilgisayar mühendisliğinin bazı temel taşlarını içeren Linear Algebra ve Probability & Statistics derslerinden ve buradaki matematik konseptlerinin bilgisayar bilimindeki uygulamalarından bahsedeceğim.

2. Sınıf 2. Dönem

Linear Algebra and Differential Equations

Endüstricilerle beraber aldığımız bu ders iki al bir öde şeklinde hazırlanmış. İçinde birbirinden bağımsız iki ders var yani.

Differential Equations: İçinde türev geçen denklemleri yani diferansiyel denklemleri çözmekle alakalı bir derstir. Lisede f(x) = x + 5 ise f'(x) kaçtır diye sorulurken bu derste f(x) = f'(x) + 5 ise f(x) nedir sorusunu sorarsın. Çözüm f(x) = C*e^x + 5 'tir. (C herhangi bir sabit değer) f(x)'in türevini alırsanız (C*e^x) elde ettiğinizi 5 ile toplayınca f(x)'e eşit olduğunu göreceksiniz. Çözüm tekniği ise x'li terimleri bir tarafa sabit değerleri bir tarafa alıp integral almaktan geçer. (Daha fazla bilgi için "separable" yani ayrılabilir diferansiyel denklemleri inceleyin.)

Diferansiyel denklemler çok bir işe yaramamaktadır. Benim karşıma bir daha çıkmadı. O yüzden çok üzerinde durmuyorum.

Linear Algebra: Lineer Cebir lise üçteki matris ve determinantların gelişmişidir. Çok fazla yeni konsept öğrenip kavramak gerektiğinden oldukça sıkıcıdır. Tabii ki daha kendim dinlerken uyuduğum kavramlardan burada bahsederek sizi sıkmayacağım. Dersin bu kısmında öğrendiğim ve sonradan karşıma çıkan iki önemli konsept var, anlatması da kolay, anlatıyorum.

- Denklem sistemleri ve çözümleri
Birden fazla bilinmeyen içeren denklemlere denklem sistemleri denir ve bunları lisede yaptığımız gibi sezgisel olarak çözmesi zordur, hele bilinmeyen sayısı arttıkça. O yüzden bu derste "Gauss İndirgeme Yöntemi" veya "Gauss Jordan Eliminasyonu" denilen yöntem öğretilir. (İngilizcesi Gaussian Elimination veya Gauss Jordan Method) Yöntem basittir; denklemleri al matris olarak yaz, sonra soldan başlayarak her sütundaki sayıların ilki 1 diğeri 0 olacak şekilde denklemleri düzenle.

Örnek:

x + y + z = 10

x + 2y + 2z = 20

x + 2y + 3z = 23

Oluşturalım matrisimizi:

[ 1 1 1 | 10 ]
[ 1 2 2 | 20 ]
[ 1 2 3 | 23 ]

Eşitliğin sağ tarafı da matrisin içinde, orayı | ile ayırdım.

Bu durumda matrisin satırlarını bir şeylerle çarpmak veya satırları birbirinden çıkarmakla lisede denklem çözerken denklemi ikiyle üçle çarpıp üsttekinden çıkarmak aynı şey. (Bu Kimya dersinde de yapılıyor hatta.) Bu durumda ikinci ve üçüncü satırdan ilk satırı çıkarırsak şu olur:

[ 1 1 1 | 10 ]
[ 0 1 1 | 10 ]
[ 0 1 2 | 13 ]

İlk sütun için istediğimizi elde ettik, sayıların ilki 1 diğerleri sıfır oldu. İkinci ve üçüncü sütun için tekrarlayalım, birinci ve üçüncü satırdan ikinci satırı çıkartalım:

[ 1 0 0 | 0 ]
[ 0 1 1 | 10 ]
[ 0 0 1 | 3 ]

Üçüncü sütun kaldı:

[ 1 0 0 | 0 ]
[ 0 1 0 | 7 ]
[ 0 0 1 | 3 ]

Bu durumda aslında şu denklemleri elde etmiş olduk:

1*x + 0*y + 0*z = 0
0*x + 1*y + 0*z = 7
0*x + 0*y + 1*z = 3

Buradan da çok açık olduğu üzere x = 0, y = 7 ve z = 3.

*

Tabii gerçek hayatta denklem sistemleri bu kadar kolay değil. Gerçek problem karşınıza çıkınca her zaman Gauss metoduyla kurtaramıyorsunuz ve başka metodlar da bilmek gerekiyor. Ama bundan daha önemlisi şu ki denklem sistemini kurabilmek.

Gauss'un adı başka yerlerde de geçti ama hakiki denklem sistemi kurduğumuz ders IE 400 yani Principles of Engineering Management oldu, yani bilgisayarcılar için endüstri mühendisliği dersi. Bu derste verilen problemlerden biri:

* Bir şirket A ve B makinelerini kullanarak X ve Y isimli iki ürün üretmektedir. X ürünü A makinesinde 50 dakikada, B makinesinde 30 dakikada üretilir. Y ürünü A makinesinde 24 dakikada, B makinesinde 33 dakikada üretilir.

Haftanın başında elde 30 tane X ve 90 tane Y vardır. A makinesi en fazla 40 saat, B makinesi en fazla 35 saat çalışabilir. Bu hafta X ürününden 75 tane, Y ürününden 95 tane gerekmekte. X ve Y ürünleri toplamı en fazla olacak şekilde denklem sistemi kurun ve bunu çözüp X ve Y'den ne kadar üretileceğini bulun.

Çözüm:

Nasıl çözüleceğini göstermeyeceğim, zaten ben de bilmiyorum :P Denklem sistemini yazayım:






  • 50x + 24y <= 40(60) ( A makinesinin çalışma süresi, dakika cinsinden)
  • 30x + 33y <= 35(60) ( B makinesinin çalışma süresi, dakika cinsinden)
  • x >= 75 - 30 = 45 (Üretilebilecek X stoğu, en az 75 olmalı ama elde 30 tane varmış zaten)
  • y >= 95 - 90 = 5 (Bu da Y stoğu)

  • Görev: Bu fonksiyonu maksimize etmek: (x+30-75) + (y+90-95) yani (x+y-50) yani x + y

    Bu en temel ve kolay örnekti, konumuz endüstri mühendisliği olmadığı için daha zorlarıyla uğraşamayacağım. Şuna bağlayacağım: burada iki bilinmeyenli bir sürü denklem elde ettik ve bunu çözmek için bir algoritmaya ihtiyacımız var. Her ne kadar burada işimize yaramadıysa da Gauss Jordan Eliminasyonu da bunların en basitlerinden biri.

    - Özvektörler

    Literatürde "Eigenvector" diye geçer. Vektör demek sadece satır ve sütundan oluşan matris demektir, kafanız karışmasın. 4x1 matris de vektördür, 1x4 matris de vektördür. 4x4 ise kare matristir.

    Eigenvector kısaca şu: Atıyorum 4x4 bir matrisiniz ve 4x1 bir vektörünüz var. Bu ikisini çarparsanız 4x1 vektör elde ederseniz doğru mu? Aynı şekilde herhangi bir 4x1 vektörü tamsayıyla çarparsanız yine 4x1 vektör elde edersiniz yani liseden bildiğiniz şeyler yine.

    4x4 matrise A
    4x1 vektöre v
    Tamsayıya C

    diyelim.

    A*v = C*v

    denkleminde v'ye A'nın eigenvector'u, C'ye de eigenvalue'su denir. Tahmin edemeyeceğiniz üzere bunu sağlayan az sayıda eigenvalue ve eigenvector vardır.

    Bu derste bunun çözümü falan da anlatılır da boşverin onları şimdi.

    Ne işe yaradığına gelelim.

    Daha önce Makine Öğrenmesi (Machine Learning) hakkında kısa bilgi vermiştim ama kaçıranlar ve tekrar okumak isteyenler için kısaca özetleyeyim. Makine öğrenmesinde bir sürü veri toplayıp o verinin özellikleri arasındaki bağlantıya bakıp yeni veriler üzerinde tahmin yaparsınız. Örneğin kişinin boyu, kilosu ve yağ oranından kaslı gözüküp gözükmemesi üzerine analiz kasıyoruz. Boy 180 kilo 60 yağ oranı %10 atıyorum, bunu bir vektörde gösteriyoruz ve vektörün son elemanı da kaslı için 1 kassız için 0 oluyor yani (180, 60, 10, 1). Çeşitli işlemlerle boyu 190 kilosu 50 yağ oranı 5 olan bir kişinin kaslı gözüküp gözükmediğini tahmin edeceğiz yani (190, 50, 5, x) vektöründe x'i bulacağız. Şimdi bu tahmini yapmak için bir milyon tane veri olduğunu düşünün. Her veri için 4 elemanlı vektör üzerinde işlem yapmamız gerek, kabaca 4 * bir milyon. Fakat sadece iki verimiz olsa işlem sayımız yarıya düşer iki milyon olurdu ve bilgisayar daha az çalışıp daha az ısınırdı. Lâkin ki boy, kilo ve yağ oranı üçü de önemli hangi birini atacağız? Cevap: hiç birini. Bunları aynı matrisin eigenvalue'sunu bulurken yaptığımız gibi tek bir sayıya indirgeyeceğiz. Basit bir mantık yürütürsek: bir insanın 180 cm boyunda 50 kiloda olup da %90 yağ oranına ulaşma imkanı yok. 150 cm boyunda 90 kilogram olup %10 yağ oranına da sahip olamaz değil mi ama? Özetle bu üç sayı arasında bir bağlantı var ve eigenvector ve eigenvaluelar ile bu bağlantıyı kullanıp üç bilinmeyeni tek bir bilinmeyende eritip ona göre işlem yapabiliyoruz yani vektörün boyutunu düşürüyoruz. Buna boyut küçültme yani dimensionality reduction deniyor. 

    Anlaşılmadıysa çok çok daha basit bir örnek vereyim (bu yeni aklıma geldi ama yukarıdakini silmeye üşendim) bir hayvanın aslan mı yarasa mı olduğunu tahmin edeceğiz ve elimizde iki özellik var: hayvanın rengi ve büyüklüğü. Renkler sarı ve siyah, büyüklük büyük ve küçük. Tabii ki bütün sarı ve büyük hayvanlar aslan, siyah ve küçük hayvanlar yarasa. Umarım sarı yarasa yoktur. Bu durumda eigenvektörümüz boyutu küçültüyor ve tek seçeneğimiz "siyah ve küçük" olmak veya "sarı ve büyük" olmak oluyor.

    Bu yaz sıcağında matematik çalışıp eigenvektörün bunu nasıl yaptığını anlatmaya üşendim.

    Probability and Statistics for Engineers

    Bu derste Probability yani Olasılık ve Statistics yani İstatistik olmak üzere iki kısımdan oluşur ve makinecilerle beraber alınır. Makine Öğrenmesinin belkemiğini oluşturur diyebiliriz.

    Bu ders üzerine de anlatılacak çok şey var, zevkli de bir derstir ama ben sadece Naif Bayes nedir onu anlatıp geçeceğim.

    Önce koşullu olasılık nedir onu açıklayayım, koşullu olasılık bir olayın gerçekleşeceği farz edildiğinde diğer olayın olma olasılığıdır. Örneğin bozuk paranın dik gelme olasılığı normalde 0'dır. Fakat bozuk para hileliyse sıfır değildir, bozuk para hileli olduğunda dik gelme ihtimalini bozuk paranın hem hileli olma hem dik gelme ihtimalini bozuk paranın hileli olma ihtimaline bölerek buluruz.

    Yani şu formül:


    Eğer A ve B bağımsız olaysa yani birinin olması diğerini etkilemiyorsa (zarın 6 gelme ihtimaliyle paranın tura gelme ihtimali) P(A kesişim B) = P(A) * P (B) olur P(B)'ler sadeleşir dolayısıyla A ve B bağımsızsa P(A|B) = P(A)'dır.

    P(B)'yi karşıya atarak aynı formülü B olayına uygulayabiliriz. Yani.


    Ortadaki fazlalığı atarsak ismi Bayes teoremi olan şu formülü elde ederiz:


    Gördüğünüz gibi bu formülde koşullu olasılığın içindeki bilinmeyenler yer değiştirdi.

    Şimdi diyelim adamın boyu, kilosu, yağ oranı, göz rengi bilmemnesi X1, X2, X3 diye gidiyor. Kaslı gözüküp gözükmemesi ise Y. Bu durumda adamın özellikleri ışığında kaslı gözüküp gözükmemesi P(Y | X1, X2, X3,....) diye uzayıp giden bir koşullu olasılıkla gösterilir. Bayes teoreminde bunu sol tarafa koyunca sağ tarafa da P(X1, X2, X3.... | Y) gibi bir şey yazarız fakat bunu hesaplamamıza pek imkan yoktur.

    Naive Bayes Y'nin olduğu farzedildiğinde X'lerin bağımsız olduğunu söyler. Adamın göz rengiyle kilosu alakasızdır pekala, adam kaslı olsa da olmasa da. Olaylar bağımsız olduğu için tüm olasılığı hepsini tek tek çarparak buluruz. Yani P(X1, X2, X3.... | Y) = P(X1 | Y) * P(X2 | Y) * P(X3| Y) *..şeklinde bulunur. *... kısmını çarpım işaretiyle gösterebiliriz.

    Bayes teoreminde paydadaki P(B) yani P(X1, X2, X3....) olasılığı adamın kaslı olup olmamasına bağlı olmadığı ve aslen sabit olduğu için ihmal ediliyor. Yani sadece pay hesaba katılıyor.

    Dolayısıyla

    P(Y | X) = P(X1, X2, X3,....|Y) * P(Y) = P(X1 | Y) * P(X2 | Y) * P(X3| Y)*... * P(Y)

    yani

    P ( Kaslı olma ihtimali | adamın kilosu, boyu, rengi) = P( göz rengi | kaslı olma ihtimali) * P (kilosu | kaslı olma ihtimali) * P (kaslı olma ihtimali)

    Atıyorum elimizde 20 tane nefer var. Bunların 8'i kaslı. 20 kişinin 15'i yeşil gözlü. Kaslıların yarısı yeşil gözlü. 10 kişi 80 kilo, 10 kişi 50 kilo. Kaslıların hepsi 80 kilo. Araya 21. bir adam geldi, bu adam 80 kilo ve yeşil gözlü. Bu adamın kaslı olma ihtimalini şöyle hesaplarız.

    P ( Kaslı olma ihtimali | adamın kilosu, boyu, rengi) = bu hesaplayacağımız şey zaten.

    P( göz rengi = yeşil | kaslı olma ihtimali) = kaslıların yarısı yeşil gözlü demiştik di mi? P ( yeşil göz kesişim kas) = 4 / 20. Bunu P( kaslı) yani 8/20'ye böleriz. Oldu sana 1/2. Gerçi kaslıların yarısı yeşil gözlü olduğu için direkt 1/2 de diyebiliriz.

    P( kilo = 80 | kaslı olma ihtimali) = 1 , bütün kaslılar 80 kilo demiştik.

    P (kaslı) = 8 / 20 herhangi bir kişinin kaslı olma ihtimali 0.4

    Yukarıdaki formüle göre bunları çarpıyoruz. 0.5 * 1 * 0.4 = 0.2

    Yani araya katılan bu 21. kişinin kaslı olma ihtimali 0.2. Bu kadar düşük olma ihtimalinin sebebi kaslı kişilerin nispeten az olması ve sadece yarısının yeşil gözlü olması.

    *

    Yazması zor ve sıkıcı bir yazı oldu. Umarım derdimi anlatabilmiştir, bu yazıyı okuyan olursa geri bildirimlerini kesinlikle almak isterim.

    Önümüzdeki yazıda görüşmek üzere.






    Döndüm

    Arkadaşlar dün döndüm. Planladığımdan erken oldu süper kupa maçı yüzünden, maç Üsküp'teydi ve kalacak yer yoktu, sokakta kalacağıma otobüse atlayıp İstanbul'a gideyim dedim.

    Sorularınızı elimden geldiğince cevapladım şimdi. 20 gün sonra İsviçre'ye taşınacağım, o zamana kadar bir şeyler yazmaya çalışırım.

    Arnavutluk'tan Selamlar

    Arkadaslar merhaba gezi biraz uzadi. 8-10 icinde donmus olmayi planliyorum. Tercih donemi elimden geldigince soru cevapladim, yardimci olamadigim varsa affetsin. Geri kalan sorulari donunce cevaplayacagim. Her ne kadar tercih donemi bitmis olsa da bilgisayar muhendisligi yazilarina devam edecegim seneye girecekler faydalansin diye.