Yapay Zeka (Artificial Intelligence)

Yapay Zekanın Bileşenleri ve Yöntemleri


YAPAY ZEKA NEDİR?

Bu bölümün başlangıcında önce, yapay zekanın tanımını yapacağız ve yapay zekanın ne anlam ifade ettiği, hangi konu ve prensipleri kapsadığı konusunda bir fikrimiz olacak. Yapay Zeka (Artificial Intelligence) bu konuyu ilk başlatan kişi olan John McCarthy'ye göre şöyle tanımlanabilir: "Yapay zeka bilgisayarlara, bilgisayar kontrollü robotlara ya da bir yazılıma akıllı olarak düşünme yeteneği sağlayan bir yol ya da yöntemdir. Burada amaç akıllı insanların düşünerek yapabildiklerini makinelere ya da yazılıma da yaptırmaktır."

Yapay zekayı oluşturmak için bazı gözlem ve bilgilere ihtiyaç vardır. Bunlar şöyle açıklanabilir:

  1. I. İnsan beyninin çalışma mekanizması ve nasıl düşündüğü
  2. II. İnsanların nasıl öğrendiği ve nasıl karar verdiği
  3. III. Problem çözme teknikleri

Bu tür çalışmalar sonucunda elde edilecek model ve metotlardan faydalanılarak yapay zekayı fiilen devreye sokacak yazılım ve sistemler geliştirilir.

YAPAY ZEKA HER ŞEYİ ÇÖZEBİLİR Mİ?

Bu noktada herkesin aklına tartışmasız bir biçimde şu soru gelir:
"Bir makina bir insanın yapabildiği biçimde düşünebilir ve davranabilir mi?"

Burada hemen aklımıza 1950 yılında ünlü matematikçi ve bilgisayar bilimcisi Alan Turing’in Mind dergisinde yayınlanan makalesinde ortaya koyduğu test geliyor. Bu testin çeşitli versiyonları olmasına rağmen basitçe aşağıdaki gibi ifade edilebilir:

Bir takım soruları bir insana ve bir bilgisayara soralım; aldığımız cevapların hangisinin bilgisayar hangisinin insan tarafından verildiği ayırt edilemiyorsa, bu durumda bu bilgisayarın insanın düşünme yeteneğine eriştiğini söyleyebiliriz.

Piyasada bazı yapay zeka yazılımları (Örneğin Eugene Goostman chatbot ve Cleverbot) Turing testini geçtiğini ( http://www.cleverbot.com/human ) iddia etmesine rağmen bu iddialar tam olarak kabul görmüş değiller. Yani, şu anda aynen insan gibi düşünme yeteneğinde yapay zeka ürünlerinin devrede olduğunu tam söyleyemiyoruz, ancak bu konudaki çalışmalar çok hızlı bir biçimde ilerlemektedir.

YAPAY ZEKANIN BAŞLICA AMACI NEDİR?

Yapay zeka biliminin en önemli iki amacı aşağıdaki biçimde belirtilebilir:

  1. I. Uzman sistemler (expert systems) oluşturmak. Burada uzman sistemden anlaşılan şudur: Belli bir konuda bir insan uzman nasıl davranıyorsa o konuda aynı biçimde davranacak bir bilgisayar sistemidir. Örneğin bir tıp doktoru bir hastanın bulgularında hangi teşhisi koyuyorsa o bulgularla aynı teşhisi koyacak bilgisayar sistemi, bir tıbbi uzman sistemdir. Bu tür sistemler akıllı davranışlar sergilerler ve öğrenme yeteneğine sahiptirler. Ayrıca açıklamalar yaparlar ve kullanıcılarını yönlendirirler.

  2. II. İnsan aklını makinelerde gerçekleştirmek. Burada amaç anlayan , düşünen ve öğrenen, kısaca insan gibi davranan sistemler oluşturmaktır.

YAPAY ZEKA HANGİ BİLİM DALLARI TARAFINDAN DESTEKLENİR?

Bilgisayar bilimi, biyoloji, psikoloji, sosyoloji, felsefe, dilbilimi, matematik, nöron bilimi ve mühendislik yapay zekanın gelişimini destekleyen bilim dallarıdır. Bu alanların her birinin yapay zeka konusuna önemli katkıları vardır. Özellikle karar verme, öğrenme ve problem çözümü ile ilişkili bilgisayar fonksiyonlarının geliştirilmesi yapay zeka alanına önemli bir alt yapı sağlamaktadır.

YAPAY ZEKA ALANINI OLUŞTURAN ALT ALANLAR HANGİLERİDİR?

Yapay Zekanın kapsamı geniştir, ancak aşağıda listelenen alt alanların her biri yapay zeka alanının önemli parçalarıdır:

  1. I. Uzman Sistemler (Expert Systems)
  2. II. Doğal Dil İşleme (Natural Language Processing)
  3. III. Bulanık Mantık (Fuzzy Logic)
  4. IV. Robot Bilimi (Robotics)
  5. V. Yapay Sinir Ağları (Artificial Neural Networks)

Makine öğrenmesi ve derin öğrenme de yapay zekanın alt bileşenleridir ve önümüzdeki bölümlerde bu konularla ilgili ayrıntılı bilgiler vereceğiz.

GÜNLÜK YAŞAMDA YAPAY ZEKA UYGULAMALARI

Yapay zeka uygulamaları artık bir hayal ürünü değildir ve gerçek hayatta gittikçe artan uygulama alanlarına sahip olmaktadır.

En çok kullanıldığı uygulama alanları:

  1. I. Doğal dil işleme
  2. II. Ses tanıma
  3. III. Görüntü tanıma ve görüntü analizi
  4. IV. Talep tahminleri gerçekleştirme
  5. V. Sanal temsilciler, chatbot teknolojisi
  6. VI. Makine öğrenmesi uygulamaları
  7. VII. Karar yönetimi
  8. VIII. Derin Öğrenme
  9. IX. Robot otomasyonu ve yönetimi gibi konulardır.

MAKİNE ÖĞRENMESİ

MAKİNELER NASIL ÖĞRENİR?

Makine Öğrenmesi'ni (Machine Learning), yapay zekanın (artificial intelligence) bir biçimi olarak görebiliriz. Bir bilgisayar bilimcisine “makine öğrenmesi nedir?” şeklinde bir soru yöneltirseniz alacağınız cevap büyük olasılıkla çok teknik olacaktır ve algoritmalar, örüntüler (patterns), denetimli ve denetimsiz öğrenme gibi bir çok kavramı içerecektir.

Oysa basit bir tanım şöyle olabilir: "Makine kendisine verilen çok sayıdaki veri örüntüsünden belli bir tanesini tanıdığı zaman" öğrenmiş demektir. Mesela yüzlerce ya da binlerce insan resmini makineye verip her birini insan olarak etiketlerseniz ve buradan hareketle, makine yeni gelen bir resmin “insan” olduğunu kendisi tespit ederse öğrenmiş demektir. Öğrenme aşamasında ne kadar çok öğretici resim girilirse makine o kadar hızlı öğrenecektir.

Elbette, bu öğrenmenin arkasında bazı algoritmalar kullanılır. Bunlara yapay sinir ağları, destek vektör makineleri ve diğerleri örnek verilebilir. Öte yandan bilgisayarlar tamamen analitik makinelerdir ve çok hızlı işlem yaparlar. Yüzlerce veri bilimcinin bir yılda yapacağı işlemleri bir iki dakika içinde yapma yeteneğine sahiptirler.

Makine Öğrenmesi (Machine Learning) terimi aslında pek de yeni değildir. Bu terim ilk kez 1959 yılında Arthur Samuel tarafından tanımlanmıştır. Ancak teknoloji henüz yeteri kadar gelişmediği ve o zamanki hesaplama gücü büyük miktarda veriyi makul hızda işlemeye müsait olmadığı için bu terim pek yaygınlaşamadı. Oysa günümüzde hem bilgisayarların depolama kapasitelerinin hem de hızlarının çok artması ile "Makine Öğrenmesi" çağı başlamış oldu.

Bugün yapay zeka uygulamaları günlük hayatın rutin bir parçası olmuştur. Örneğin, bankacılıkta kredi kartları işlemleri ya da diğer işlemlerin normal dışı (fraud) olup olmadığının tespiti bir yapay zeka uygulamasıdır. Yine online soru - cevap sistemleri de yapay zeka uygulamaları arasındadır. Yapay zeka, ayrıca arama motorlarında (search engines) ya da tavsiye motorlarında da (recommendation engine) kullanılmaktadır.

MAKİNE ÖĞRENMESİ (MACHINE LEARNING)

Makine öğrenmesi oldukça ilginç bir konudur ve gittikçe önem kazanmaktadır.

Makine öğrenmesi en basit anlamı ile bir veriden bilgi ya da anlam çıkarma işlemini gerçekleştiren bir alandır. Bu sayede mevcut bir veriyi kullanarak geleceğe yönelik bir tahmin modeli geliştirebilir ya da mevcut bir veriyi belirli kriterlere göre farklı sınıflara ya da gruplara ayırabilir.

Makine öğrenmesi; örüntü tanıma ya da iz tanıma (pattern recognition) konularıyla, hesaplamalı istatistik (computational statistics) ve yapay zeka (artificial intelligence) gibi alanlarla yakından ilgilidir.

Aslında makine öğrenmesi makineleri (bilgisayarlar ve yazılımlar) kullanarak bir veriden anlam elde etme amacındadır. Ayrıca makine öğrenmesi ile makinelere, bulunduğu çevreden bir şeyler öğrenme yeteneğini vermek amaçlanır.

MAKİNE ÖĞRENMESİNİN ELEMANLARI

  1. I. VERİ

    Yukarıda makine öğrenmesinin mevcut bir veriden bilgi ve anlam çıkarmak olduğunu söylemiştik. Bu bağlamda, makine öğrenmesinde veri çok önemli bir bileşendir.

    Bütün öğrenme yöntemleri veri tarafından yönlendirilir. Veri kümesi, sistemi eğitmek için kullanılır. Kontrol sistemleri sensörler yardımıyla veriyi toplar. Toplanan veriler sistemin eğitimi ya da parametrelerinin belirlenmesi için kullanılabilir.

  2. II. MODELLER (MODELS)

    Öğrenme işlemlerinde genellikle bazı modeller kullanılır. Bir model, genel olarak öğrenme işlemi için matematiksel bir çatı oluşturur. Modeller genellikle insan uzmanlar tarafından geliştirilir ve onların deneyim ve uzmanlıklarına dayalıdır.

    Ancak bazı makine öğrenmesi biçimleri insan tarafından türetilen modelleri araya sokmadan kendi modellerini geliştirir.

  3. III. EĞİTİM (TRAINING)

    Bir sisteme belirli bir veri kümesi giriş olarak verilirse ve bununla ilişkili çıkışlar belirlenirse, bu sistem yapısını ve parametrelerini değiştirerek söz konusu eşlemeyi öğrenebilir. Başarı ile öğrenmiş bir sistem yeni bir veri giriş kümesi verildiği takdirde çıkış kümesinin ne olacağını öğrenerek belirlediği yapı ya da parametrelere göre hatasız olarak ya da kabul edilebilir bir hata ile söyleyebilir. Bu işlem eğri uydurma (curve fitting) ya da regresyon (regression) işlemlerine benzemektedir.

    Örneğin, giriş kümesi olarak insan yüzleri verilse ve bunların “insan yüzü” olduğu belirtilse, sistem parametrelerini buna göre ayarlayacaktır. Daha sonra yeni bir insan yüzü verildiğinde önceden belirlediği parametre değerlerine göre verilen girişin insan yüzü olduğunu tanıyacaktır.

  4. IV. DENETİMLİ ÖĞRENME (SUPERVISED LEARNING)

    Denetimli öğrenme formel olarak şu şekilde anlatılabilir; X ile göstereceğimiz bir giriş verileri kümesi ile bunlara karşı gelen Y değerleri elimizde mevcuttur. Ayrıca, X ile Y arasında nasıl bir

    Y = F (X)

    ilişkisi bulunduğunu da X ve Y veri kümelerinden faydalanarak bir öğrenme algoritması ile belirleyebiliriz. Bu durumda yeni bir X değeri geldiği zaman Y’nin ne olacağını Y = F (X) bağıntısı ile kestirebiliriz. Buradaki öğrenme denetimli öğrenmedir, çünkü X ve Y değerleri arasındaki ilişkiyi öğrenmenin algoritma süreci, öğrenmeyi “denetleyen” bir öğretmen gibi görülebilir.

    Öğrenme algoritması kabul edilebilir bir performans düzeyine erişilince sona erecektir. Denetimli öğrenme problemleri iki büyük gruba ayrılır:

    1. 1. SINIFLANDIRMA (CLASSIFICATION)

      Sınıflandırma problemlerinde verinin bir bölümü sınıfları belirlemek için eğitilir. Yeni gelen bir verinin bu sınıflardan hangisine ait olduğuna karar verilir. Eğer "hasta" ve "hasta değil" gibi iki sınıf mevcutsa gelen veri için çıkış bilgisi ya “hasta” ya da “hasta değil” şeklinde olacaktır.
      Sınıflandırma için popüler algoritmalar,

      1. a. Destek Vektör Makinesi (Support Vector Machine-SVM)
      2. b. Naive Bayes Algoritması
      3. c. Karar Ağaçları (Decision trees)

    2. 2. REGRESYON (REGRESSION)

      Regresyon probleminde ise eldeki mevcut veriye göre öğrenme algoritması sonucu belirlenen model kullanılarak, yeni gelen verinin çıkış değeri “sayısal” olarak belirlenir. Lineer Regresyon ve Çok Değişkenli Lineer Regresyon en çok kullanılan algoritmalardır.

      Bütün bu algoritmalar ilgili bölümlerde ayrıntılı bir biçimde incelenecektir.

  5. V. DENETİMSİZ ÖĞRENME (UNSUPERVISED LEARNING)

    Denetimsiz öğrenmede elimizde X giriş verileri kümesi mevcuttur, fakat bunlara karşı gelen Y değerleri mevcut değildir.

    Denetimsiz öğrenmede amaç veriyi mevcut yapı içinde modelleyerek mümkünse veri hakkında daha fazla “bilgi” öğrenmektir. Burada denetimsiz bir öğrenme söz konusudur, çünkü elimizde ne “doğru cevaplar” ne de “bunları denetleyecek öğretmen” vardır.

    Denetimsiz öğrenme problemleri iki büyük gruba ayrılır:

    1. 1. KÜMELEME (CLUSTERING)

      Kümeleme işleminde verinin özelliklerine göre içindeki “gizli gruplar” ortaya çıkarılabilir. Örneğin, bir kredi kartı harcama miktarları verisinden “az harcayan”, “orta düzeyde harcayan” ve “çok harcayan” gibi sınıflar elde edilebilir.

      Burada kullanılabilecek çok sayıda kümeleme algoritması mevcuttur. En popüler olanları k - means ve k - medoid algoritmalarıdır ve bunlar ilgili bölümlerde detaylıca anlatılacaktır.

    2. 2. İLİŞKİLENDİRME (ASSOCIATION)

      Veri içerisindeki ilişkilerden kural çıkarılmaya çalışılır. Örneğin, A ve B ürünlerini alan kişi mutlaka C ürününü de almışsa bu önemli bir bilgidir. En çok kullanılan algoritma “Apriori algorithm for association rule learning” yani ilişki kuralı öğrenmesi için a priori algoritmasıdır.

  6. VI. YARI DENETİMLİ (SEMI-SUPERVISED) ÖĞRENME

    Bazı problemlerde giriş verisi X çok büyüktür ve bu verinin tümüne karşı gelen bir Y çıkış değişeni mevcut değildir. Y değerlerinden elimizde sınırlı bir miktarda bulunmaktadır. Bu tür problemler “yarı denetimli öğrenme problemleri” adını alır. Bunlar “denetimli” ve “denetimsiz” öğrenme problemlerinin arasında bir yerde durmaktadır.

    Bu konu için en iyi örneklerden biri fotoğraf arşivleridir. Bu tür arşivlerde verinin çok azı etiketlenmiştir; yani bazı fotoğraflarının kime ait olduğu bilinir. Bu tür veri üzerinde etiketsiz olanlarda kümeleme algoritmaları ile özellikli çeşitli gruplar çıkarılabilir; etiketli kısmına ise denetimli öğrenme algoritmaları uygulanabilir.

  7. VII. BİRLİKTE ÖĞRENME (ENSEMBLE LEARNING)

    Son yıllarda çok popüler olmaya başlayan bir yöntemdir. Belli bir problemin çözümü için "farklı algoritmalar" yarıştırılır. Problemin çözümü genellikle bu temel algoritmaların sonuçlarının birleştirilmesi ile elde edilir.

    Örneğin bir regresyon probleminde A1, A2, A3 algoritmaları S1, S2 ve S3 gibi sonuçlar vermişse, çözüm S = (S1 + S2 + S3) / 3 şeklinde aritmetik ortalama ile bulunabileceği gibi başka pek çok çeşit birleştirme yöntemleri de kullanılabilir.

MAKİNE ÖĞRENMESİNDE R DİLİ

Bu bölümde R ortamında yüklü olan ve makine öğrenmesi konusunda çok kullanılan İris veri kümesini tanıtacağız.

İris veri kümesi bir çok araştırmada sınıflandırma algoritmalarını test etmek için kullanılmıştır. İris çiçeklerinin 3 farklı sınıfından ve 50’şer örnekten oluşur. Veri kümesinde 5 özellik (attribute) mevcuttur:

Sepal (Çanak yaprak) uzunluğu (cm)
Sepal (Çanak yaprak) genişliği (cm)
Petal (Taç yaprak) uzunluğu (cm)
Petal (Taç yaprak) genişliği (cm)
Sınıf (Class):
   1. Iris Setosa    2. Iris Versicolour    3. Iris Virginica

Şekil I_1: İris veri kümesindeki 3 sınıf

Şekil I_1: İris veri kümesindeki 3 sınıf

Komut satırında iris yazıp veriyi listelesek 150 satırlık verinin tümü gelecektir:

                
>iris
……
146          6.7         3.0          5.2         2.3  virginica
147          6.3         2.5          5.0         1.9  virginica
148          6.5         3.0          5.2         2.0  virginica
149          6.2         3.4          5.4         2.3  virginica
150          5.9         3.0          5.1         1.8  virginica
>
                
              

Bunun yerine head komutunu kullanarak ilk 6 satırı listeleyebiliriz:

                
> head(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width     Species
1          5.1            3.5             1.4             0.2     setosa
2          4.9            3.0             1.4             0.2     setosa
3          4.7            3.2             1.3             0.2     setosa
4          4.6            3.1             1.5             0.2     setosa
5          5.0            3.6             1.4             0.2     setosa
6          5.4            3.9             1.7             0.4     setosa
                
              

iris verisini çalışma alanına yükleyerek listelemek içinse aşağıdaki programı çalıştırmalıyız:

                
#iris verisini oku
iris <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), header = FALSE) 

names(iris) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")

head(iris)
                
              

Böylece aşağıdaki çıktıyı elde ederiz:

                
> head(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width     Species
1          5.1            3.5             1.4             0.2     Iris-setosa
2          4.9            3.0             1.4             0.2     Iris-setosa
3          4.7            3.2             1.3             0.2     Iris-setosa
4          4.6            3.1             1.5             0.2     Iris-setosa
5          5.0            3.6             1.4             0.2     Iris-setosa
6          5.4            3.9             1.7             0.4     Iris-setosa
                
              

VERİ ÜZERİNDE ARAŞTIRMA (DATA EXPLORATION)

Üzerinde işlem yapılacak verinin genel karakterini anlayabilmek için verinin bazı parametrelerine ve görselliğine göz atmak zorunludur. Aşağıda iris verisi için bu işlemlerin nasıl yapılacağını R ortamında göstereceğiz.

  1. 1. IRIS VERİSİNİN BOYUTUNU GÖRÜNTÜLEME
                            
    > dim(iris)
    [1] 150   5
    >
                            
                          

    Böylece 150 adet veri kalemi ve 5 adet özellik (attribute) olduğu tespit edilmiştir.

  2. 2. IRIS VERİSİNDEKİ DEĞİŞKEN YA DA ÖZELLİK (ATTRIBUTE) İSİMLERİ
                            
    > names(iris)
    [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
    >
                            
                          

  3. 3. İRİS VERİSİNİN YAPISI
    İris verisinin yapısını görüntülemek içinse str fonksiyonu kullanılır:
                            
    > names(iris)
    [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
    > str(iris)
    'data.frame': 150 obs. of  5 variables:
     $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
     $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
     $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
     $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
     $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    >
                            
                          

  4. 4. ATTRIBUTES FONKSİYONU
    Yukarıda names fonksiyonu ile gerçekleştirilen değişken ya da özellik listeleme işlemi attributes fonksiyonu ile de gerçekleştirilebilir:
                            
    > attributes(iris)
    $names
    [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
    
    $row.names
    [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32
    [33]  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64
    [65]  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
    [97]  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
    [129] 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
    
    $class
    [1] "data.frame"
                            
                          

    Ancak bu kez veri de listelenecektir.

  5. 5. BELLİ BİR ATTRIBUTE’ÜN VERİLEN SAYIDA ÖRNEĞİNİ LİSTELEMEK
    Petal.length özelliğine ait ilk 5 değeri listelemek için aşağıdaki fonksiyon yazılır:
                            
    > iris[1:5, "Petal.Length"]
    [1] 1.4 1.4 1.3 1.5 1.4
    >
                            
                          

    Aynı bilgiyi elde etmenin bir başka yolu ise aşağıdaki gibi olabilir:
                            
    > iris$Petal.Length[1:5]
    [1] 1.4 1.4 1.3 1.5 1.4
    > 
                            
                          

  6. 6. HER ÖZELLİK İLE İLİŞKİLİ TEMEL İSTATİSTİKSEL BİLGİLER
    Summary fonksiyonu yardımı ile her özellik ile ilişkili ortalama, standart sapma gibi temel istatistiksel bilgileri elde etmek imkanı mevcuttur:
                            
    > summary(iris)
    Sepal.Length   Sepal.Width    Petal.Length   Petal.Width        Species  
     Min.   :4.30   Min.   :2.00   Min.   :1.00   Min.   :0.1   setosa    :50  
     1st Qu.:5.10   1st Qu.:2.80   1st Qu.:1.60   1st Qu.:0.3   versicolor:50  
     Median :5.80   Median :3.00   Median :4.35   Median :1.3   virginica :50  
     Mean   :5.84   Mean   :3.06   Mean   :3.76   Mean   :1.2                  
     3rd Qu.:6.40   3rd Qu.:3.30   3rd Qu.:5.10   3rd Qu.:1.8                  
     Max.   :7.90   Max.   :4.40   Max.   :6.90   Max.   :2.5                  
    > 
    >
                            
                          

  7. 7. FREKANS DAĞILIMI
    Her özelliğe göre frekans dağılımlarını bulmak için table fonksiyonundan faydalanılır:
                            
    > table(iris$Species)
        setosa versicolor  virginica 
            50         50         50 
    >
                            
                          

    FREKANS DAĞILIMINI DAİRE GRAFİĞİ İLE GÖSTERMEK

                            
    > summary(iris) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
    Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50  
    1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50  
    Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50  
    Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199  
    3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800  
    Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500  
    > pie(table(iris$Species)) 
                            
                          

    Şekil Frekans 1
  8. 8. VARYANS HESABI
    Var fonksiyonu yardımı ile gerçekleştirilir:
                            
    > var(iris$Petal.Length)
    [1] 3.1163
    >
                            
                          

  9. 9. İKİ DEĞİŞKEN ARASINDA KOVARYANS (COVARIANCE) HESABI
                            
    > cov(iris$Sepal.Length, iris$Petal.Length)
    [1] 1.2743
    >
                            
                          

  10. 10. İKİ DEĞİŞKEN ARASINDA KORELASYON HESABI
                            
    > cor(iris$Sepal.Length, iris$Petal.Length)
    [1] 0.87175
    >
                            
                          

  11. 11. HİSTOGRAM ÇİZİMİ
                            
    > hist(iris$Sepal.Length)
    >
                            
                          

    Şekil Frekans 2
  12. 12. YOĞUNLUK (DENSITY) FONKSİYONU
                            
    > plot(density(iris$Sepal.Length))
    >
                            
                          

    Şekil Frekans 3
  13. 13. İKİ DEĞİŞKENE GÖRE SERPME (SCATTER) GRAFİK
                            
    >plot(iris$Sepal.Length, iris$Sepal.Width)
                            
                          

    Şekil Frekans 4
  14. 14. EŞLEME(PAIR) GRAFİĞİ
                            
    plot(iris)
    >                        
                          

    Şekil Frekans 5

    Aynı grafiği çizdirmenin alternatif yolu ise aşağıda verilmiştir:
                            
    pairs(iris)
    >
                        
                          

MAKİNE ÖĞRENMESİNİN ADIMLARI

Makine öğrenmesi adımlarını şu şekilde sıralayabiliriz:

  1. I. Verinin elde edilmesi
  2. II. Veri hakkında bilgi toplanması ve verinin temel özelliklerinin anlaşılması
  3. III. Verinin yapısını anladıktan sonra “veriden neler elde edilebileceğine” ya da “verinin bize neler öğretebileceğine” karar verilmesi
  4. IV. Çalışma alanının (workspace) hazırlanması: Bu adım çok önemlidir. Makine öğrenmesinde kullanılacak olan algoritmaların tümü R’da hazır olarak mevcut değildir. Hangi algoritmaların kullanılacağına karar verildikten sonra bunlarla ilişkili paketlerin yüklenmesi gerekir.
  5. V. Verinin makine öğrenmesi algoritmaları için hazırlanması: Burada iki önemli işlem söz konusudur:
    1. a. Verinin normalize edilmesi
    2. b. Veri kümesinin
      1. i. Eğitim kümesi
      2. ii. Test kümesi
    olarak iki parçaya ayrılması gerekir.
  6. VI. Kullanılacak gerçek makine öğrenmesi algoritmasının seçimi: Bu algoritma bir sınıflandırma işlemi için,
    1. a. kNN classifier(sınıflandırıcı)
    2. b. Karar Destek Makinesi (SVM - Support Vector Machine)
    3. c. Karar ağacı (Decision tree)
    olabilir.
  7. VII. Algoritmanın uygulanması ve sonuçların performansının değerlendirilmesi
Şimdi bu adımları R ortamında nasıl gerçekleştireceğimize bakalım:

I. VERİNİN ELDE EDİLMESİ

Bu örnekte iris verisini kullanacağız. Çalışma alanımıza (workspace) bu verinin nasıl indirileceğini biliyoruz:

                        
#iris verisini oku
iris <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), header = FALSE) 
names(iris) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")
head(iris)
                    
                  

Sonuçta çalışma alanında aşağıdaki veri olacaktır:

                        
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width     Species
1          5.1         3.5          1.4         0.2 Iris-setosa
2          4.9         3.0          1.4         0.2 Iris-setosa
3          4.7         3.2          1.3         0.2 Iris-setosa
4          4.6         3.1          1.5         0.2 Iris-setosa
5          5.0         3.6          1.4         0.2 Iris-setosa
6          5.4         3.9          1.7         0.4 Iris-setosa
                    
                  

II. VERİ HAKKINDA BİLGİ TOPLAMA VE VERİNİN TEMEL ÖZELLİKLERİ

Bu aşamada veri hakkında bir fikir elde edebilmek için grafikler, histogramlar ya da kutu grafikleri (boxplot) çizdirilebilir. Aşağıdaki kodu çalıştıralım:

                        
install.packages("ggvis")
library("ggvis")
iris %>% ggvis(~Sepal.Length, ~Sepal.Width, fill = ~Species) %>% layer_points()
                    
                  

Bu durumda verinin genel yapısını gösteren Şekil I_2’deki grafiği elde edeceksiniz.

Şekil I_2: Sepal length-sepal width grafiği

Şekil I_2: Sepal length-sepal width grafiği

Aynı şekilde petal length-petal width grafiğini de çizebiliriz:

                        
iris %>% ggvis(~Petal.Length, ~Petal.Width, fill = ~Species) %>% layer_points()
                    
                  

Aşağıdaki grafik elde edilecektir(Şekil I_3)

Şekil I_3: Petal length-Petal width grafiği

Şekil I_3: Petal length-Petal width grafiği

Yukarıdaki grafiklerin incelenmesi ile veri hakkında aşağıdaki yorumları yapabiliriz:

Şekil I_2’deki grafikte Setosa verisi için Sepal Length ile Sepal Width arasında kuvvetli bir pozitif korelasyon vardır; yani biri artarken diğeri de kuvvetle ve aynı yönde artmaktadır. Oysa bu ilişki diğer iki sınıfta bu kuvvette değildir. Şekil I_3’teki grafikte ise Petal length ile Petal width arasında kuvvetli bir pozitif korelasyon sezilmektedir.

Bu yorumlar için yukarıda belirtilen ilişkinin matematiksel hesaplamalarla kanıtı gerekir. Petal.length ve Petal.width arasındaki korelasyonu her üç sınıf için de görebilmek için aşağıdaki kodu çalıştıralım:

                        
cor(iris$Petal.Length, iris$Petal.Width)
x=levels(iris$Species)
# setosa korelasyon matrisi
print(x[1])
cor(iris[iris$Species==x[1],1:4])
#Versicolor korelasyon matrisi
print(x[2])
cor(iris[iris$Species==x[2],1:4])
#  Virginica korelasyon matrisi
print(x[3])
cor(iris[iris$Species==x[3],1:4])
                    
                  

Bu durumda aşağıdaki sonuçlar elde edilecektir:

                        
> cor(iris$Petal.Length, iris$Petal.Width)
[1] 0.9628654

> x=levels(iris$Species)

> # setosa korelasyon matrisi
> print(x[1])
[1] "setosa"

> cor(iris[iris$Species==x[1],1:4])
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.7425467    0.2671758   0.2780984
Sepal.Width     0.7425467   1.0000000    0.1777000   0.2327520
Petal.Length    0.2671758   0.1777000    1.0000000   0.3316300
Petal.Width     0.2780984   0.2327520    0.3316300   1.0000000
> #Versicolor korelasyon matrisi
> print(x[2])
[1] "versicolor"

> cor(iris[iris$Species==x[2],1:4])
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.5259107    0.7540490   0.5464611
Sepal.Width     0.5259107   1.0000000    0.5605221   0.6639987
Petal.Length    0.7540490   0.5605221    1.0000000   0.7866681
Petal.Width     0.5464611   0.6639987    0.7866681   1.0000000

> #  Virginica korelasyon matrisi
> print(x[3])
[1] "virginica"

> cor(iris[iris$Species==x[3],1:4])
             Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length    1.0000000   0.4572278    0.8642247   0.2811077
Sepal.Width     0.4572278   1.0000000    0.4010446   0.5377280
Petal.Length    0.8642247   0.4010446    1.0000000   0.3221082
Petal.Width     0.2811077   0.5377280    0.3221082   1.0000000
>
                    
                  

Genel olarak korelasyon katsayısının 1’e yakın olması çok kuvvetli bir pozitif korelasyonu gösterir. Örneğin, yukarıdaki matriste Petal.Length ve Sepal.Length arasındaki korelasyon katsayısı 0.8642247 olup bu durum yüksek bir pozitif korelasyonu gösterir. Sepal.Length ile Petal.Width arasındaki korelasyon katsayısı ise 0.2811077 olup düşük pozitif bir korelasyonu simgelemektedir.

ÖRNEKLERİN DAĞILIMI

Örneklerin nasıl dağıldığı ve yüzde dağılımları konusunda fikir edinmek için aşağıdaki R kodunu çalıştırabiliriz:

                        
# ORNEKLERIN DAGILIMI
table(iris$Species) 

# ORNEKLERIN YUZDE DAGILIMI
round(prop.table(table(iris$Species)) * 100, digits = 1)
                    
                  

Aşağıdaki sonucu elde edeceksiniz:

                        
> # ORNEKLERIN DAGILIMI
> table(iris$Species) 

    setosa versicolor  virginica 
        50         50         50 

> # ORNEKLERIN YUZDE DAGILIMI
> round(prop.table(table(iris$Species)) * 100, digits = 1)

    setosa versicolor  virginica 
      33.3       33.3       33.3 
>
                    
                  

VERİ KÜMESİNİN BASİT İSTATİSTİKSEL ÖZELLİKLERİ

R ile veri kümesi için ortalama, medyan, maksimum ve minimum değerler gibi temel istatistiksel özellikleri summary( ) fonksiyonu yardımı ile elde edebiliriz. Aşağıdaki örneği inceleyiniz:

                        
summary(iris)
summary(iris$Sepal.Length)
summary(iris$Species)
                    
                  

Aşağıdaki sonuçları elde edeceksiniz:

                        
> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500                  

> summary(iris$Sepal.Length)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   5.100   5.800   5.843   6.400   7.900 

> summary(iris$Species)
    setosa versicolor  virginica 
        50         50         50 
>
                    
                  

III. VERİ YAPISINDAN NELER ELDE EDİLEBİLECEKTİR?

Bu aşamada veri kümesinden elde etmek istediğimiz şey sınıfların ayrımı, başka bir deyişle sınıflandırma işlemidir.

IV. ÇALIŞMA ALANININ HAZIRLANMASI

Bu aşamada sınıflandırmada kullanacağımız SVM( ) fonksiyonunun gerçeklemesi için “e1071” paketinin kurulumu gerekmektedir. Bununla ilişkili olarak,

                        
install.packages("e1071")
library("e1071")
                    
                  

komutları girilerek çalışma alanı hazırlanmalıdır.

                        
> install.packages("e1071")
trying URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.4/e1071_1.6-8.tgz'
Content type 'application/x-gzip' length 763504 bytes (745 KB)
==================================================
downloaded 745 KB
                    
                  

                        
The downloaded binary packages are in
/var/folders/h2/m24zmrfd36vcgdqrszrb27780000gn/T//Rtmp5i9s3h/downloaded_packages
> library("e1071")
>
                    
                  

V. VERİ KÜMESİNİN MAKİNE ÖĞRENMESİ ALGORİTMALARI İÇİN HAZIRLANMASI:
NORMALİZASYON İŞLEMİ, EĞİTİM VE TEST KÜMELERİNİN BELİRLENMESİ

Genellikle verinin ham halinden ziyade normalize edilmiş hali ile kullanılması daha uygundur. Normalizasyon işlemi verileri 0 - 1 aralığına taşımaktadır.

xi bir veri nesnesi ise ve x̅  x veri kümesinin ortalaması, xmax veri kümesinin en büyük değeri ve xmin veri kümesinin en küçük değeri ise normalizasyon formülü,

şeklindedir.

Iris verisinde sayısal özellikler Sepal.Length , Sepal.Width, Petal.Length ve Petal.Width değişkenleridir ve aşağıdaki kod iris veri kümesini normalize etmektedir:

İRİS VERİ KÜMESİNİN NORMALİZASYONU

                        
data(iris)
library(dplyr)
normalize <- function(x){
  return((x- mean(x))/(max(x)-min(x)))
}
veri1 <- sapply(filter(iris, Species == 'setosa')[1:4], normalize)
veri2 <- sapply(filter(iris, Species == 'versicolor')[1:4], normalize)
veri3 <- sapply(filter(iris, Species == 'virginica')[1:4], normalize)
ORNEK <- rep(c('setosa','versicolor','virginica'), each = 50)
VER_X <- rbind(data1, data2,data3)
NORMALIZE_IRIS_VERI <- data.frame(VER_X,ORNEK)
                    
                  

PROGRAMIN ÇIKTISI

                        
> head(NORMALIZE_IRIS_VERI)
  Sepal.Length    Sepal.Width     Petal.Length     Petal.Width       ORNEK
1   0.06266667     0.03428571      -0.06888889          -0.092      setosa
2  -0.07066667    -0.20380952      -0.06888889          -0.092      setosa
3  -0.20400000    -0.10857143      -0.18000000          -0.092      setosa
4  -0.27066667    -0.15619048       0.04222222          -0.092      setosa
5  -0.00400000     0.08190476      -0.06888889          -0.092      setosa
6   0.26266667     0.22476190       0.26444444           0.308      setosa
>
                    
                  

Yukarıda normalize edilmiş iris verisinin ilk 6 satırı yazdırılmıştır. Görüldüğü gibi veri değerleri 0 - 1 arasındadır.

EĞİTİM VE TEST KÜMELERİNİN BELİRLENMESİ

SVM algoritması denetimli öğrenme tekniklerinden biridir. Verinin büyükçe bir kısmı eğitim için ayrılır. Sistem öğrendikten sonra test için ayrılan veri de kontrol amaçlı kullanılır. Böylece sınıflama sisteminin doğru çalışıp çalışmadığı anlaşılabilir. Örnek verinin eğitim ve test kümelerine ayrılması önemli bir aşamadır ve bu işlem R dilinde aşağıdaki kod ile gerçekleştirilir:

EĞİTİM (TRAINING) VE TEST (TEST) KÜMELERİNİ OLUŞTURAN R KODU

                        
data(iris)
#VERININ %75'I
ORNEK_BOYUT <- floor(0.75 * nrow(iris))
set.seed(1234)
EGIT_IND <- sample(seq_len(nrow(iris)), size = ORNEK_BOYUT)
EGIT <- iris[EGIT_IND, ]
TEST <- iris[-EGIT_IND, ]
                    
                  

Bu kod ile veri kümesinin %75’i eğitim, %25’i ise test için kullanılacaktır.

Eğitim ve test kümelerinin başlangıç satırlarını ise head( ) komutu ile aşağıdaki gibi listeleyebiliriz:

                        
> head(EGIT)
    Sepal.Length Sepal.Width Petal.Length Petal.Width       Species
18           5.1         3.5          1.4         0.3        setosa
93           5.8         2.6          4.0         1.2    versicolor
91           5.5         2.6          4.4         1.2    versicolor
92           6.1         3.0          4.6         1.4    versicolor
126          7.2         3.2          6.0         1.8     virginica
149          6.2         3.4          5.4         2.3     virginica
>
> head(TEST)
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1           5.1         3.5          1.4         0.2     setosa
3           4.7         3.2          1.3         0.2     setosa
9           4.4         2.9          1.4         0.2     setosa
11          5.4         3.7          1.5         0.2     setosa
12          4.8         3.4          1.6         0.2     setosa
16          5.7         4.4          1.5         0.4     setosa

                    
                  

VI. SEÇİLEN MAKİNE ÖĞRENMESİ ALGORİTMASININ GERÇEK VERİYE UYGULANMASI

Bu aşamada seçtiğimiz makine öğrenmesi algoritması Support Vector Machine - SVM’dir. Destek Vektör Makinesi sınıflandırma işlemleri için kullanılan yeni ve oldukça başarılı bir algoritmadır. Şimdi bu algoritmayı kullanarak iris verisini sınıflandıracağız.

SVM ALGORİTMASI: R DİLİNDE UYGULAMA ADIMLARI

  1. a. Önce e1071 paketi yüklenir. Bu svm( ) fonksiyonu için gereklidir:
                            
    data(iris)
    library("e1071")
    head(iris,5)
                        
                      

    Yükleme başarı ile tamamlanmıştır:
                            
    > data(iris)
    > library("e1071")
    > head(iris,5)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    >
                        
                      

  2. b. Şimdi iris verisini tüm özelliklerin bulunduğu bir x ve sadece sınıfların bulunduğu y dosyalarına ayıralım:
                            
    attach(iris)
    x <- subset(iris, select=-Species)
    y <- Species
    
    > head(x)
      Sepal.Length Sepal.Width Petal.Length Petal.Width
    1          5.1         3.5          1.4         0.2
    2          4.9         3.0          1.4         0.2
    3          4.7         3.2          1.3         0.2
    4          4.6         3.1          1.5         0.2
    5          5.0         3.6          1.4         0.2
    6          5.4         3.9          1.7         0.4
    >
    
    > head(y,20)
    [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa
    [10] setosa setosa setosa setosa setosa setosa setosa setosa setosa
    [19] setosa setosa
    Levels: setosa versicolor virginica
    >
                        
                      

  3. c. Şimdi svm modelini iris verisi için oluşturarak R’de çalıştıralım:
                            
    svm_GERCEL <- svm(Species ~ ., data=iris)
    summary(svm_GERCEL)
    
    > svm_GERCEL <- svm(Species ~ ., data=iris)
    
    > summary(svm_GERCEL)
                        
                      

    Aşağıdaki sonucu elde ederiz:
                            
    Call:
    svm(formula = Species ~ ., data = iris)
    
    Parameters:
       SVM-Type:  C-classification 
     SVM-Kernel:  radial 
           cost:  1 
          gamma:  0.25 
    
    Number of Support Vectors:  51
    
     ( 8 22 21 )
    
    
    Number of Classes:  3 
    
    Levels: 
     setosa versicolor virginica
                        
                      

  4. SONUÇ:

    Burada svm algoritmasıyla ilgili parametreler verilmekte (bunların detayları SVM konusunda anlatılacaktır) ve iris verisinin 3 sınıftan oluştuğu ve bu sınıfların,

    1. 1. setosa
    2. 2. versicolor
    3. 3. verginica
    olduğu belirtilmektedir.

  5. d. Alternatif olarak svm ile sınıflandırma işlemi için aşağıdaki kodu deneyebilirsiniz:
                            
    attach(iris)
    x <- subset(iris, select=-Species)
    y <- Species
    SVM_MODEL <- svm(x,y)
    summary(SVM_MODEL)
                        
                      

    Aşağıdaki sonucu elde ederiz:
                            
    Call:
    svm.default(x = x, y = y)
    
    Parameters:
       SVM-Type:  C-classification 
     SVM-Kernel:  radial 
           cost:  1 
          gamma:  0.25 
    
    Number of Support Vectors:  51
    
     ( 8 22 21 )
    
    Number of Classes:  3 
    
    Levels: 
     setosa versicolor virginica
    
                        
                      

    Sonuçların aynı olduğunu görürüz.
  6. e. SVM modeli için sistem çalışma zamanını aşağıdaki gibi ölçeriz:
                            
    attach(iris)
    x <- subset(iris, select=-Species)
    y <- Species
    SVM_MODEL <- svm(x,y)
    summary(SVM_MODEL)
    TAHMIN <- predict(SVM_MODEL,x)
    system.time(TAHMIN <- predict(SVM_MODEL,x))
                        
                      

    Böylece aşağıdaki sonucu elde ederiz:
                            
    > TAHMIN <- predict(SVM_MODEL,x)
    
    > system.time(TAHMIN <- predict(SVM_MODEL,x))
       user  system elapsed 
      0.002   0.000   0.002
                        
                      

  7. f. Tahmin ya da hata matrisinde (confusion matrix) sınıflar için tahmin edilen eleman sayılarını table fonksiyonu ile görebilirsiniz:
                            
    attach(iris)
    x <- subset(iris, select=-Species)
    y <- Species
    SVM_MODEL <- svm(x,y)
    summary(SVM_MODEL)
    TAHMIN <- predict(SVM_MODEL,x)
    system.time(TAHMIN <- predict(SVM_MODEL,x))
    table(TAHMIN,y)
                        
                      

    Böylece aşağıdaki sonucu elde ederiz:
                            
    > table(TAHMIN,y)
                y
    TAHMIN      setosa        versicolor        virginica
    setosa          50              0                 0
    versicolor       0              48                2
    virginica        0              2                48
    U
    >
                        
                      

    Burada her sınıfta 50 ‘şer adet veri olduğu biliniyor. Tahmin edilen değerlere göre hatalı tahminleri görebiliriz.(48, 2 gibi)

VII. SONUÇLARIN PERFORMANSININ DEĞERLENDİRİLMESİ

Bir algoritmanın performansını değerlendirme işlemi aslında istatistikteki hipotez testi problem ile çakışır. Verinin iki sınıfa ayrılması probleminde aşağıdaki durumlar söz konusudur:

TN — True Negative: Bir sınıfa ait olmayanların o sınıftan kabul edilmemesi hali
FP — False Positive: Bir sınıfa ait olmayanların o sınıfa ait kabul edilmesi hali
FN — False Negative: Bir sınıfa ait olanların o sınıftan kabul edilmemesi hali
TP — True Positive: Bir sınıfa ait olanların o sınıftan kabul edilmesi hali

İki sınıfa ayırma probleminde performans değerlendirmesi aşağıdaki Hata Matrisi (Confusion matrix) yardımı ile kolaylıkla gerçekleştirilebilir:

Buna göre hata matrisinden doğruluk değeri aşağıdaki biçimde hesaplanabilir:

Doğruluk (Accuracy) = (a + d) / (a + b + c + d) = (TN + TP) / (TN + FP + FN + TP)

ÖRNEK:

Doğruluk = (10 + 7) / (10 + 3 + 3 + 7) = 17 / 23 = 0,7391
olacaktır.

R YAZILIMININ SİSTEME YÜKLENMESİ

R yazılımı açık kaynak kodlu (open source) bir yazılımdır. https://cran.r-project.org/ adresinden sisteminize yükleyip kurulumunu gerçekleştirebilirsiniz:

ŞEKİL DL_1: https://cran.r-project.org sayfası

ŞEKİL DL_1: https://cran.r-project.org sayfası

Burada kullandığınız işletim sistemini seçmeniz gerekir. Örneğin Download for Mac OS X’in üzerini tıkladığınızda Şekil DL_2’deki sayfa gelir:

Şekil DL_2: Mac OS için R yazılımı

Şekil DL_2: Mac OS için R yazılımı

Burada kurulum dosyasını (Mac için R-3.4.1.pkg) tıklayarak ilerleyebilirsiniz. Bilgisayarınıza yüklenen Şekil DL_3’teki sayfada Continue butonunu tıklayarak kurulumu gerçekleştirebilirsiniz.

Şekil DL_3: R Kurulumu

Şekil DL_3: R Kurulumu

R STUDIO YAZILIMININ YÜKLENMESİ

R Studio, R dilini daha kolay kullanabileceğiniz bir IDE’dir. (IDE-Integrated Development - Environment_Bütünleşik Geliştirme Ortamı).
https://www.rstudio.com/products/rstudio/download/

sayfasından da bu yazılımı indirebilirsiniz. Bu sayfada FREE Download butonunu tıkladığınızda Şekil DL_4’teki pencere gelir:

Şekil DL_4: R Studio yazılımının yüklenmesi

Şekil DL_4: R Studio yazılımının yüklenmesi

Burada işletim sisteminize uygun bir sürümü (Mac OS, Windows ya da Linux) seçerek yükleme işlemini sürdürebilirsiniz.

Sonuçta aşağıdaki sayfa gelecektir:

Şekil DL_5: R Studio Çalışma Penceresi

Şekil DL_5: R Studio Çalışma Penceresi

Burada > şeklinde görünen komut satırına R komutları girilip çalıştırılabilir ya da File/New File/R-Script yolu izlenerek gelen boş pencereye R kodu yüklenerek Code/Run Region/Run All menü adımları izlenerek çalıştırılabilir.

R YAZILIMINA GİRİŞ

R ortamında bir sayı listesini saklamak için en kolay yol c komutunu kullanarak bir atama yapmaktır. (c, combine sözcüğünden kısaltılmıştır ve birleştirmek, karıştırmak, karmak anlamlarına gelir)

Sayı listesi bir isim altında tutulur ve atama <- sembolü ile gerçekleştirilir:

                        
> liste<-c(5,8,12,6)
> liste
[1]  5  8 12  6
                    
                  

Sayı listesi için kullanılabilecek diğer bir terim de vektör (vector) sözcüğüdür.

Liste elemanlarına köşeli parantez sembolü içine yerleştirilen indis (subscript) değeri ile erişilir:

                        
> liste[0]
numeric(0)
> liste[1]
[1] 5
> liste[2]
[1] 8
> liste[3]
[1] 12
> liste[4]
[1] 6
> liste[5]
[1] NA
liste
                    
                  

                        
> liste[5]=34
> liste[5]
[1] 34
                    
                  

R VERİLERİNİ SAKLAMA VE OKUMA

Aşağıda sayi.Rdata adlı R dosyası 1-15 arasındaki sayıları içerecek şekilde oluşturulur ve diske kaydedilir (save). Ardından rm( ) fonksiyonu ile x nesnesi silinir. load( ) fonksiyonu ile sayi.Rdata dosyası okunur ve print( ) fonksiyonu ile de içerik listelenir:

                        
> x<-1:15
> save(x,file="sayi.Rdata")
> rm(x)
> load("sayi.Rdata")
> print(x)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
>
                    
                  

CSV DOSYASININ OKUNMASI

CSV Comma Separated Values (virgülle ayrılmış değerler) anlamındadır. Bu bölümde bu tür dosyalardaki verileri okumayı sağlayan read.csv fonksiyonundan bahsedeceğiz. Bu tür dosyalarda sayı ya da harflerden oluşan veri kalemleri birbirinden virgülle ayrılmıştır. Ayrıca csv dosyasının ilk satırında ise diğer satırlardaki veri kolonlarına açıklama olmak üzere bazı etiketler bulunur.

ÖRNEK:

Aşağıdaki dosyayı bir metin işleyicide (Notepad, XCode gibi) oluşturarak deney.csv adı ile saklayınız:

Şimdi bu dosyayı deney_dosyasi adı ile okumak üzere read.csv fonksiyonunu kullanalım:

                        
>deney_dosyasi <- read.csv(file="/Users/Username/Desktop/deney.csv",head=TRUE,sep=",")
                    
                  

Dosyadaki verilerle ilişkili basit istatistiksel bilgileri özetlemek içinse summary fonksiyonunu kullanabiliriz:

                        
> summary(deney_dosyasi)
    deney      sicaklik         basinc     
 A     :2   Min.   :345.0   Min.   :3.000  
 B     :3   1st Qu.:401.3   1st Qu.:4.000  
 C     :2   Median :567.0   Median :5.000  
            Mean   :519.9   Mean   :5.429  
            3rd Qu.:623.5   3rd Qu.:7.000  
            Max.   :678.0   Max.   :8.000  
>
                    
                  

ÇALIŞILAN (AKTİF) DİZİNİ (FOLDER, DIRECTORY) LİSTELEMEK

Çalıştığınız aktif dizininin yolunu listelemek için getwd( ) fonksiyonunu kullanabilirsiniz:

                        
> getwd()
[1] "/Users/Username"
                    
                  

Aktif dizinin içeriğini listelemek içinse dir( ) fonksiyonunu kullanabilirsiniz:

                        
> dir()
 [1] "AMPLIDESettings"        "Applications"          
 [3] "Desktop"                "Documents"             
 [5] "Downloads"              "Dropbox"               
 [7] "Library"                "Movies"                
 [9] "Music"                  "NetBeansProjects"      
[11] "Pictures"               "Public"                
[13] "SqlViewerHistory.props" "aa"                    
[15] "cv.js"                  "hello.js"              
[17] "info.txt.save"          "journal"               
[19] "local.0"                "local.ns"  
                    
                  

DOSYANIN SÜTUNLARINA ERİŞMEK

Deney adlı dosyanın üç ayrı alanı ya da sütunu mevcuttur:

  1. 1. Deney
  2. 2. Sıcaklık
  3. 3. Basınç

Bu alanlara erişmek için,

DosyaAdı$AlanAdı

notasyonunu kullanabilirsiniz.

ÖRNEK:

                        
> deney_dosyasi$deney
[1] A      B      A      B      C      B      C     
Levels: A      B      C     
> deney_dosyasi$sicaklik
[1] 567.0 678.0 456.0 345.0 569.0 678.0 346.6
> deney_dosyasi$basinc
[1] 5 7 8 4 4 7 3
> 
                    
                  

ALAN İSİMLERİNİN LİSTELENMESİ

Dosya içindeki alan isimlerini tam hatırlamıyorsanız bu isimleri listelemek için names() fonksiyonunu kullanabilirsiniz:

                        
> names(deney_dosyasi)
[1] "deney"    "sicaklik" "basinc"  
>
                    
                  

BASİT GRAFİK ÇİZİMİ

Bu bölümde R dilinde çok basit bir grafik çizimi yapacağız. Aşağıdaki tabloda verilen verileri R’ye yükleyelim. Bunlar 5 farklı kişiye ait kilo ve boy bilgileridir:

 Ali Veli Ayşe Okan Cem
80 67 56 81 87
185 160 158 174 195

Şimdi bunları R ortamına yükleyerek aşağıdaki hesaplamaları yapalım:

                        
> boy<-c(185,160,158,174,195)
> kilo<-c(80,67,56,81,87)
> boy
[1] 185 160 158 174 195
> kilo
[1] 80 67 56 81 87
> mean(boy)
[1] 174.4
> mean(kilo)
[1] 74.2
> sd(boy)
[1] 15.9154
> sd(kilo)
[1] 12.51799
> cor(boy,kilo)
[1] 0.9092561
> plot(boy,kilo)
>
                    
                  

Burada mean fonksiyonu ile aritmetik ortalama, sd fonksiyonu ile standart sapma, cor fonksiyonu ile de iki büyüklük arasındaki (boy, kilo) korelasyon yani ilişki hesaplanmıştır. plot fonksiyonu ile de aşağıdaki grafik çizilecektir:

ÇALIŞMA ALANI (WORKSPACE)

R ortamında o esnada çalıştığınız ortama çalışma alanı denir ve kullanıcı tarafından tanımlanmış vektör, matris, fonksiyon, veri çerçevesi (dataframe) ve listeler gibi tüm nesneleri içerir.

Çalışma alanınızdaki bilgileri bir görüntü halinde saklayabilir ve bir sonraki sefer bunu tekrar yükleyerek çalışmaya buradan devam edebilirsiniz.

Aşağıdaki tabloda çalışma alanı ile ilgili faydalı fonksiyonlar görülmektedir:

Tablo 1. Çalışma Alanı (Workspace) Fonksiyonları

 FONKSİYON  İŞLEVİ
getwd( ) Mevcut çalışma alanındaki tüm bilgileri listeler
setwd(“yenidizin”) Aktif dizini “yenidizin” olarak değiştir.
ls( ) Aktif dizindeki tüm nesneleri listele
rm(nesnelistesi) Bir ya da daha fazla nesneyi sil
help( ) Çeşitli konularda yardım
history(#) Son # adet komutu listeler.Komut sayısı belirtilmezse default değer 25’tir.
savehistory(“dosya”) Kullanılan komutlar listesi “dosya” da saklanır.
loadhistory(“dosya”) “dosya” da saklanmış olan komut listesi çalışma alanına yüklenir.
save.image(“dosya”) Çalışma alanını “dosya” adlı dosyada saklar.
save(DeğişkenlerListesi,file=”dosya”) Belirlenmiş değişkenleri “dosya” da saklar.
load(“dosya”) “dosya” adı ile saklanmış çalışma alanını aktif hale getirir.
q( ) R’den çıkış anlamındadır.

Sonraki bölümlerde daha karmaşık grafiklerin de nasıl çizileceğini göstereceğiz.

R'DE VERİ TİPLERİ

R’de veri yapıları karmaşıklıklarına göre aşağıdaki şekilde sınıflandırılabilir:

  1. a) Değişken (variable)
  2. b) Vektör (vector)
  3. c) Matris (Matrix)
  4. d) Dizi (Array)
  5. e) Veri Çerçevesi (Data Frame)
  6. f) Liste (List)

DEĞİŞKEN

Kendisine bir isim ve bir değer atanmış olan en basit veri yapısıdır:

                        
> a<-5
> a
[1] 5
> a<-7
> a
[1] 7
>
                    
                  

Yukarıdaki örnekte a değişkeni 5 değerini almış sonra değeri 7 olarak değiştirilmiştir.

                        
> a<-a-3
> a
[1] 4
                    
                  

Yukarıdaki a <-a -3 ifadesi ile de a’nın 7 olan değeri 4 olarak değiştirilmiştir.

VEKTÖRLER

Vektörler tek boyutlu dizilerdir. Sayısal, karakter türü (string) ya da mantıksal türde veri içerebilirler. Vektörü oluşturmak için c( ) fonksiyonu (combine) kullanılır.

ÖRNEK:

                        
> a<-c(4,8,9,11)
> a
[1]  4  8  9 11
> b<-c("a","b","c","d","e")
> b
[1] "a" "b" "c" "d" "e"
> c<-c(TRUE,FALSE,FALSE,TRUE)
> c
[1]  TRUE FALSE FALSE  TRUE
>
                    
                  

Burada a sayısal, b karakter c mantıksal (lojik) veri içeren vektörlerdir. Aşağıda a sayısal vektörü ile ilişkili çeşitli işlemler görülmektedir:

                        
> a
[1]  4  8  9 11
> a[2]
[1] 8
> a[0]
numeric(0)
> a[4]
[1] 11
> a[c(2,4)] 
[1]  8 11
> a[2:4]
[1]  8  9 11
>
                    
                  

MATRİSLER

Matrisler iki boyutlu dizilerdir. Bütün elemanları aynı türdedir. En basit temsil şekli:

                        
m <-matrix (Vektör, nrow = satır, ncol = sütun)
                    
                  

şeklindedir.

ÖRNEK:

                        
> v<-c(3,8,-5,-4,3,11,9,-6,5,3)
> v
 [1]  3  8 -5 -4  3 11  9 -6  5  3
> m<-matrix(v,nrow=2,ncol=5)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    3   -5    3    9    5
[2,]    8   -4   11   -6    3
>
                    
                  

Yukarıdaki örnekte v vektörünün elemanlarından 2 satır ve 5 sütunu olan m isimli bir matris oluşturulmuştur. Burada vektör elemanlarının matrise sütun düzeninde yerleştirildiğine dikkat ediniz.

Aşağıdaki örnekte yine 3 satır ve 5 sütunu olan bir matris oluşturulmaktadır:

                        
> m <- matrix (1:15, nrow=3, ncol=5)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
> 
                    
                  

ÖRNEK:

Aşağıdaki örnekte ise 2x3 ‘lük bir matris vektör elemanları satırlar boyunca yerleştirilerek oluşturulmakta ve satır ve sütun başlıkları da atanmaktadır:

                        
> elemanlar<-c(5,9,3,6,2,5)
> sat<-c("sat1","sat2")
> sut<-c("sut1","sut2","sut3")
> m<- matrix(elemanlar, nrow=2, ncol=3, byrow=TRUE,
+                    dimnames=list(sat, sut))
> m
     sut1 sut2 sut3
sat1    5    9    3
sat2    6    2    5
>
                    
                  

MATRİS İNDİSLERİNİ KULLANMA

Aşağıdaki örnekte 4x5 boyutunda bir matris oluşturulmaktadır:

                        
> m<-matrix(1:20,nrow=4)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20
                    
                  

Aşağıdaki ifade ile matrisin 2.satır 4.sütun elemanına erişilmektedir:

                        
> m[2,4]
[1] 14
                    
                  

Aşağıdaki ifade ile de matrisin 2.satırına erişilmektedir:

                        
> m[2,]
[1]  2  6 10 14 18
                    
                  

Aşağıdaki ifade ile de matrisin 3.sütun elemanlarına erişilmektedir:

                        
> m[,3]
[1]  9 10 11 12
                    
                  

Aşağıdaki ifade ile de matrisin 3. Satırındaki 3 ve 4. Elemanlara yani 11 ve 15’e erişilmektedir.

                        
> m[3,c(3,4)]
[1] 11 15
>
                    
                  

DİZİLER

Diziler matrislere benzer, ama matristen daha fazla boyuta sahiptirler. array sözcüğü ile oluşturulurlar:

Aşağıdaki örnekte uzay (2 x 3 x 5) dizisi oluşturulmaktadır:

                        
> boyut1 <- c("x1", "x2")
> boyut2 <- c("y1", "y2", "y3")
> boyut3 <- c("z1", "z2", "z3", "z4","z5")
> uzay <- array(1:30, c(2, 3, 5), dimnames=list(boyut1, boyut2, boyut3)) 
> uzay

,,z1

   y1 y2 y3
x1  1  3  5
x2  2  4  6

,,z2

   y1 y2 y3
x1  7  9 11
x2  8 10 12

,,z3

   y1 y2 y3
x1 13 15 17
x2 14 16 18

,,z4

   y1 y2 y3
x1 19 21 23
x2 20 22 24

,,z5

   y1 y2 y3
x1 25 27 29
x2 26 28 30

                    
                  

VERİ ÇERÇEVELERİ (DATA FRAMES)

Veri çerçevesi bir anlamda matris yapısına benzer; satır ve sütunları vardır. Fakat en önemli özelliği içindeki verilerin aynı tipte olmamasıdır. Örneğin bir sütun numerik tipte, diğer sütun karakter tipinde olabilir.

Gerçek hayattaki bir çok uygulama veri çerçevesi veri yapısını kullanmayı gerektirir. Örneğin bir firmada çalışan personel bilgileri bir veri çerçevesi yapısına uygundur. Şimdi veri çerçevesi ile bir uygulama yapalım:

SİCİL AD SOYAD MAAŞ CİNSİYET
12 Ali Can 5000 true
45 Ayşe Mert 7000 false
56 Mehmet Arda 6000 true
87 Selin Okan 4500 false
123 Mahmut Ser 6500 true

Burada cinsiyet mantıksal bir veri türü ile temsil edilmekte, true erkek ve false kadın anlamına gelmektedir.

                        
> sicil<-c(12,
+          45,
+          56,
+          87,
+          123
+ )
> sicil
[1]  12  45  56  87 123
 
> ad<-c("ali",
+       "ayse",
+       "mehmet",
+       "selin",
+       "mahmut"
+ )
> ad
[1] "ali"    "ayse"   "mehmet" "selin"  "mahmut"
> soyad<-c("can",
+          "mert",
+          "arda",
+          "okan",
+          "ser"
+ )
> soyad
[1] "can"  "mert" "arda" "okan" "ser" 
>
> maas<-c(5000,
+         7000,
+         6000,
+         4500,
+         6500
+ )
> maas
[1] 5000 7000 6000 4500 6500
>
> cinsiyet<-c(TRUE,FALSE,TRUE,FALSE,TRUE)
> cinsiyet
[1]  TRUE FALSE  TRUE FALSE  TRUE
>

> personel<-data.frame(sicil,ad,soyad,maas,cinsiyet)
> personel

  sicil     ad soyad maas cinsiyet
1    12    ali   can 5000     TRUE
2    45   ayse  mert 7000    FALSE
3    56 mehmet  arda 6000     TRUE
4    87  selin  okan 4500    FALSE
5   123 mahmut   ser 6500     TRUE
>
                    
                  

personel adlı veri çerçevesi içinden sadece 2 ve 3 sütun bilgilerini listelemek için aşağıdaki ifade kullanılabilir:

                    
>personel[2:3]
>
      ad soyad
1    ali   can
2   ayse  mert
3 mehmet  arda
4  selin  okan
5 mahmut   ser
>                      
                    
                  

Sadece istenilen sütunları listelemenin başka bir yolu da sütun başlıklarını aşağıdaki biçimde kullanmaktır:

                    
> personel[c("sicil","maas")]
   sicil   maas
1    12    5000
2    45    7000
3    56    6000
4    87    4500
5   123    6500
>                 
                    
                  

Ad ve cinsiyet bilgilerini listelemek isterseniz aşağıdaki yolu da deneyebilirsiniz:

                    
> table(personel$ad,personel$cinsiyet)
        
            FALSE         TRUE
  ali         0             1
  ayse        1             0
  mahmut      0             1
  mehmet      0             1
  selin       1             0
>             
                    
                  

LİSTELER

Listeler R dilindeki en karmaşık veri yapılarıdır. Liste nesnelerin ya da bileşenlerin sıralanmış bir koleksiyonu şeklindedir. Liste birbiri ile ilişkili ya da ilişkili olmayan nesnelerin tek bir isim altında toplanması ile oluşur. Örneğin; bir liste vektörlerin, matrislerin, veri çerçevelerinin ve diğer listelerin bir kombinasyonu şeklinde olabilir. Listeyi oluşturmak için list( ) fonksiyonunu kullanmalısınız. Listelerin genel yazılış biçimi:

                    
liste_1 <-list (nesne_1,nesne_2,… nesne_n)       
                    
                  
şeklindedir.

Mecburi olmamakla birlikte nesnelere isim de verebilirsiniz:

                    
liste_1<-list(isim1=nesne_1,isim2=nesne_2,…isimn=nesne_n )
                    
                  

şeklindedir.

ÖRNEK:
LİSTE OLUŞTURMA

                    
a <-"ORNEK LISTE"
> b<-c(50,55,60,65)
> c<-matrix(1:6,nrow=2)
> d<-c("on","yirmi","otuz")


> listex<-list(title=a,b,c,d)
> listex
$title
[1] "ORNEK LISTE"

[[2]]
[1] 50 55 60 65

[[3]]
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

[[4]]
[1] "on"    "yirmi" "otuz" 
>
                    
                  

R DİLİNDE CSV TÜRÜ DOSYALAR

R dilinde, R ortamı dışındaki cihazlardan (disk dosyaları-files) veri okumak ve dış ortamlara veri yazmak mümkündür.

R dili çeşitli dosya formatlarındaki verileri okuyabilir ve bu formatlarda verileri dış ortama aktarabilir. csv, excel ve xml ilk akla gelen formatlardır.

Bu bölümde csv formatındaki bir dosyayı okumak ve bu dosyaya yazmak için gerekli R komutlarını göstereceğiz.

ÇALIŞILAN DİZİN’E (DIRECTORY-FOLDER) ERİŞMEK VE ÇALIŞMA DİZİNİNİ YENİDEN BELİRLEMEK

Getwd( ) fonksiyonu ile hangi dizinde çalıştığınızı görüntüleyebilirsiniz:

                    
> getwd()
[1] "/Users/username"
>
                    
                  

setwd( ) fonksiyonu ile de yeni çalışma dizininin ne olacağını belirleyebilirsiniz:

                    
> setwd("/Users/username")
                    
                  

Bunun için, yukarıdaki komutta gördüğünüz gibi, dizin adı ve yolunu belirtmek yeterli olacaktır.

CSV DOSYASI İLE VERİ GİRİŞİ

Csv dosyaları sütunlar arasında verilerin birer virgülle ayrıldığı metin dosyalarıdır.

CSV DOSYASININ OKUNMASI

CSV Comma Separated Values (virgülle ayrılmış değerler) anlamındadır. Bu bölümde bu tür dosyalardaki verileri okumayı sağlayan read.csv fonksiyonundan bahsedeceğiz. Bu tür dosyalarda sayı ya da harflerden oluşan veri kalemleri birbirinden virgülle ayrılmıştır.

Ayrıca csv dosyasının ilk satırında ise diğer satırlardaki veri kolonlarına açıklama olmak üzere bazı etiketler bulunur.

ÖRNEK:

Aşağıdaki dosyayı bir metin işleyicide oluşturarak deney.csv adı ile saklayınız:

Şimdi bu dosyayı deney_dosyasi adı ile okumak üzere read.csv fonksiyonunu kullanalım:

                        
>deney_dosyasi <- read.csv(file="/Users/Username/Desktop/deney.csv",head=TRUE,sep=",")
                    
                  

Dosyadaki verilerle ilişkili basit istatistiksel bilgileri özetlemek içinse summary fonksiyonunu kullanabiliriz:

                        
> summary(deney_dosyasi)
    deney      sicaklik         basinc     
 A     :2   Min.   :345.0   Min.   :3.000  
 B     :3   1st Qu.:401.3   1st Qu.:4.000  
 C     :2   Median :567.0   Median :5.000  
            Mean   :519.9   Mean   :5.429  
            3rd Qu.:623.5   3rd Qu.:7.000  
            Max.   :678.0   Max.   :8.000  
>
                    
                  

CSV TİPİ DOSYAYA YAZMA

write.csv komutunu kullanarak csv tipi bir dosyaya kayıt yapabilirsiniz. Aşağıdaki örneği inceleyiniz:

                        
u<-c(2,8,5,4,7)
v<-c('A','B','C','D','E')
k<-data.frame(u,v)
write.csv(k,"ccc.csv")
nn<- read.csv("ccc.csv")
nn[c("u","v")]
                    
                  

Programı çalıştırdığınızda aşağıdaki çıktıyı alacaksınız:

                        
> nn[c("u","v")]
  u v
1 2 A
2 8 B
3 5 C
4 4 D
5 7 E
>
                    
                  

ÖRNEK:
u DEĞERİ 4’TEN BÜYÜK OLANLARIN LİSTELENMESİ

                        
u<-c(2,8,5,4,7)
v<-c('A','B','C','D','E')
k<-data.frame(u,v)
write.csv(k,"ccc.csv")
nn<- read.csv("ccc.csv")
nn[c("u","v")]
rr<-subset(nn,nn$u>4)
write.csv(rr,"dort.csv")
nev<- read.csv("dort.csv")
nev[c("u","v")]
                    
                  

Programın çıktısı ise aşağıdadır:

                        
> nev[c("u","v")]
  u v
1 8 B
2 5 C
3 7 E
>
                    
                  

R’DE MATRİS İŞLEMLERİ

R’de r adet satır (row) ve c adet sütun ya da kolon (column) dan oluşan bir matris aşağıdaki biçimde ifade edilir:

4 satır ve 3 sütundan oluşan bir matrisin elemanları tek boyutlu diziden alınarak sütun düzeninde yerleşmek üzere aşağıdaki R komutları ile oluşturulabilir:

                        
> A<-matrix(c(4,6,9,11,3,4,7,9,4,2,1,9),ncol=3)
> A
     [,1] [,2] [,3]
[1,]    4    3    4
[2,]    6    4    2
[3,]    9    7    1
[4,]   11    9    9
                    
                  

Aynı yerleştirme satır satır yapılacaksa aşağıdaki komutları girmelisiniz:

                        
> A<-matrix(c(4,6,9,11,3,4,7,9,4,2,1,9),ncol=3,byrow=T)
> A
     [,1] [,2] [,3]
[1,]    4    6    9
[2,]   11    3    4
[3,]    7    9    4
[4,]    2    1    9
>
                    
                  

MATRİSİN SATIR VE SÜTUNLARINA İSİM VERMEK

Aşağıdaki kodu çalıştırınız:

                        
x <- matrix(1:9, nrow = 3, dimnames = list(c("X","Y","Z"), c("A","B","C")))
x
                    
                  

Aşağıdaki çıktıyı elde edeceksiniz:

                        
A B C
X 1 4 7
Y 2 5 8
Z 3 6 9
                    
                  

MATRİSİN SATIR VE SÜTUN İSİMLERİNE ERİŞMEK

Aşağıdaki kodu çalıştırınız:

                        
colnames(x)
rownames(x)
                    
                  

Satır ve sütun isimlerinin listelendiğini göreceksiniz:

                        
> colnames(x)
[1] "A" "B" "C"

> rownames(x)
[1] "X" "Y" "Z"
                    
                  

SATIR VE SÜTUN İSİMLERİNİ DEĞİŞTİRMEK

Aşağıdaki R kodunu çalıştırınız:

                        
colnames(x) <- c("C1","C2","C3")
rownames(x) <- c("R1","R2","R3")
x
                    
                  

Aşağıda görüldüğü gibi satır ve sütun isimlerinin değiştirildiğini göreceksiniz:

                        
   C1 C2 C3
R1  1  4  7
R2  2  5  8
R3  3  6  9
                    
                  

BİR MATRİSİ BİR SKALERLE (SAYI) ÇARPMAK

Bir matrisi bir skalerle çarpmak basit bir işlemdir ve aşağıdaki gibi gerçekleştirilir:

                        
> 4*A
     [,1] [,2] [,3]
[1,]   16   24   36
[2,]   44   12   16
[3,]   28   36   16
[4,]    8    4   36
>
                    
                  

Matrisin her elemanı o skalerle çarpılarak yeni bir matris elde edilir.

                        
> B<-3*A
> B
     [,1] [,2] [,3]
[1,]   12   18   27
[2,]   33    9   12
[3,]   21   27   12
[4,]    6    3   27
>
                    
                  

BİR MATRİSİN TRANSPOZESİ (EVRİĞİ)

Bir matrisin transpozesi satırlarla sütunları yer değiştirerek bulunabilir:

Bu işlem R’de t( ) fonksiyonu ile gerçekleştirilir:

                        
> AT<-t(A)
> A
     [,1] [,2] [,3]
[1,]    4    6    9
[2,]   11    3    4
[3,]    7    9    4
[4,]    2    1    9
> AT
     [,1] [,2] [,3] [,4]
[1,]    4   11    7    2
[2,]    6    3    9    1
[3,]    9    4    4    9
>
                    
                  

İKİ MATRİSİN TOPLAMI

Aynı boyutta iki matris toplanabilir. Sonuç gene aynı boyutta bir matristir. Toplam matrisi toplanan matrislerin ilgili elemanlarının toplanması ile elde edilir:

ÖRNEK:

                        
> A<-matrix(c(4,6,9,11,3,4,7,9,4,2,1,9),ncol=3,byrow=T)
> B<-matrix(c(-1,6,-2,5,3,4,7,-4,4,2,-1,-5),ncol=3,byrow=T)
> A
     [,1] [,2] [,3]
[1,]    4    6    9
[2,]   11    3    4
[3,]    7    9    4
[4,]    2    1    9
> B
     [,1] [,2] [,3]
[1,]   -1    6   -2
[2,]    5    3    4
[3,]    7   -4    4
[4,]    2   -1   -5

> C<-A+B
> C
     [,1] [,2] [,3]
[1,]    3   12    7
[2,]   16    6    8
[3,]   14    5    8
[4,]    4    0    4
>
                    
                  

BİR MATRİSLE BİR VEKTÖRÜN ÇARPIMI

A, rxc boyutunda bir matris ve b, c elemanlı bir vektörse (cx1) Ab çarpımı rx1 boyutunda bir vektör olacaktır:

ÖRNEK:

ÖRNEK:
R’DE MATRİS VE VEKTÖR ÇARPIMI

                        
> A
     [,1] [,2]
[1,]    4    3
[2,]    7    1
[3,]    5    9
> b
[1] 4 2

> A %*% b
     [,1]
[1,]   22
[2,]   30
[3,]   38
>
                    
                  

Burada 3 x 2’lik A matrisi ile 2 x 1’lik b vektörü arasında matris çarpımı gerçekleştirilmiş ve 3 x 1’lik vektör elde edilmiştir. Aşağıda A ve b’nin karşılıklı elemanları çarpımı hesaplanmaktadır. Bu bir matris çarpımı değildir:

                        
> A * b
     [,1] [,2]
[1,]   16    6
[2,]   14    4
[3,]   20   18
>
                    
                  

İKİ MATRİSİN ÇARPIMI

A mxn ve B nxk boyutunda iki matris ise ve bunların çarpımı C matrisi ile temsil ediliyorsa;
C = A * B
'dir ve C mxk boyutunda olacaktır.

ÖRNEK:
R’DE MATRİS ÇARPIMI

Burada 3 x 2 boyutunda bir matrisle 2 x 2 boyutunda bir matris çarpılmakta ve 3 x 2 boyutunda çarpım matrisi elde edilmektedir:

                        
> A<-matrix(c(4,3,7,1,5,9),nrow=3,byrow=T)
> B<-matrix(c(3,2,4,1),nrow=2,byrow=T)
> A
     [,1] [,2]
[1,]    4    3
[2,]    7    1
[3,]    5    9
> B
     [,1] [,2]
[1,]    3    2
[2,]    4    1
> C<-A %*%  B
> C
     [,1] [,2]
[1,]   24   11
[2,]   25   15
[3,]   51   19
>
                    
                  

MATRİS OLARAK VEKTÖRLER

r adet satırı olan bir sütun vektör rx1 boyutunda bir matris olarak düşünülebilir. Aynı şekilde c adet elemanı olan bir satır vektör ise 1xc boyutunda bir matris olarak kullanılabilir.

MATRİSİN SÜTUN VE SATIR TOPLAMLARI

Aşağıdaki R kodu ile A matrisini oluşturalım:

                        
A <- matrix(c(2, 3, -2, 1, 2, 2), 3, 2)
A
                    
                  

Aşağıdaki çıktıyı elde edeceksiniz:

                        
  [,1] [,2]
[1,]    2    1
[2,]    3    2
[3,]   -2    2
>
                    
                  

SÜTUN TOPLAMLARI

Aşağıdaki kodu çalıştırınız:

                        
c <- colSums(A)
 c
                    
                  

Aşağıda görüldüğü gibi sütun toplamları elde edilecektir:

                        
>  c
[1] 3 5
                    
                  

SATIR TOPLAMLARI

Aşağıdaki R kodunu çalıştırınız:

                        
r <- rowSums(A)
r
                    
                  

Aşağıda görüldüğü gibi matrisin satır toplamları hesaplanacaktır:

                        
> r
[1] 3 5 0
>
                    
                  

MATRİSİN GENEL TOPLAMINI HESAPLAMAK

Aşağıdaki kodu çalıştırınız:

                        
a <- sum(A)
a
                    
                  

Aşağıda görüldüğü gibi matrisin genel toplamının hesaplandığını göreceksiniz:

                        
> a  
[1] 8
                    
                  

SATIR, SÜTUN ORTALAMALARI VE MATRİSİN ORTALAMASI

SÜTUN ORTALAMASI

Aşağıdaki komutları giriniz:

                        
cm <- colMeans(A)
cm  
                    
                  

Aşağıda görüldüğü gibi sütun ortalamalarını elde edeceksiniz:

                        
[1] 1.000000 1.666667
                    
                  

SATIR ORTALAMASI

Aşağıda görülen komutları giriniz:

                        
>rm <- rowMeans(A) 
> rm  
                    
                  

Satır ortalamalarının hesaplandığını göreceksiniz:

                        
[1] 1.5 2.5 0.0  
                    
                  

MATRİSİN ORTALAMASI

Matrisin genel ortalamasını hesaplamak için aşağıdaki komutu girmelisiniz:

                        
> m <- mean(A) 
> m  
                    
                  

Sonuçta matrisin ortalaması hesaplanacaktır:

                        
[1] 1.333333
                    
                  

MATRİSLERİ YATAY EKLEME

Aşağıdaki R kodunu çalıştırınız:

                        
A
B <- matrix(c(1,3,2,1,4,2),3,2)
B
C <- cbind(A,B)
C
                    
                  

Programın çıktısında görüldüğü gibi B matrisi A matrisinin sağına eklenmiştir:

                        
> A
     [,1] [,2]
[1,]    2    1
[2,]    3    2
[3,]   -2    2

> B <- matrix(c(1,3,2,1,4,2),3,2)

> B
     [,1] [,2]
[1,]    1    1
[2,]    3    4
[3,]    2    2

> C <- cbind(A,B)

> C
     [,1] [,2] [,3] [,4]
[1,]    2    1    1    1
[2,]    3    2    3    4
[3,]   -2    2    2    2
>
                    
                  

MATRİSLERİ DÜŞEY EKLEME

Bu kez aşağıdaki kodu çalıştırınız:

                        
A
B <- matrix(c(1,3,2,1,4,2),3,2)
B
C <- rbind(A,B)
C
                    
                  

Aşağıda görüldüğü gibi matrislerin alt alta eklendiğini göreceksiniz:

                        
> A
     [,1] [,2]
[1,]    2    1
[2,]    3    2
[3,]   -2    2

> B <- matrix(c(1,3,2,1,4,2),3,2)

> B
     [,1] [,2]
[1,]    1    1
[2,]    3    4
[3,]    2    2

> C <- rbind(A,B)

> C
     [,1] [,2]
[1,]    2    1
[2,]    3    2
[3,]   -2    2
[4,]    1    1
[5,]    3    4
[6,]    2    2
>
                    
                  

BİR MATRİSİN ÖZELLİKLERİNİ SORGULAMAK

Aşağıdaki kodu giriniz:

                        
A
class(A)
dim(A)
attributes(A)
                    
                  

Matrisin özelliklerinin sorgulandığını göreceksiniz:

                        
> A
     [,1] [,2]
[1,]    2    1
[2,]    3    2
[3,]   -2    2

> class(A)
[1] "matrix"

> dim(A)
[1] 3 2

> attributes(A)
$dim
[1] 3 2
                    
                  

R DİLİNDE GRAFİK ÇİZİMLERİ

R dilinin eğri ve grafik çizimleri bakımından oldukça zengin bir kütüphanesi vardır. Bu bölümde grafik çizimi konusunda temel bilgileri vereceğiz.

DAİRE GRAFİĞİ (PIE CHART)

Bir veri grubu içerisinde verilerin büyüklüğü ile orantılı daire dilimlerinden oluşur ve her dilim ayrı bir renge boyanabilir. Ayrıca gerekli başlık ve açıklamalar da eklenebilir.

R dilinde daire grafiği oluşturmak için,
pie ( )
fonksiyonu kullanılır.

pie( ) fonksiyonunun yazılış ve kullanılış biçimi aşağıda verilmiştir:
pie (v, etiketler, yarıçap, başlık, renk, saatyonu)
şeklindedir.

Parametrelerin üzerinden geçersek;
v: Daire grafiğinde kullanılacak verileri saklayan sayısal bir vektör
etiketler: Daire dilimlerinin anlamlarını açıklamak için kullanılır
yarıcap: daire grafiğinin yarıçapıdır;(-1,1) arasında değerler alır.
main(Başlık): Daire grafiğinin başlığıdır.
col(Renk): Kullanılacak renk paletidir.
Saatyonu: Mantıksal bir değişkendir; daire dilimlerinin saat yönünde mi yoksa ters yönde mi ilerleyeceğini belirler.

ÖRNEK:

Aşağıda Türkiye’mizin en büyük 5 şehrine ait yaklaşık nüfus bilgileri verilmiştir:

 ŞEHİR  NÜFUS
İSTANBUL 14,000,000
ANKARA 5,000,000
İZMİR 4,000,000
BURSA 3,000,000
ANTALYA 2,000,000

Bu tablo ile ilişkili bir daire grafiği oluşturalım. Nüfuslar 1.000.000’a bölünerek kullanılacaktır:

                      
> v<-c(14,5,4,3,2)
> etiket<-c("IST","ANK","IZM","BUR","ANT")
> png(file="sehir.jpg")
> pie(v,etiket)
> dev.off                        
                      
                    

Bu komutlar sonucunda aşağıdaki grafik elde edilir;

BAŞLIK VE RENK PALETİ EKLENMESİ

Aşağıdaki komutlarda daire grafiğine başlık ve renk paleti eklenmiştir:

                      
> v<-c(14,5,4,3,2)
> etiket<-c("IST","ANK","IZM","BUR","ANT")
> png(file="sehir_renkli.jpg")
> pie(v,etiket,main = "SEHIRLER DAIRE GRAFIGI", col = rainbow(length(v)))
> dev.off()
RStudioGD 
        2
                      
                    

Böylece aşağıdaki grafik elde edilecektir:

DAİRE DİLİMLERİNİN YÜZDELERİNİN EKLENMESİ

                      
> v<-c(14,5,4,3,2)
> etiket<-c("IST","ANK","IZM","BUR","ANT")
> daire_yuzde<- round(100*v/sum(v), 1)
> pie(v, labels =daire_yuzde, main = "SEHIR DAIRE GRAFIGI",col = rainbow(length(v)))
> legend("topright", c("IST","ANK","IZM","BUR","ANT"), cex = 0.9     ,  fill = rainbow(length(v)))
                      
                    

Aşağıdaki grafiği elde edilir:

ÜÇ BOYUTLU (3D) DAİRE GRAFİĞİ

Daire grafikleri 3 boyutlu olarak da hazırlanabilir. Aşağıdaki örneği inceleyelim:

                      
> etiket<-c("IST","ANK","IZM","BUR","ANT")
> v<-c(14,5,4,3,2)
> pie3D(v,labels = etiket,explode = 0.2, main = "SEHIRLER DAIRE GRAFİĞİ ")
                      
                    

SÜTUN GRAFİKLERİ (BAR CHARTS)

Sütun grafikleri verinin büyüklüğü ile orantılı dikdörtgenler kullanılarak hazırlanır. R dilinde barplot() fonksiyonu sütun grafiklerini oluşturur. Sütun grafikleri hem yatay hem de dikey olabilirler. barplot() fonksiyonunun standart yazılışı aşağıdaki gibidir:

Barplot (v, xlab, ylab, main, names.arg, col)

Bu fonksiyonun aldığı parametreler ise;
v — verileri taşıyan vektörün adıdır.
xlab — x eksenine verilen addır.
ylab — y eksenine verilen addır.
main — sütun grafiğinin başlığıdır.
names.arg — her sütuna ait isimlerin saklandığı bir vektördür.
col — grafikteki sütunların rengini belirlemek için kullanılır.

ÖRNEK:

En basit sütun grafiği örneği aşağıdadır:

                      
> v<-c(14,5,4,3,2)
> barplot(v)
                      
                    

Bu komutlar sonucunda çizilecek sütun grafiği aşağıdaki gibi olacaktır:

SÜTUN GRAFİĞİNDE ETİKETLER, BAŞLIKLAR VE RENKLER

                      
> v<-c(14,5,4,3,2)
> etiket<-c("ist","ank","izm","bur","ant")
> barplot(v,names.arg=etiket,xlab="SEHIRLER",ylab="NUFUS",col="red",main="5 BUYUK SEHRIMIZ",border="blue")
>
                      
                    

Bu komutlar sonucunda aşağıdaki sütun grafiği elde edilecektir:

GRUP SÜTUN GRAFİĞİ VE YIĞIŞIMLI (STACKED) SÜTUN GRAFİĞİ

Farklı gruplarla ilişkili bir sütun grafiği oluşturulacaksa grup bilgileri uygun matrislere yüklenir. Aşağıda 3 ayrı bölgedeki (bir, iki ve üç bölgeleri) 4 aylık (ocak, şubat, mart, nisan) satış verileri bir grup sütun grafiği ile gösterilmektedir:

BÖLGE OCAK ŞUBAT MART NİSAN
BİR 3 8 5 4
İKİ 6 2 5 8
ÜÇ 4 9 11 4
                      
> renkler<-c("red","blue","yellow")
> bl<-c("bir","iki","uc")
> ay<-c("ocak","subat","mart","nisan")
> satis <- matrix(c(3,8,5,4,6,2,5,8,4,9,11,4),nrow = 3,ncol = 4,byrow = TRUE)
> 
> barplot(satis,main = "toplam satis",names.arg = ay,xlab = "AYLAR",ylab = "SATISLAR",col = renkler)
> legend("topleft", bl, cex = 1.2, fill = renkler)
                      
                    

Sonuç aşağıdaki Şekil BAR_3’te görülmektedir:

KUTU GRAFİĞİ (BOXPLOT)

Kutu grafikleri veri kümesi içinde verinin nasıl dağıldığı konusunda iyi bir fikir verirler. Bu grafiklerde verinin en küçük ve en büyük değerlerini, medyan değerini, ilk ve üçüncü çeyrek değerlerini (quartile - %25) göstermek mümkündür. Böylece farklı veri kümelerini dağılım bakımından kolaylıkla karşılaştırabiliriz.

Kutu grafikleri R dilinde boxplot() fonksiyonu ile gerçekleştirilir.

boxplot (v, data, notch, varwidth, names, main)

Parametrelerin anlamları aşağıdaki gibidir:
v — bir vektör ya da formüldür.
data — bir veri çerçevesi(data frame)dir.
notch — bir mantıksal değerdir. true değeri atanırsa bir çentik(notch)çizilir.
varwidth — mantıksal bir değerdir. true değeri atanırsa kutunun boyutu örnek boyutla orantılı olarak çizilir.
names — grup etiketleridir. Her kutu ile ilşkili bir etiket olablir.
main — grafiğin başlığını atamak için kullanılır.

ÖRNEK:

Aşağıdaki örnek veri verilmiş olsun:

  X   Y
a 21 6
b 21.1 6
c 22.7 4
d 21.8 6
e 18.9 8
f 18.5 6

Bu veriyi bir kutu grafiği ile oluşturalım:

                      
> ad<-c("a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f")
> ad
[1] "a" "b" "c" "d" "e" "f"
 

> x<-c(21,
+      21.1,
+      22.7,
+      21.8,
+      18.9,
+      18.5
+ )
> x
[1] 21.0 21.1 22.7 21.8 18.9 18.5
> y<-c(6,
+      6,
+      4,
+      6,
+      8,
+      6
+ )
> y
[1] 6 6 4 6 8 6
> p<-data.frame(ad,x,y)
> 
> boxplot(x ~ y, data = p, xlab = "y",
+         ylab = "x", main = "x-y iliskisi")
>
                      
                    

Aşağıdaki grafiği elde edeceksiniz:

ÇENTİKLİ KUTU GRAFİĞİ

Çentikli kutu grafiği oluşturarak her gruba ait medyan değerleri ve bunlar arasındaki ilişkileri bulabiliriz. Bu amaçla notch ve varwidth parametrelerini TRUE yapmak yeterli olacaktır:

                      
> boxplot(x ~ y, data = p, 
+         xlab = "y",
+         ylab = "x", 
+         main = "x-y iliskisi",
+         notch = TRUE, 
+         varwidth = TRUE, 
+         col = c("red","yellow","blue"),
+         names = c("YUKSEK","ORTA","DUSUK")
+ )
                      
                    

Sonuçta aşağıdaki grafik elde edilecektir:

HİSTOGRAM

Histogram bir değişkene ait belirli aralıklardaki tekrar değerlerini(frekans) gösteren bir grafiktir. R dilinde histogram oluşturmak için hist( ) fonksiyonu kullanılır. Bu fonksiyon giriş bilgisi olarak bir v veri vektörü ve bazı parametre değerleri alır.

hist( ) fonksiyonunun yazılış biçimi aşağıdaki gibidir:
hist (v, main, xlab, xlim, ylim, breaks, col, border)

Parametrelerin değerleri aşağıdaki gibidir:
v — histogramdaki sayısal değerleri temsil eden bir vektördür.
main — grafiğin başlığıdır
col — histogramın renk paleti için kullanılır.
border — her sütunun sınır çizgilerinin rengini belirler
xlab — x ekseni açıklama ifadesidir.
xlim — x eksenindeki değer aralıklarıdır
ylim — y eksenindeki değer aralıklarıdır.
breaks — her sütunun genişliğini belirlemek için kullanılır.

ÖRNEK:

Aşağıdaki veri verilmiş olsun:

KİŞİ BOY
A 185
B 172
C 165
D 165
E 152
F 167
G 192
H 184
I 168

Şimdi bu verileri temsil eden bir histogram için gerekli komutları vereceğiz:

                      
> boy<-c(185,
+        172,
+        165,
+        173,
+        152,
+        167,
+        192,
+        184,
+        168
+ )
> boy
[1] 185 172 165 173 152 167 192 184 168
> hist(boy,xlab = "BOY",col = "red",border = "blue")
>
                      
                    

Sonuçta aşağıdaki histogram çizilecektir:

Aşağıdaki komutta ise histogram için daha ayrıntılı parametreler kullanılmaktadır:

                      
hist(boy,xlab = "BOY",col = "blue",border = "black", xlim = c(145,200), ylim = c(0,5),
+      breaks = 5)
                      
                    

veri için sınırlar 145 - 200 olarak seçilmiş ,tekrar değerleri için 0 - 5 sınırları getirilmiştir. Sütunlar mavi, sınırları ise siyah olacaktır. Sütun genişlikleri de 5 olur. Sonuçta aşağıdaki histogram çizilecektir:

ÖRNEK:

Aşağıdaki kodu yazınız ve çalıştırınız:

                      
install.packages("RColorBrewer")                        
library(RColorBrewer)
data(VADeaths)
par(mfrow=c(2,3))
hist(VADeaths,breaks=10, col=brewer.pal(4,"Set3"),main="Set3 4 RENK")
hist(VADeaths,breaks=3 ,col=brewer.pal(4,"Set2"),main="Set2 4 RENK")
hist(VADeaths,breaks=7, col=brewer.pal(4,"Set1"),main="Set1 4 RENK")
hist(VADeaths,,breaks= 2, col=brewer.pal(7,"Set3"),main="Set3 7 RENK")
hist(VADeaths,col=brewer.pal(7,"Greys"),main="Greys 7 RENK")
hist(VADeaths,col=brewer.pal(7,"Greens"),main="Greens 7 RENK")
                      
                    

Aşağıda Şekil HIST_3’te görülen çıktıyı elde edeceksiniz:

Şekil HIST_3: Daha karmaşık bir histogram örneği

Şekil HIST_3: Daha karmaşık bir histogram örneği

ÇİZGİ GRAFİĞİ

Çizgi grafiği noktaları doğru parçaları ile bağlayarak oluşturulur. Bu noktalar koordinatlardan birine göre (genellikle x) sıralanmıştır. Genellikle verinin genelindeki trendi görmek için kullanılır. R ‘da çizgi grafiğini oluşturmak için plot( ) fonksiyonu kullanılır. Bu fonksiyonun genel yazılış biçimi aşağıdaki gibidir:

plot (v, type, col, xlab, ylab)

Aşağıda bu parametreler açıklanmıştır:
v — sayısal verileri bulunduran bir vektördür.
type — -3 farklı değer alabilir.
“p" — Sadece noktaları çizer.
“l” — sadece doğruları çizer.
“o” — Hem noktaları hem de doğruları çizecektir.
xlab — x ekseni etiketidir.
ylab — y ekseni etiketidir.
main — grafiğin başlığıdır.
col — nokta ve doğulara renk vermek için kullanılır.

ÖRNEK:

                      
> v<-c(12,5,8,11,7,4,13)
> plot(v,type="o")
>
                      
                    

Bu örnekte v vektörüne ait noktalar ve bunları birleştiren doğru parçaları birlikte çizilecektir. Çizilen şekil aşağıdadır:

ÇİZGİ GRAFİĞİNE BAŞLIK ETİKET VE RENK EKLEMEK

                      
> v<-c(12,34,23,5,41,36,9)
> plot(v,type="o",col="green",xlab="AYLAR",ylab="SATISLAR",main="AYLARA GORE SATISLAR")
>
                      
                    

Yukarıdaki komutlar çalıştırıldığında grafik rengi yeşil olacaktır; x ekseni açıklaması “AYLAR”, y ekseni açıklaması “SATIŞLAR” ve grafik başlığı da “AYLARA GORE SATISLAR” olur. Çizilen şekil aşağıda görülmektedir:

BİR GRAFİKTE BİRDEN FAZLA ÇİZGİ OLUŞTURMAK

Bazı durumlarda aynı eksen üzerine farklı ilişkilere ait veriler görüntülenmesi gerekebilir. Örneğin aşağıdaki grafikte farklı 2 ürünün aylara göre satışları görüntülenmiştir. Bu amaçla plot( ) fonksiyonu ile birlikte lines( ) fonksiyonu da aşağıdaki biçimde kullanılır:

                      
> u<-c(5,22,35,16,22,8,3)
> v<-c(12,34,23,5,41,36,9)
> plot(v,type="o",col="green",xlab="AYLAR",ylab="SATISLAR",main="AYLARA GORE SATISLAR")
> lines(u,type="o",col="red")
>
                      
                    

SAÇILIM GRAFİĞİ (SCATTER PLOT)

Saçılım grafikleri kartezyen düzlem üzerine yerleştirilen çok sayıda noktadan oluşur. Her nokta iki farklı değişkeni temsil eder. Değişkenlerden biri x ekseni üzerinde diğeri ise y ekseni üzerinde olacak şekilde belirlenir. Basit saçılım grafiği plot( ) fonksiyonu kullanılarak çizilir. Fonksiyonun yazılış biçimi aşağıdaki gibidir:

Plot (x, y, main, xlab, ylab, xlim, ylim, axes)

Parametrelerin anlamları aşağıda verilmiştir:
x — Değerleri yatay koordinatlar olan veri kümesidir.
y — değerleri dikey koordinatlar olan veri kümesidir.
main — grafiğin başlığıdır.
xlab — x ekseni etiketidir.
ylab — y ekseni etiketidir.
xlim — çizilecek x değeri sınırlarıdır.
ylim — çizilecek y ekseni sınırlarıdır.
axes — grafik üzerinde her iki eksenin de çizilip çizilmeyeceğini belirler.

ÖRNEK:

Aşağıdaki veri verilmiş olsun:

BOY KİLO
150 56
180 81
156 60
163 70
190 85
178 70
168 80
198 90
182 80
164 74

Bu veriyi bir saçılım grafiği şeklinde göstermek için aşağıdaki komutları girelim:

                      
> a<-c(150,180,156,163,190,178,168,198,182,164)
> b<-c(56,81,60,70,85,70,80,90,80,74)
> p<-data.frame(a,b)
> plot(x = p$a,y = p$b,
+      xlab = "BOY",
+      ylab = "KILO",
+      xlim = c(150,200),
+      ylim = c(40,100),     
+      main = "BOY-KILO"
+ )
>
                      
                    

Sonuçta aşağıdaki grafik elde edilecektir:

SAÇILIM GRAFİĞİ MATRİSLERİ

Veri grubunda ikiden fazla değişken varsa bu değişkenlerin ikişer ilişkilerini görebilmek için saçılım grafik matrisi oluşturulur ve görüntülenir.

Örneğin aşağıdaki veri kümesi verilmiş olsun:

  a   b   c   d
150 56 2 45
180 81 7 90
156 60 13 34
163 70 67 44
190 85 45 22
178 70 65 78
168 80 45 56
198 90 34 25
182 80 22 87
164 74 11 64

Bu veri a, b, c ve d vektörlerine yüklenerek bu vektörlerden oluşan p data frame’i oluşturulur. Daha sonra pairs( ) fonksiyonu yardımı ile (a, b), (a, c), (a, d), (b, c), (b, d), (c, d) ilişkilerini gösteren 4x4=16 elemanlı bir saçılım grafiği matrisi oluşturulacaktır:

                      
> a
 [1] 150 180 156 163 190 178 168 198 182 164
> b
 [1] 56 81 60 70 85 70 80 90 80 74
> c<-c(2,7,13,67,45,65,45,34,22,11)
> d<-c(45,90,34,44,22,78,56,25,87,64)
> p<-data.frame(a,b,c,d)
> pairs(~a+b+c+d,data = p,
+       main = "Scatterplot Matrix")
>
                      
                    

Saçılım grafiği matrisi aşağıdaki şekilde görülmektedir:

R İLE TEMEL İSTATİSTİK İŞLEMLERİ

ELEMANTER İSTATİSTİĞE GİRİŞ

Bu bölümde temel istatistik işlemlerini R ile nasıl yapabileceğimizi göstereceğiz.

ORTALAMA (MEAN, AVERAGE)

                      
> x<-sample(x=1:100,size=100,replace=TRUE)
> x
  [1]  53  29 100  40  85  64  54  94  36  30  55  94  13  23  59  53  88  64   9  64  53   8  82  63  54  92  66  71  36  16   8   1
 [33]  28  45  98  43  16  57  95  52  47  40  61  25  88  36  47  76  18  68  14  88  34  58  66  70  23  92  80  51  24  98  21  57
 [65]  42  21  77  39 100  66  27  85  53  30  28  49  45  56  98  71  19  85  91  63  92  23  57  50  77  30  14  44  13  93  14  10
 [97]  74  52  18  11
> mean(x)
[1] 51.9

> y<-x
> y[sample(x=1:100,size=15,replace=FALSE)]<-NA
> y
  [1]  NA  29 100  NA  85  64  54  94  36  30  55  94  13  23  59  53  88  64   9  64  53   8  82  63  NA  92  NA  71  36  16   8  NA
 [33]  28  45  98  43  16  57  95  52  47  40  61  25  88  36  47  76  18  68  14  88  NA  58  66  70  23  92  80  51  24  98  21  57
 [65]  42  21  77  39 100  66  NA  85  53  30  28  49  45  56  98  71  19  85  91  63  92  NA  NA  50  77  30  NA  44  NA  NA  NA  10
 [97]  NA  NA  18  11
> mean(y)
[1] NA
> mean(y,na.rm=TRUE)
[1] 53.824
                      
                    

AĞIRLIKLI ORTALAMA (WEIGHTED MEAN)

                      
> not<-c(45,67,13,44,93)
> ag<-c(4,5,2,2,3)
> mean(not)
[1] 52.4
> aort<-weighted.mean(x=not,w=ag)
> aort
[1] 56.75
                      
                    

VARYANS

                      
> var(not)
[1] 884.8
>
> sum((not-mean(not))^2)/(length(not)-1)
[1] 884.8
>
                      
                    

STANDART SAPMA (STANDARD DEVIATION)

                      
> sqrt(var(not))
[1] 29.746
> sd(not)
[1] 29.746
                      
                    

EN KÜÇÜK DEĞER (MINIMUM)

                      
> not
[1] 45 67 13 44 93
> min(not)
[1] 13
                      
                    

EN BÜYÜK DEĞER (MAXIMUM)

                      
> max(not)
[1] 93
                      
                    

ORTADAKİ DEĞER (MEDIAN)

                      
> median(not)
[1] 45
>
                      
                    

SUMMARY FONKSİYONU

Yukarıda farklı fonksiyonlarla bulduğumuz medyan, minimum, maksimum değerleri ve ilave olarak 1. ve 3. dağılım (quantile) değerlerini summary fonksiyonu yardımı ile bulabiliriz:

                      
> summary(not)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   13.0    44.0    45.0    52.4    67.0    93.0 
                      
                    

1. ve 3. Kuvantil için quantile fonksiyonunu da kullanabilirsiniz:

                      
> quantile(not,probs=c(0.25,0.75))
25% 75% 
 44  67
                      
                    

quantile fonksiyonu ile diğer dağılımları da hesaplayabilirsiniz:

                      
> quantile(not,probs=c(0.1,0.25,0.5,0.75,0.99))
  10%   25%   50%   75%   99% 
25.40 44.00 45.00 67.00 91.96 
                      
                    

KORELASYON VE KOVARYANS (CORELATION AND COVARIANCE)

Birden fazla değişken ile işlemler söz konusu olduğunda bunlardan birinin diğerleri ile ilişkisi önem kazanır. Bununla ilişkili iki basit metot korelasyon ve kovaryanstır.

R ortamındaki ggplot2 paketinden economics adlı paketi yükleyeceğiz:

                      
> require(ggplot2)
> head(economics)
        date        pce         pop      psavert       uempmed       unemploy
1 1967-06-30      507.8      198712          9.8           4.5           2944
2 1967-07-31      510.9      198911          9.8           4.7           2945
3 1967-08-31      516.7      199113          9.0           4.6           2958
4 1967-09-30      513.3      199311          9.8           4.9           3143
5 1967-10-31      518.5      199498          9.7           4.7           3066
6 1967-11-30      526.2      199657          9.4           4.8           3018
>

> cor(economics$pce,economics$psavert)
[1] -0.92712 
                      
                    

Burada pce ve psavert değişkenleri arasındaki korelasyon -0.92712 bulunmuştur.

Korelasyon hakkında aşağıdakiler söylenebilir;
Korelasyon = 1 ise iki değişken tam ilişkili (Biri artarken öbürü de artıyor).
Korelasyon = 0 ise iki değişken arasında ilişki yok.
Korelasyon = -1 ise iki değişken arasında zıt ilişki (biri artarken diğeri azalıyor)

Aynı anda birden çok değişken arasındaki korelasyonlar da aşağıdaki gibi hesaplanır:

                      
> cor(economics[,c(2,4:6)])
                   pce            psavert      uempmed       unemploy
pce            1.00000          -0.927122      0.51459       0.324415
psavert       -0.92712           1.000000     -0.36153      -0.076417
uempmed        0.51459          -0.361530      1.00000       0.784279
unemploy       0.32442          -0.076417      0.78428       1.000000
>
                      
                    

Gally PAKETİNİN YÜKLENMESİ

Yukarıda sayısal olarak elde edilen tabloyu grafiksel olarak ta görüntülemek faydalı olacaktır. Bunun için R’de GGally paketinin yüklenmesi gerekir:

                      
> install.packages("GGally")
--- Please select a CRAN mirror for use in this session ---
                      
                    

KALİTATİF VERİ (QUALITATIVE DATA)

Bir veri örneği önceden tanımlanmış ve ayrık sınıflara ait veri elemanlarını içeriyorsa bu veri örneği kalitatif veridir. Kalitatif verinin bir diğer adı da kategorik (categorical) veridir. Örnek olarak kredi derecelendirme kuruluşlarının verdikleri notlar (AAA, BB+ gibi), öğrencilerin harf notları(A, A+, B, B+, vb.) ya da elbise bedenleri bu tür verilere örnektir.

Bu bölümdeki örneklerde R ortamında hazır olarak bulunan MASS adlı veri paketinden yararlanılacaktır.

                      
> library(MASS)
> painters
                Composition     Drawing     Colour    Expression      School
Da Udine                 10           8         16             3           A
Da Vinci                 15          16          4            14           A
Del Piombo                8          13         16             7           A
Del Sarto                12          16          9             8           A
Fr. Penni                 0          15          8             0           A
Guilio Romano            15          16          4            14           A
Michelangelo              8          17          4             8           A
Perino del Vaga          15          16          7             6           A
Perugino                  4          12         10             4           A
Raphael                  17          18         12            18           A
F. Zucarro               10          13          8             8           B
Fr. Salviata             13          15          8             8           B
                      
                    

                      
> painters$School
 [1] A A A A A A A A A A B B B B B B C C C C C C D D D D D D D D D D E E E E E E E F F F F G G G G G
[49] G G H H H H
Levels: A B C D E F G H
>
                      
                    

MASS veri paketi içinde painters adlı data frame 18. Yüzyıldaki bazı ressamlarla ilişkili bilgileri içermektedir.

OLASILIK DAĞILIMLARI (PROBABILITY DISTRIBUTIONS)

NORMAL DAĞILIM (NORMAL DISTRIBUTION)

Bu dağılım türü en çok kullanılan ve en ünlü dağılım normal dağılımdır. Aynı zamanda Gauss dağılımı olarak ta adlandırılır ve:

şeklinde tanımlanır. Burada, μ ortalama ve σ ise standart sapmadır. Bu fonksiyon tabiattaki pek çok olayı açıklayan çan eğrisi şeklindedir.

Normal dağılıma uyan rastgele sayı üretmek için R’de rnorm fonksiyonu kullanılır. Standart 0 - 1 arasında rastgele sayı üretmek için,

                      
> rnorm(n=10)
 [1]  0.38712  0.63897  0.16578 -0.20121 -0.86933  0.48390 -0.56884  1.57274 -1.31969  0.64565
>
                      
                    

Ortalaması 100 ve standart sapması 30 olan normal dağılmış 20 adet veri üretmek için:

                      
>rnorm(n=20,mean=100,sd=30)

 [1] 114.350 117.044  61.425 132.246  58.112  68.709  52.656 107.878 103.280 114.098  39.423  81.839  78.944 114.183  92.093 120.175
[17]  67.684 111.835  87.621  77.465
                      
                    

Normal dağılım için yoğunluk (belli bir değerin olma olasılığı) dnorm fonksiyonu ile hesaplanır:

                      
> rasNormal_10<-rnorm(10)
> rasNormal_10
 [1] -0.25801     0.44485    -0.94683    -0.82827    -0.89303      -0.39023     2.35820    -0.30788     0.18392     1.55962
> dnorm(rasNormal_10)
 [1] 0.385882    0.361359    0.254825    0.283100     0.267752 0.369695     0.024736    0.380475    0.392251    0.118227
>
> dnorm(c(-1,0,1))
[1] 0.24197        0.39894          0.24197
>

rasNorm<-rnorm(10000)
> rasYog<-dnorm(rasNorm)
> require(ggplot2)
>ggplot(data.frame(x=rasNorm,y=rasYog))+aes(x=x,y=y)+geom_point()+labs(x="Rastgele NormalDegisken",y="Yogunluk")
>
                      
                    

Yukarıdaki grafik rastgele normal değişken değerleri ve onların yoğunluklarını çan eğrisi olarak görüntülüyor.

KÜMÜLATİF OLASILIK DAĞILIMI

Kümülatif olasılık fonksiyonu verilen bir değer ve ondan küçük değerlerin elde edilme olasılığını verir ve R’de pnorm fonksiyonu ile hesaplanır.

                      
> rasNormal_10<-rnorm(10)
> rasNormal_10
 [1] -0.384678 -1.895187 -0.376966 -0.538078  0.094592 -0.625983  0.470401  0.548657  1.266534  1.759449
> pnorm(rasNormal_10)
 [1] 0.350238 0.029034 0.353099 0.295262 0.537681 0.265663 0.680966 0.708380 0.897339 0.960749
>
> p<-ggplot(data.frame(x=rasNorm,y=rasYog))+aes(x=x,y=y)+geom_line()+labs(x="x",y="YOGUNLUK")
> p
>
                      
                    

                      
> negS<-seq(from=min(rasNorm),to=-1,by=.1)
> kucBir<-data.frame(x=negS,y=dnorm(negS))
> head(kucBir)
        x          y
1 -3.7287 0.00038179
2 -3.6287 0.00055156
3 -3.5287 0.00078888
4 -3.4287 0.00111710
5 -3.3287 0.00156613
6 -3.2287 0.00217380
> kucBir<-rbind(c(min(rasNorm),0),kucBir,c(max(kucBir$x),0))
> p+geom_polygon(data=kucBir,aes(x=x,y=y))
>
                      
                    

-1,1 ARALIĞI İÇİN

                      
> nnseq<-seq(from=-1,to=1,by=0.1)
> head(nnseq)
[1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5
> nn1<-data.frame(x=nnseq,y=dnorm(nnseq))
> nn1<-rbind(c(min(nn1$x),0),nn1,c(max(nn1$x),0))
> p+geom_polygon(data=nn1,aes(x=x,y=y))
                      
                    

KALİTATİF VERİNİN FREKANS DAĞILIMINI (Frequency Distribution) BULMAK

ÖRNEK:

painters adlı tabloda ressamların okul dağılımını bulunuz. (Her okulda(A, B, C gibi) kaç ressam bulunuyor?)

                      
> library(MASS)
> painters$School
 [1] A A A A A A A A A A B B B B B B C C C C C C D D D D D D D D D D E E E E E E E F F F F G G G G G
[49] G G H H H H
Levels: A B C D E F G H
> okul=painters$School
>  okul.freq = table(okul)
> okul.freq
okul
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 
>
                      
                    

Böylece her okuldan (sınıf) kaçar tane ressam bulunduğunu gösteren frekans dağılımı tablosu bulunmuştur.

cbind fonksiyonu yardımı ile bu bilgiyi düşey olarak yazdırabiliriz:

                      
> cbind(okul.freq)
  okul.freq
A        10
B         6
C         6
D        10
E         7
F         4
G         7
H         4
>
                      
                    

KALİTATİF VERİ İÇİN RÖLATİF FREKANS DAĞILIMI (Relative Frequency Distribution of Qualitative Data)

Rölatif frekans dağılımı aşağıdaki bağıntıya göre hesaplanır:

Rölatif Frek.Dağ = Frekans/ÖrnekBüyüklüğü

ÖRNEK:

                      
> library(MASS)
> okul=painters$School
> okul.freq = table(okul)
> okul.freq
okul
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 
> okul.relfreq=okul.freq/nrow(painters)
> okul.relfreq
okul
         A          B          C          D          E          F          G          H 
0.18518519 0.11111111 0.11111111 0.18518519 0.12962963 0.07407407 0.12962963 0.07407407 
>
                      
                    

Aşağıda ondalık noktadan sonra yazdırılacak rakam sayısı sınırlanmıştır.

                      
> old = options(digits=1) 
> okul.relfreq
okul
   A    B    C    D    E    F    G    H 
0.19 0.11 0.11 0.19 0.13 0.07 0.13 0.07 
> cbind(okul.relfreq)
  okul.relfreq
A         0.19
B         0.11
C         0.11
D         0.19
E         0.13
F         0.07
G         0.13
H         0.07
>
                      
                    

SÜTUN GRAFİĞİ (BAR GRAPH)

Kalitatif veriler için sütun grafiği, frekans dağılımını orantılı büyüklükteki dikdörtgenlerle gösterir.

ÖRNEK:

                      
> library(MASS)
> okul=painters$School
> okul.freq = table(okul)
> okul.freq
okul
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 
> barplot(okul.freq)
>
                      
                    

GRAFİĞİ RENKLENDİRME

                      
> colors = c("red", "blue", "green", "violet",   "orange", "white", "pink", "cyan") 
>  barplot(okul.freq,  col=colors)
>
                      
                    

DAİRE GRAFİĞİ (PIE CHART)

                      
> library(MASS)
> okul=painters$School
> okul.freq = table(okul)
> okul.freq
okul
 A  B  C  D  E  F  G  H 
10  6  6 10  7  4  7  4 
> pie(okul.freq)
>
                      
                    

RENKLERİ KULLANICININ BELİRLEMESİ

                      
> colors = c("red", "blue", "green", "violet",   "orange", "white", "pink", "cyan") 
> pie(okul.freq,col=colors)
                      
                    

KATEGORİK İSTATİSTİK (Category Statistics)

Painters veri kümesinde ressamların ait oldukları okullara göre sınıflandırıldığını görmüştük. (A, B, C gibi) Her okul kendisine ait çeşitli istatistiki bilgi ile karakterize edilebilir. (ortalama kompozisyon notu, çizim, renk, ifade notları gibi) Biz de burada ortalama kompozisyon notu en yüksek olan okulu bulmak isteyebiliriz.

Şimdi bu tür işlemleri gerçekleştireceğiz:

ÖRNEK:

C okulunun ortalama kompozisyon notu nedir?

                      
> library(MASS) 
> okul = painters$School
> c_okul = okul == "C"
>  c_painters = painters[c_okul, ]
> old =options(digits=5)
> mean(c_painters$Composition)
[1] 13.167
>
                      
                    

Alternatif olarak aynı soru için aşağıdaki fonksiyon da çalıştırılabilir.

                      
> tapply(painters$Composition, painters$School, mean) 
     A      B      C      D      E      F      G      H 
10.400 12.167 13.167  9.100 13.571  7.250 13.857 14.000 
>
                      
                    

Yukarıda gördüğünüz gibi tapply fonksiyonu yardımı ile her sınıfa ait kompozisyon ortalamaları aynı anda hesaplanabilir.

KANTİTATİF VERİ (Quantitative Data)

Kantitatif veri (sürekli-continuous olarak ta anılır) aritmetik işlemlerde kullanılabilen sayısal değerlerden oluşur. Bu doğal olarak kalitatif verinin tam tersidir. Yukarıda belirtildiği gibi kalitatif verilerde önceden tanımlanmış sınıflara ait veriler söz konusudur ve bu veriler aritmetiksel işlemlere sokulamaz.

Bu bölümde kullanılacak veriler faithful adlı veri paketi içinden alınacaktır. Bu veri ABD Yellowstone Ulusal parkındaki sıcak su kaynağı gözlem verileridir. Aşağıda head fonksiyonu ile faithful veri paketi listelenmektedir:

                      
> head(faithful)
  eruptions waiting
1     3.600      79
2     1.800      54
3     3.333      74
4     2.283      62
5     4.533      85
6     2.883      55
>
                      
                    

Yukarıdaki veride iki gözlem değişkeni mevcuttur:

  1. I. Eruption: Sıcak su kaynağının püskürtme süresidir.
  2. II. Waiting: Bir sonraki püskürtmeye kadar geçen bekleme süresidir.

KANTİTATİF VERİ İÇİN FREKANS DAĞILIMI (Frequency Distribution of Quantitative Data)

Frekans dağılımı çakışma durumları olmayan sınıflardaki veri tekrarlarının sayısı olarak ifade edilebilir.

ÖRNEK:

Faithful veri paketinde püskürtmeler için frekans dağılımı, püskürtme sürelerinin bazı sınıflandırmaları için püskürtmelerin toplamıdır. Faithful verisinde püskürtmeler için frekans dağılımını bulalım.

Çözüm birkaç adımdan oluşacaktır:

  1. 1) range fonksiyonu yardımı ile püskürtme sürelerinin aralığını bulmalıyız:
                            
    > sure= faithful$eruptions 
    > range(sure)
    [1] 1.6 5.1
    >
                            
                          

  2. 2) Daha sonra tüm aralığı alt aralıklara bölmeliyiz. Alt aralıklar için çakışmalar olmamalıdır. Limitler 1.6 - 5.1 olduğu için yuvarlatma ile 1.5 - 5.5 alıp 0.5 adımlarla alt aralıkları oluşturabiliriz:
                            
    > altaralik= seq(1.5, 5.5, by=0.5) 
    > altaralik
    [1] 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
    >
                            
                          

  3. 3) Aralığı soldan kapalı sağdan açık olarak tanımlamak için aşağıdaki fonksiyonu kullanıyoruz:
                            
    > sure.cut = cut(sure, altaralik, right=FALSE)
                            
                          

  4. 4) table fonksiyonu ile de frekans dağılımını buluyoruz:
                            
    > sure.freq = table(sure.cut)
    > sure.freq
    sure.cut
    [1.5,2) [2,2.5) [2.5,3) [3,3.5) [3.5,4) [4,4.5) [4.5,5) [5,5.5) 
         51      41      5        7     30       73     61       4 
    >                        
                          

FREKANS DAĞILIMINI SÜTUN FORMATINDA OLUŞTURMAK

cbind fonksiyonu yardımı ile frekans dağılımını sütun formatında oluşturabiliriz:

                        
> cbind(sure.freq)
        sure.freq
[1.5,2)        51
[2,2.5)        41
[2.5,3)         5
[3,3.5)         7
[3.5,4)        30
[4,4.5)        73
[4.5,5)        61
[5,5.5)         4
>
                    
                      

HİSTOGRAM ÇİZİMİ

Frekans dağılımının sütun grafiği şeklindeki temsili anlamındaki histogramın çizimi için hist fonksiyonu kullanılır:

                      
> hist(sure,  right=FALSE) 
                      
                    

HİSTOGRAMI RENKLİ HALE GETİRMEK

Hist fonksiyonunu aşağıdaki biçimde kullanarak histogramı istediğiniz biçime getirebilirsiniz:

                      
> colors = c("red", "yellow", "green", "violet", "orange",   "blue", "pink", "cyan")
> hist(sure, right=FALSE, col=colors, main="Old Faithful PUSKURTMELERI", xlab="SURE-dakika")
> 
                      
                    

R DİLİNDE KONTROL KOMUTLARI

KONTROL AKIŞI

Diğer bilgisayar dillerinde olduğu gibi R dilinde de kontrol yapıları dilin en önemli parçasını oluşturur. Başka bir deyişle kontrol yapıları olmasaydı bilgisayar programları sadece bilgisayara bilgi giriş-çıkışı dışında bir işlemi gerçekleştiremezdi.

Bu bölüme kadar verilen programlar bir anlamda bir düz hat programları olarak görülebilir. Yani şu ana kadar verilen programlarda bir komuttan sonra aradaki komutları atlayarak başka bir noktaya sıçrama söz konusu değildir.

Bir bilgisayar programında komutlar, normal olarak yazılış sırasına göre çalışır. Örneğin herhangi bir programlama dilinde yazılmış olan,

Komut1
Komut2
Komut3
........
Komutn-1
Komutn

şeklindeki bir programda önce Komut1 , sonra Komut2 , daha sonra Komut3 , ... , Komutn-1 ve en son da Komutn çalışacaktır.

Birçok programlama problemi bu kadar basit değildir. Programlama dillerinin büyük gücü aynı işi defalarca yapabilmelerinden ya da değişik parametre değerleri için değişik işler ortaya çıkarabilmelerinden gelir.

Kontrol komutları yukarıda bahsedilen doğrusal akış sırasını değiştirebilen komutlardır. Örneğin Komut2 bir kontrol komutu olsaydı, bu komut bir koşulu kontrol ederek koşulun sonucuna göre, Komut3, Komut4 ve Komut5’i atlayarak programın çalışmasını doğrudan Komut6’ya gönderebilirdi. Bir bilgisayar programında programın kontrolünün aradaki komutlar atlanarak bir komuttan diğerine sıçramasına dallanma (branching) adı verilir. Bu anlamda kontrol komutları dallanmayı gerçekleştiren komutlardır.

Diğer bilgisayar programlama dillerinde olduğu gibi R dilinde de esas olarak iki farklı tipte kontrol yapısı ya da komutu mevcuttur:

  1. 1. Seçme (selection) işlemini gerçekleştiren kontrol komutları: Bu tip kontrol komutlarında bir ifade kontrol edilerek ifadenin değerine göre çeşitli seçeneklerden bir tanesine dallanma işlemi gerçekleştirilir. if, if else, switch gibi yapılar bu tür komutları oluşturur.
  2. 2. Tekrarlama (loop, repetition) : Bu tip kontrol yapılarında bir işlemler grubu bir koşula bağlı olarak belirli sayıda (10 kez,50 kez gibi) tekrarlı olarak çalıştırılır. Bunlar repeat, for, while gibi komutlardır.

Aşağıda R dilindeki bütün kontrol yapıları tüm ayrıntıları ile verilmektedir.

SEÇME (SELECTION) TİPİNDEKİ KONTROL DEYİMLERİ

if DEYİMİ

if deyimi R dilinde şartlı dallanma (conditional branching) adı verilen işlemi gerçekleştiren bir deyimdir. Şartlı dallanma herhangi bir programlama dili için temel kontrol yapısıdır. Şartlı dallanma işlemi sayesinde bir program kararlar alma imkanına kavuşur; bir ifadenin sonucuna göre bir komutlar dizisinin çalışıp çalışmayacağına karar verebilir.

İfadenin değeri her çalışmada değişebileceği için bu özellik, bir programa farklı verilere karşı farklı şekillerde davranma imkanı sağlar. R dilinde şartlı dallanma if ve else anahtar sözcükleri ile gerçekleştirilir. if deyiminin en basit şekli için yazılış biçimi aşağıdaki gibidir:

                      
if (ifade) { 
deyim1;
}
deyim2
                      
                    

Burada ifadenin değeri doğru (true) ise deyim çalışır sonra sıra deyim2’ye geçer. İfadenin değeri yanlış(false) ise bu durumda da doğrudan deyim2’ye geçilir. İfadenin değeri yanlış ise deyim1 çalışmayacaktır. Aşağıda if yapısını açıklayan bir akış diyagramı verilmiştir.

Sekil8_1: if deyimi için akış diyagramı (flow chart)

Sekil8_1: if deyimi için akış diyagramı (flow chart)

R’da ‘doğru’ ve ‘yanlış’ın ne anlama geldiğini belirtmekte yarar vardır.

İfadenin doğru olması demek işlemin boolean tipinde değeri true (doğru) olan bir değer üretmesi demektir. İfadenin yanlış olması ise boolean tipinde değeri false (yanlış) olan bir değer üretilmesi anlamına gelir.

if deyimi else sözcüğü ile birlikte aşağıdaki gibi kullanılır:

                      
if (ifade)  
  {deyim1 }
  
else   
  {deyim2}

deyim3
...
                      
                    

Bu durumda ifadenin değeri doğru ise deyim1 çalıştırılır ve sonra deyim3’e geçilir. İfadenin değeri yanlış ise bu durumda da deyim1 atlanarak doğrudan else’i izleyen deyim2’ye geçilecek ve bu çalıştıktan sonra da deyim3 ile devam edilecektir. Aşağıda bu yapı ile ilişkili bir akış diyagramı verilmiştir.

Şekil 8_2: if else deyimi için akış diyagramı (flow chart)

Şekil 8_2: if else deyimi için akış diyagramı (flow chart)

if deyiminde ifadenin değeri doğru olduğu zaman sadece deyim1 gibi tek bir deyim değil de bir deyimler grubunun çalışması isteniyorsa bu durumda bu deyimler grubu { } sembolleri ile blok içine alınmalıdır:

                      
if(ifade)
  { deyim1
  deyim2
  …
  deyim_n }

  deyim_x
  …
                      
                    

Bu durumda ifade doğru ise deyim1, deyim2, …, deyim_n ile belirtilen deyimler grubunun tümü çalışarak deyim_x’e geçilecektir. İfade yanlış ise de bu durumda if’e ait deyimler bloğu atlanarak doğrudan deyim_x’e geçilecektir.

Aynı şey if else yapısı için de söz konusudur:

                      
if(ifade) {
  Deyim1
  Deyim2
  ...  
  deyim_n
}

else {
  deyim_n+1
  deyim_n+2
  ...
  deyim_m
}

deyim_k
...

                      
                    

Yukarıdaki yapıda ifade doğru ise deyim1, deyim2, ..., deyim_n icra edilerek deyim_k’ya geçilecektir. İfade yanlış ise bu durumda da if içindeki deyimler atlanarak sadece deyim_n+1, deyim_n+2, ..., deyim_m çalışır ve program deyim_k’ya erişir.

ÖRNEK:

                      
x = 15
if(x>10){print("sayi ondan buyuktur")}
 [1] "sayi ondan buyuktur"
>
                      
                    

Bu çok basit programda x sayısı 10’dan daha büyük bir değer aldığı zaman program yukarıdaki çıktıda görülen mesajı verecek fakat 10 ya da daha küçük bir sayı girilirse bu durumda herhangi bir mesaj görüntülenmeyecektir.

ÖRNEK:

                      
a = 15

if(a>10.0) {print("SAYINIZ 10 DAN BUYUK..")} else { print("SAYINIZ 10 YA DA 10 DAN KUCUKTUR..")}
                      
                    

PROGRAMIN ÇIKTISI

                      
[1] "SAYINIZ 10 DAN BUYUK.."
>
                      
                    

Bu programda klavyeden 10’dan büyük bir sayı girilirse aşağıdaki çıktı elde edilir. 10 ya da daha küçük bir sayı girilirse de aşağıda görüldüğü gibi,

                      
[1] "SAYINIZ 10 YA DA 10 DAN KUCUKTUR.."
>
                      
                    

mesajı gelecektir. Böylece if-else yapısı ile daha kapsamlı bir kontrol işleminin gerçekleştirilebileceği söylenebilir.

ÖRNEK:

Aşağıda karekök hesaplayan bir R programı verilmiştir:

                      
> sayi=81
> if (sayi < 0) {print(" SAYI NEGATIFTIR") }else{print ("SAYININ KAREKOKU=");print(sqrt(sayi))}
                      
                    

PROGRAMININ ÇIKTISI

                      
[1] "SAYININ KAREKOKU="
[1] 9
                      
                    

Negatif sayı için program aşağıdaki gibi çalışır;

                      
sayi=-5
if (sayi < 0) {print(" SAYI NEGATIFTIR") }else{print ("SAYININ KAREKOKU=");print(sqrt(sayi))}
                      
                    

PROGRAMININ ÇIKTISI

                      
[1] " SAYI NEGATIFTIR"
>
>
                      
                    

Programda verilen bir sayının karekökünü hesaplayan sqrt fonksiyonu kullanılmıştır.

KARŞILAŞTIRMA İFADELERİ

Doğal olarak şartlı bir ifadede iki değer arasında karşılaştırma işlemi gereklidir. Bazen ilişkisel operatörler olarak ta anılan (relational operators) 6 karşılaştırma operatörü vardır. Bunlar aşağıdaki tabloda belirtilmiştir:

Karşılaştırma Operatörü İşlevi
< den daha küçük
> den daha büyük
<= küçük veya eşit
>= büyük veya eşit
== (Peşpeşe iki = sembolü) eşit
!= eşit değil

R dilinde de karşılaştırma sonucu doğru ise Boolean tipinde true(doğru) değeri elde edilir. Sonuç yanlış ise de Boolean tipinde false (yanlış) değeri elde edilir.

İfade Değer
-12 < 0 true
0 > 23 false
1 == 1 true
3 != 7 true
1 > -2 true
6 > 8 false

Aşağıdaki R programı ise çeşitli karşılaştırma işlemlerinin sonuçlarını ekrana aktarmaktadır:

ÖRNEK:

                      
> print("2>3=")
[1] "2>3="

> print(2>3)
[1] FALSE

> print("6>5")
[1] "6>5"

> print(6>5)
[1] TRUE

> print("3=3")
[1] "3=3"

> print(3==3)
[1] TRUE

> print("2!=4")
[1] "2!=4"

> print(2!=4)
[1] TRUE
>
                      
                    

UYARI: Karşılaştırma işlemlerinde eşitlik kontrolünün == sembolü yerine (yani peş peşe iki = sembolü) yanlışlıkla = sembolü ile yapılması durumu.

Bu durumda aşağıdaki hata mesajını alacaksınız:

                      
> print(3=3)
Error: unexpected '=' in "print(3="
>
                      
                    

İÇ İÇE IF DEYİMLERİ (NESTED IF STATEMENTS)

Tek bir if deyimi programın iki seçenekten birini seçmesine olanak sağlar. Fakat birçok pratik uygulamada tek bir if deyimi yetersiz kalır. Birinci kararı aldıktan sonra ikinci karar, ikinciden sonra üçüncü kararın alınması gerekebilir.  Bu tipte bir program akışı, iç içe if deyimlerini gerektirir.

IF-ELSE-IF BASAMAK YAPISI

Birbirini izleyen çok sayıda koşul kontrolünü gerçekleştirmeye yarayan bir yapı if-else-if basamağı adını alır ve yazılış biçimi aşağıdaki gibidir:

                      
if (ifade1)
    Deyim1;
else if (ifade2)
    Deyim2;
else if (ifade3)
    Deyim3;
...
else
    Deyim_n;
Deyim_n+1;                  
                      
                    

Bu yapı şu şekilde çalışmaktadır:

Önce ifade1 kontrol edilir;bu ifade doğru ise Deyim1 çalışır ve sonra Deyim_n+1’e geçilir.

İfade1 yanlış ise o takdirde ifade2 kontrol edilir. Bu ifade doğru ise bu durumda sadece Deyim2 çalışır ve sonra Deyim_n+1’e geçilir.

İfade2 yanlış ise ifade3 kontrol edilir. Bu ifade doğru ise bu durumda sadece Deyim3 çalışır ve sonra Deyim_n+1’e geçilir. Bu işlemler daha fazla sayıda else if bulunduğu takdirde aynı şekilde devam eder.

if’ler ile kontrol edilen ifadelerin tümü de yanlış ise bu durumda programın kontrolü else’i izleyen Deyim_n’e geçer ve bu deyim çalışır. Daha sonra kontrol Deyim_n+1’e geçecektir.

Yukarıdaki yapı içinde Deyim1, Deyim2, .., Deyim_n ile belirtilen birimler tek bir deyimden ibaret olabileceği gibi { } sembolleri içine alınmış deyimler grubundan da oluşabilir.

ÖRNEK:

Bir üniversitede harf notları aşağıdaki biçimde belirlenmektedir:

Notu Harf Notu
< 50 F
>=50 ve <70 C
>=70 ve <85 B
>=85 A

Buna göre sayısal Notu verilen bir öğrencinin harf notunu hesaplayan bir R programını aşağıdaki gibi yazabiliriz:

                      
Notu=70
if ( Notu<50 ) {print("F")} 
else if (Notu < 70 ) 
{print("C")} else if (notu<85){print("B")} 
else{print("A")}
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] "B"
>                        
                      
                    

Program aşağıdaki şekilde değiştirilsin:

                      
Notu=40
if ( Notu<50 ) {print("F")} 
else if (Notu < 70 ) {print("C")} 
else if (notu<85){print("B")} 
else{print("A")}
             
                      
                    

PROGRAMIN ÇIKTISI:

Bu durumda çıktı aşağıdaki gibi olacaktır:

                      
[1] "F"
>      
                      
                    

Şimdi de Notu değişkeni için farklı bir değer verelim:

                      
Notu = 90
if ( Notu < 50 ) {
print("F")
} 
else if (Notu < 70 ) {print("C")} 
else if (Notu<85){print("B")} 
else{print("A")}

                
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] "A"
>      
                      
                    

ÖRNEK:
İKİNCİ DERECE DENKLEMİNİN KÖKLERİNİN BULUNMASI

Lise yıllarında öğrendiğimiz ikinci derece denklemi,

ax 2 + bx + c = 0

şeklindedir ve denklemin köklerinin varlığı hakkında bilgi sahibi olabilmek için denklemin diskriminantı adı verilen,

Δ = b 2 - 4ac

İfadesinin hesaplanması gerekir. Diskriminantın değerlerine göre eğer Δ < 0 ise denklemin gerçek sayılarla ifade edilebilecek bir kökü yoktur. Δ = 0 ise denklemin değerleri birbirine eşit olan iki kökü vardır ve bunlar x 1 = x 2 = - b / 2a şeklinde hesaplanırlar. Bunlara iki kat kök ya da çakışık kök adı verilir. Δ > 0 ise de denklemin birbirinden farklı iki gerçek kökü vardır ve bunlar,

şeklinde hesaplanırlar.

ÖRNEK:
İKİNCİ DERECE DENKLEMİNİN KÖKLERİNİ BULAN R PROGRAMININ LİSTESİ

                      
a = 1
b = 1
c = 1
delta = b*b - 4*a*c;
if (delta < 0) {print("GERCEK KOK YOK ")} 
else if (delta == 0){x1 = -b/(2*a);print("x1=x2");print(x1)} 
else {x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);print(x1);print(x2) }
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] "GERCEK KOK YOK "
>
                      
                    

Program aşağıdaki şekilde değiştirilsin:

                      
a=1
b=-2
c=1
delta=b*b-4*a*c;
if(delta<0){print("GERCEK KOK YOK ")} else if (delta==0){x1=-b/(2*a);print("x1=x2");print(x1)} else {x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);print(x1);print(x2) }
                      
                    

PROGRAMIN ÇIKTISI:

Bu durumda aşağıdaki çıktı alınır:

                      
[1] "x1=x2"
[1] 1
>
                      
                    

Ve nihayet program listesi aşağıdaki gibi olsun:

                      
a=1
b=-5
c=6
delta=b*b-4*a*c;
if(delta<0){print("GERCEK KOK YOK ")} else if (delta==0){x1=-b/(2*a);print("x1=x2");print(x1)} else {x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);print(x1);print(x2) }
                      
                    

PROGRAMIN ÇIKTISI:

Bu durumda da aşağıdaki çıktı elde edilecektir:

                      
[1] 3
[1] 2
>
                      
                    

SWITCH KOMUTU

Bir programda çok sayıda koşul kontrolü ve bunların sonucuna göre gerçekleştirilmesi gereken işlemler varsa if-else, yapıları ile akışın izlenmesi zorlaşabilir. Bu durumlar genellikle switch deyiminin kullanılmasının gerekli olacağı durumlardır. switch deyimi tek bir ifadenin değerine göre sınırsız sayıda çalışma yolu belirleme imkânı tanıyan bir komuttur.

R dilinde switch komutunun yazılış biçimi aşağıdaki şekildedir:

switch (ifade, Durum1, Durum2, ...., Durum_n)

Burada,

                      
ifade=1 ise Durum1,
ifade=2 ise Durum2,
ifade=n ise Durum_n 
                      
                    

çalışır.

ÖRNEK:

                      
x = 4
y <- switch(x,"A","B","C","D","E","F")
print(y)
                      
                    

Sonuçta aşağıdaki çıktı elde edilecektir:

PROGRAMIN ÇIKTISI:

                      
[1] "D"
                      
                    

Çünkü, x = 4 olduğu için 4. durum olan D; y’ye atanmış ve y, D olarak yazdırılmıştır.

Aşağıdaki örnekte ise x = 7 olarak alınır fakat listede 6 durum bulunmaktadır:

                      
x = 7
y<-switch(x,"A","B","C","D","E","F")
print(y)
                      
                    

Bu durumda y’nin değeri NULL olacaktır:

PROGRAMIN ÇIKTISI:

                      
NULL
                      
                    

ÖRNEK:

                      
x= 'izmir'
switch(x, istanbul={print('istanbul')},izmir={print('izmir')    },ankara={print('ankara')},{print('default')})
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] "izmir"
                      
                    

ÇEVRİM OLUŞTURMA (DÖNGÜ, İNG:LOOP)

Çevrimsel işlem veya tekrarlı işlem (iterasyon, ing. iteration) bilgisayarı aynı işlemler grubunu belirli bir koşul sağlanana kadar tekrar tekrar yapmak için yönlendirir. R dilinde çevrim yapısını oluşturmak için 3 deyim mevcuttur:

  • repeat deyimi
  • while deyimi
  • for deyimi

REPEAT DEYİMİ

                      
Repeat{   
  komutlar
  If (koşul)  
    {break}
}
                      
                    

şeklindedir.

Burada koşul yanlış olduğu sürece komutlar sonsuza kadar çalışır. Koşul doğru olursa break komutu ile çevrimden çıkılır ve repeat’i izleyen komutla devam eder.

ÖRNEK:

                      
x <- c("YKB CODE")
s=0
repeat {
  print(x)
  s<-s+1
  
  if(s > 5) {break}}
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] " YKB CODE "
[1] " YKB CODE "
[1] " YKB CODE "
[1] " YKB CODE "
[1] " YKB CODE "
[1] " YKB CODE "
                      
                    

s değeri 6 olunca repeat çevriminden çıkılır ve program durur.

WHILE DEYİMİ

While deyiminin yazılış biçimi aşağıdaki gibidir:

                      
While(ifade) 
  {deyim  }
                      
                    

Veya

                      
while(ifade)
  {      
    Deyim1;
    Deyim2;
    ...
    Deyim_n;
  }
                      
                    

while deyiminin çalışma biçimi ise aşağıdaki gibidir:

Önce ifade hesaplanır. İfade true (doğru) ise deyim çalışır. Deyim çalıştıktan sonra programın kontrolü while deyiminin başına geçer ve işlem tekrarlanır. Bu işlem ifadenin değeri false(yanlış) olana kadar sürer ve bu durumda program deyimi izleyen noktaya gider.

İfadenin değeri true (doğru) olduğu sürece while bir sonsuz çevrim (infinite loop) oluşturur.

Deyim yerinde genellikle bir deyimler grubu bulunur. Bu durumda while yapısının deyimler grubunu gövde içine almak için gerekli olan, { } sembolleri kullanılmış olan şekli söz konusu olacaktır. İkinci şekli de benzer biçimde çalışır; yani ifade tekrar tekrar hesaplanır. İfadenin değeri true olduğu sürece bir sonsuz çevrim oluşur ve bunun her adımında Deyim1, Deyim2, … , Deyim_n ile belirtilen deyimler grubu yeniden çalıştırılır.

While çevrim yapısı ile çevrim içindeki deyim grubu kontrol edilen bir koşula bağlı olarak tekrarlanabilir. Böylece işlemlerin ne kadar tekrarlanacağının önceden belli olmadığı fakat değeri değişen bir değişken ya da ifadenin değerinin kontrol edilmesi ile belirlenebildiği uygulamalarda bu çevrim yapısını kullanmak uygun olacaktır.

Aşağıda while çevrimi ile ilişkili çeşitli uygulamalar verilmiştir:

ÖRNEK:

                      
sayac=5
toplam=0;        
while(sayac>0)
{
  toplam<-toplam+sayac
  sayac<-sayac-1
}
print(toplam)
print(sayac)

                      
                    

PROGRAMIN ÇIKTISI:

                      
print(toplam)
[1] 15

> print(sayac)
[1] 0
                      
                    

Bu programda 1 + 2 + 3 + 4 + 5 toplamı hesaplanmakta ve sayac’ın değeri 0 olunca program durmaktadır.

ÖRNEK:
WHILE İLE FAKTÖRYEL HESABI

Matematikte n! = 1 * 2 * 3 * ... n şeklinde tanımlanır yani 1’den n’e kadar tamsayıların çarpımıdır. Aşağıdaki R programı 5! = 1 * 2 * 3 * 4 * 5 = 120 değerini hesaplamaktadır:

                      
n=5
i=1
f=1      
while(i<=n)
{
  f<-f*i
  i<-i+1
}
print("faktoryel")
print(f)
                      
                    

PROGRAMIN ÇIKTISI:

                      
> print("faktoryel")
[1] "faktoryel"

> print(f)
[1] 120
                      
                    

ÖRNEK:

Aşağıdaki R programında faktöriyel hesaplanmakta ve hesaplanan faktöriyelin değeri 720’yi aştığı anda program durdurulmaktadır:

                      
i=1
f=1      
while(f<720)
{
  f <-f * i
  i <-i + 1
}
print("faktoryel")
print(f)
                      
                    

PROGRAMIN ÇIKTISI

                      
> print("faktoryel")
[1] "faktoryel"

> print(f)
[1] 720
                      
                    

Bu programda 7! = 720 hesaplandıktan sonra while’daki 720<720 ifadesi yanlış olacağı için bu durumda while bloğunun dışına çıkılır ve print komutları ile fakt’ın ve i’nin değerleri yazdırılır.

for DEYİMİ

for deyimi ve for deyimi kullanılarak oluşturulacak çevrim yapısı işlemlerin tekrar sayısının önceden belli olduğu durumlarda kullanılır. For deyiminin yazılış biçimi aşağıdaki gibidir:

                      
For(Değer in  Vektör)  {Deyimler ya da komutlar}
                      
                    

şeklindedir. Değer önce Vektördeki ilk elemandır ve bu değer ile { } sembolleri arasındaki komutlar çalıştırılır. Sonra değer değişkenine Vektörün ikinci elemanı atanır ve aynı işlemler tekrarlanır. for çevrimi değer Vektörün son elemanını da alıp gövdeyi ({ } sembolleri arasındaki komutlar) son kez çalıştırana kadar devam eder.

ÖRNEK:

Aşağıda basit bir örnek ile for çevrim yapısını daha iyi anlamaya çalışalım:

                      
x<-c(1,2,3,4,5)
for(i in  x)
{
 print(i) 
}                 
                    

PROGRAMIN ÇIKTISI:

                      
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
                      
                    

Aynı işlemi gerçekleştirmenin daha basit bir yolu da vardır. Aşağıdaki kodu inceleyiniz:

                      
for(i in 1:5)
{
 print(i) 
}
                      
                    

Aynı sonuç elde edilecektir:

                      
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
                      
                    

ÖRNEK:
FOR İLE TAM SAYILAR TOPLAMININ BULUNMASI

Aşağıdaki R programı,1’den 5’e kadar sayılar toplamını,
1 + 2 + 3 + 4 + 5 = 15
hesaplamaktadır:

                      
t<-0
for(i in 1:5)
{
  t<-t+i
}
print(t)
                      
                    

PROGRAMIN ÇIKTISI

                      
> print(t)
[1] 15
                      
                    

Aşağıdaki tabloda ise işlemlerin nasıl geliştiği ayrıntılı bir biçimde verilmiştir:

Çevrim Adımı i Toplam
Başlangıç, Çevrim Öncesi 0
1 1 1
2 2 3 (1 + 2)
3 3 6 (1 + 2 + 3)
4 4 10 (1 + 2 + 3 + 4)
5 5 15 (1 + 2 + 3 + 4 + 5)

ÖRNEK:
FAKTÖRİYEL HESABI

for çevrimini kullanacağımız diğer bir örnek program ise faktöriyel hesabı olacaktır. Matematikte faktöriyel,
n! = 1 . 2 . 3 ... n

şeklinde tanımlanır. Bu tanıma göre n sayısının faktöriyeli 1’den n’e kadar tam sayıların çarpımına eşittir. Aşağıda faktöriyel hesabı ile ilişkili R programı ve bu program içindeki değişkenlerin programın çalışması sorasındaki değişimlerini gösteren tablo verilmiştir:

                      
f<-1
for(i in  1:5)
{
  f<-f*i
}
print(f)
                      
                    

PROGRAMININ ÇIKTISI:

                      
> print(f)
[1] 120
                      
                    

FAKTÖRİYEL PROGRAMINDAKİ DEĞİŞKENLERİN PROGRAMIN ÇALIŞMASI SIRASINDAKİ DEĞİŞİMLERİNİ GÖSTEREN TABLO

 i  f n
Çevrim Öncesi 1 5
1 1 5
2 2 (1 * 2) 5
3 6 (1 * 2 * 3) 5
4 24 (1 * 2 * 3 * 4) 5
5 120 (1 * 2 * 3 * 4 * 5) 5

ÖRNEK:
ALTERNE SERİ TOPLAMI

1.2/(3.4) - 5.6/(7.8) + 9.10/(11.12) - 13.14/(15.16) şeklindeki alterne seri toplamının hesaplanması.
Yukarıdaki ifadede (.) sembolü çarpma işlemi anlamındadır.

                      
s=0;
p=1;
x=1.0;
for (i in 1:4)
{
  s<-s+(x*(x+1))/((x+2)*(x+3))*p;
  x<-x+4;
  p<--p;
}
print(s)
                      
                    

PROGRAMININ ÇIKTISI:

                      
> print(s)
[1] -0.4455628
                      
                    

ALTERNE SERİ PROGRAMINDAKİ DEĞİŞKENLERİN PROGRAMIN ÇALIŞMASI ESNASINDAKİ DEĞİŞİMLERİNİ GÖSTEREN TABLO

 i  x  s p
Çevrim Öncesi 1.0 0 1
1 1.0 (1.2) / (3.4) 1
2 5.0 (1.2) / (3.4) - (5.6) / (7.8) -1
3 9.0 (1.2) / (3.4) - (5.6) / (7.8) + (9.10) / (11.12) 1
4 13.0 (1.2) / (3.4) - (5.6) / (7.8) + (9.10) / (11.12) - (13.14) / (15.16) -1

Sadece 4 terim olduğu için for çevrimi 1’den 4’e kadar çalıştırılmıştır. İlk terim 1.2/(3.4) ve ikinci terim 5.6/(7.8) olduğu için, x değişkeni ilk terimdeki ilk sayıyı temsil etmek üzere terimi x.(x+1)/((x+2).(x+3)) şeklinde ifade edebiliriz. x yerine 1 konulursa bu durum kolayca kanıtlanabilir. İkinci terimde ilk sayı 5, 3.terimde ilk sayı 9 olduğuna göre x her seferinde 4 arttırılmalıdır. Bu da programda x=x+4; deyimi ile gerçekleştiriliyor. Bu terimi x+=4; şeklinde de yazabilirsiniz.

Seri alterne seri olduğuna göre, yani terimlerin işaretleri +, -, +, - şeklinde değiştiğine göre, p değişkeni yardımı ile terimlerin işaretleri ayarlanabilir. p önce 1 olarak atanmıştır. Sonra çevrim içine konulan p=-p; ifadesi ise bir sonraki işareti -,bir sonrakini + ve onu izleyeni – yapacaktır.

İÇ İÇE ÇEVRİMLER

Bir çevrim yapısının içine başka bir çevrim yapısının yerleştirilmesi ile elde edilen yapıya iç içe çevrim (nested loop) adı verilir. R dilinde if deyimlerini herhangi bir derinliğe kadar iç içe kullanmak nasıl mümkünse, çevrim deyimlerini de iç içe kullanmak mümkün olacaktır. İç içe çevrimlerde hatırlanacak anahtar bilgi, önce içteki çevrimlerin tamamlanmasıdır. Bu konuda aşağıdaki kural iç içe çevrimler için daima geçerlidir:

NOT: İç içe çevrimlerde en içteki çevrim en önce tamamlanır.

ÖRNEK:
İÇ İÇE FOR ÇEVRİMLERİ

Aşağıdaki programda dış çevrim olan i parametreli çevrim 2 kez çalışacaktır.(i = 1, 2). i’nin her değeri için ise içteki çevrim 3 kez çalışacaktır.(j = 1, 2, 3).

                      
for (i in 1:2)
{   
  print("i=");print(i)
  for(j in 1:3)
  {
    print("j=");print(j)   
  }
}

                      
                    

Böylece aşağıdaki çıktı elde edilecektir:

                      
[1] "i="
[1] 1
[1] "j="
[1] 1
[1] "j="
[1] 2
[1] "j="
[1] 3
[1] "i="
[1] 2
[1] "j="
[1] 1
[1] "j="
[1] 2
[1] "j="
[1] 3
                      
                    

ÖRNEK:
FAKTÖRİYELLİ TERİMLERDEN OLUŞAN SERİ TOPLAMI

Aşağıdaki seri toplamını hesaplayacak bir R programı yazınız:

1/ 2! + 1/3! + 1/4! + ...... + 1/10!

Bu seri toplamını hesaplamak istediğimizde iç içe iki çevrim kullanmak gerekir:

  1. 1) Her adımda bir toplama işlemi gerektiren terimlerin toplanmasının gerekli olduğu bir çevrim (Yukarıdaki tek çevrim örneklerindeki 1 + 2 + 3 + ... + n toplamı örneğini hatırlayınız)
  2. 2) Yukarıda belirtilen çevrimin her parametre değeri için o adımdaki faktöriyeli hesaplatmak zorunda olduğumuz ve o nedenle yukardaki çevrimin içinde yer alması gereken bir çevrim.

Problemin çözümünü yapacak R programını aşağıdaki gibi yazabiliriz:

                      
s = 0;
for (i in 2:10)
{
  fakt=1;
  for(j in 1:i)
    fakt <-fakt*j;
  s <-s+1/fakt;
  print(s)
}
print(s);
                      
                    

PROGRAMIN ÇIKTISI:

                      
[1] 0.5
[1] 0.6666667
[1] 0.7083333
[1] 0.7166667
[1] 0.7180556
[1] 0.718254
[1] 0.7182788
[1] 0.7182815
[1] 0.7182818

> print(s);
[1] 0.7182818
                      
                    

Programın çalışması sonucunda i, j, s ve fakt değişkenlerinin alacağı birkaç değer aşağıdaki tabloda verilmiştir:

Dış Çevrim İç Çevrim Faktöriyel Toplam
i j fakt s
2 1 1 0
2 2 2 1/2
3 1 1 1/2
3 2 2 1/2
3 3 6 (1.2.3=3!) 1/2 + 1/6
4 1 1 1/2 + 1/6
4 2 2 1/2 + 1/6
4 3 6 1/2 + 1/6
4 4 24 (1.2.3.4= 4!) 1/2 + 1/6 + 1/24
... ... ... ...
10 10 10! 1/2 + 1/6 + 1/24 + 1/20!

BREAK DEYİMİ

break deyiminin kullanılış amacı bir çevrim (loop) yapısı içinden çevrimi kontrol eden koşul ifadesini beklemeksizin hemen çevrim dışına çıkmaktır. Break deyimi bir çevrim içinde yer almışsa bu durumda break deyimi ile karşılaşılır karşılaşılmaz çevrim dışına çıkılır ve çevrimi izleyen deyime geçilir.

ÖRNEK:

                      
x<-c(4,-5,6,8,-6,10)
i<-1
p<-0
s<-0
while(TRUE){
    if(i>6) {break }
  if (x[i]>0 ) {s<-s+x[i];p<-p+1} ;
  i<-i+1;
}
ort<-s/p;
print("POZITIFF SAYILARIN TOPLAMI=");print(s)
print("SAYILARIN ORTALAMASI=");print(ort)
print("GIRILEN SAYI MIKTARI="); print(p)       
                      
                    

PROGRAMIN ÇIKTISI:

                      
> print("POZITIFF SAYILARIN TOPLAMI=");print(s)
[1] "POZITIFF SAYILARIN TOPLAMI="
[1] 28

> print("SAYILARIN ORTALAMASI=");print(ort)
[1] "SAYILARIN ORTALAMASI="
[1] 7

> print("GIRILEN SAYI MIKTARI="); print(p)       
[1] "GIRILEN SAYI MIKTARI="
[1] 4
>      
                      
                    

NEXT DEYİMİ

next deyimi çevrim içinde belirli bir koşulun kontrolü ile bir sonraki çevrim adımına gidilmesini sağlar.

ÖRNEK:

Aşağıdaki programda for çevriminin parametresi olan i değişkeni 3 ile tam bölünemeyen bir değer alınca bu değer ile işlem yapılmayıp bir sonraki adıma geçilmesi next deyimi ile sağlanmaktadır. Böylece program kullanıcı tarafından girilen bir üst limite kadar 3 ile bölünebilen sayıların toplamını ve bu tip sayıların adedini bulacaktır.

                      
n<-18
s=0;c=0;
for(i in 1:18)
{
  if(i %% 3!=0) next;
  print("SAYI=");print(i);
  s<-s+i;
  c<-c+1;
}

print("3-18 arasindaki 3 ile bolunebilen sayi miktari=");print(c);
print("Bu tur sayilarin toplami=");print(s);

                      
                    

PROGRAMIN ÇIKTISI

                      
[1] "SAYI="
[1] 3
[1] "SAYI="
[1] 6
[1] "SAYI="
[1] 9
[1] "SAYI="
[1] 12
[1] "SAYI="
[1] 15
[1] "SAYI="
[1] 18

> print("3-18 arasindaki 3 ile bolunebilen sayi miktari=");print(c);
[1] "3-18 arasindaki 3 ile bolunebilen sayi miktari="
[1] 6

> print("Bu tur sayilarin toplami=");print(s);
[1] "Bu tur sayilarin toplami="
[1] 63
>
                      
                    

SCAN KOMUTU

Klavyeden interaktif olarak veri girişi sağlar ve boşluk girildiği zaman çalışma durur.

ÖRNEK:

                      
a <- scan(what=double(0))
 a
typeof(a)
a <- scan(what=double(0))
                      
                    

PROGRAMIN ÇIKTISI

                      
> source('~/scan.R', echo=TRUE)

> a <- scan(what=double(0))
1: 6
2: 7
3:   
Read 2 items

>  a
[1] 6 7

> typeof(a)
[1] "double"

> a <- scan(what=double(0))
1:
                      
                    

ÖRNEK PROGRAMLAR

  1. I. Aşağıdaki programı çalıştırınız:
                              
    for (i in seq(0,3,by=0.4))
    {
      cat(i,"\n");
    }
                              
                            

    Aşağıdaki çıktıyı elde edeceksiniz:

                              
    0 
    0.4 
    0.8 
    1.2 
    1.6 
    2 
    2.4 
    2.8
                              
                            

  2. II. Aşağıdaki kodu çalıştırınız:
                              
    s<-0
    for (i in seq(1,10)) {s<-s+i*i}
    s
    
                              
                            

    Aşağıdaki sonucu elde edeceksiniz:

                              
    [1] 385
                              
                            

    Burada 12+22+32+…102 = 385 değeri hesaplanmaktadır.

  3. III. Aşağıdaki kodu çalıştırınız:
                              
    p<-1
    s<-0
    for (i in seq(1,4)) {s<-s+p*i*i;p<--p;}
    s
                              
                            

    Aşağıdaki çıkış değerini elde edeceksiniz:

                              
    [1] -10
                              
                            

    Bu programın hesapladığı şey,
    12 - 22 + 32 - 42 = -10
    değeridir.

  4. IV. Aşağıdaki kodu çalıştırınız:
                              
    f<-1
    for (i in seq(1,5)) {f<-f*i}
    f
                              
                            

    Aşağıdaki çıktıyı elde edeceksiniz:

                              
    [1] 120
                              
                            

    Burada hesaplanan şey,
    1 * 2 * 3 * 4 * 5 = 120 yani 5!
    değeridir.

  5. V. Aşağıdaki program ise bir sayının asal sayı olup olmadığını kontrol etmektedir:
                              
    flag = 0
    
    if(num > 1) {
     
      flag = 1
      for(i in 2:(num-1)) {
        if ((num %% i) == 0) {
          flag = 0
          break
        }
      }
    } 
    
    if(num == 2)    flag = 1
    if(flag == 1) {
      print(paste(num,"BIR ASAL SAYIDIR"))
    } else {
      print(paste(num,"BIR ASAL SAYI DEGILDIR"))
    }
                              
                            

    Programın iki farklı değer için çıktıları aşağıda verilmektedir:

                              
    [1] "9 BIR ASAL SAYI DEGILDIR"
    Enter a number: 11
    [1] "11 BIR ASAL SAYIDIR"
                              
                            

  6. VI. Çarpım tablosu

    Aşağıdaki kodu giriniz:

                              
    n = as.integer(readline(prompt="Enter a number: "))
    for(i in 1:10) {
      print(paste(n,'x', i, '=', n*i))
    }
                              
                            

    Aşağıdaki sonucu elde edeceksiniz:

                              
    [1] "8 x 1 = 8"
    [1] "8 x 2 = 16"
    [1] "8 x 3 = 24"
    [1] "8 x 4 = 32"
    [1] "8 x 5 = 40"
    [1] "8 x 6 = 48"
    [1] "8 x 7 = 56"
    [1] "8 x 8 = 64"
    [1] "8 x 9 = 72"
    [1] "8 x 10 = 80"
    >
                              
                            

  7. VII. Aşağıdaki program bir tam sayının tek mi çift mi olduğunu bulmaktadır:
                              
    n = as.integer(readline(prompt="Enter a number: "))
    if((n %% 2) == 0) {
      print(paste(n," CIFT SAYIDIR"))
    } else {
      print(paste(n," TEK SAYIDIR"))
    }
                              
                            

    Programın çıktıları aşağıdaki gibidir:

                              
    Enter a number: 9
    [1] "9  TEK SAYIDIR"
    Enter a number: 18
    [1] "18  CIFT SAYIDIR"
    >
                              
                            

  8. VIII. Aşağıdaki R programı Fibonacci sayılarını hesaplamaktadır. Fibonacci sayıları,

    f0 = 0, f1 = 1 olmak üzere,
    fn = f n - 1 + f n - 2

    Şeklinde tanımlanmış sayılardır.

                              
    n= as.integer(readline(prompt="KAC TERIM ISTENIYOR...? "))
    
    # ILK IKI TERIM
    n1 = 0
    n2 = 1
    SAYAC = 2
    if(n <= 0) {
      print("POZIFIF BIR SAYI GIRINIZ..")
    } else {
      if(n== 1) {
        print("FIBONACCI DIZISI:")
        print(n1)
      } else {
        print("FIBONACCI DIZISI:")
        print(n1)
        print(n2)
        while(SAYAC < n) {
          n12 = n1 + n2
          print(n12)
          # update values
          n1 = n2
          n2 = n12
          SAYAC = SAYAC + 1
        }
      }
    }
                              
                            

    Aşağıda ise programın çıktısı görülmektedir:

                              
    [1] "FIBONACCI DIZISI:"
    [1] 0
    [1] 1
    [1] 1
    [1] 2
    [1] 3
    [1] 5
    [1] 8
    [1] 13
    [1] 21
    [1] 34
    >
                              
                            

ÖĞRENME TÜRLERİNE GİRİŞ

ÖĞRENME TÜRLERİ

EĞİTİM ÖNCELİĞİNE GÖRE ÖĞRENME TÜRLERİ

Öğrenme algoritmaları eğitim işleminin önceliğine göre sınıflandırılırlar:

I. TEMBEL ÖĞRENME (LAZY LEARNING)

“Tembel öğrenme” (lazy learning) ya da başka bir terim ile “örneğe dayalı öğrenme” (instance based learning) şu şekilde tanımlanabilir:
Bu öğrenme biçiminde eğitim verileri bir ortamda saklanır ve ancak yeni bir veri birimi gelince devreye sokulur. kNN Algoritması (k en yakın komşu) bu tür bir öğrenme biçimidir.

II. İSTEKLİ ÖĞRENME (EAGER LEARNING)

Burada yaklaşım tamamen farklıdır. Bir eğitim kümesi verildiği zaman bundan bir model üretilir ve bu model kullanılarak yeni gelen veri hakkında karar verilir. Örneğin bir sınıflandırma probleminde eğitim verisi kullanılarak bir eğitim modeli oluşturulur ve yeni gelen bir verinin hangi sınıfa ait olduğu bu model sayesinde belirlenir.

Karar ağaçları (Decision trees), Destek Vektör Makinası (Support Vector Machine-SVM), Sinir ağı (neural Network) istekli öğrenme yöntemlerine örneklerdir.

Tembel öğrenme yönteminde eğitim için az zaman ayrılır. Buna karşılık öngörü (forecast predict) için ayrılan zaman fazladır.

K-EN YAKIN KOMŞU (K-NEAREST NEIGHBOR - KNN) ALGORİTMASI

KNN algoritması denetimli öğrenme (supervised learning) yöntemlerinden biridir. Veri madenciliği (data mining) istatistiksel iz tanıma (statistical pattern recognition), görüntü işleme (image processing) ve diğer pek çok alanda uygulanmıştır.
Bu konuda başarılı örnekler uydu görüntülerini tanıma, el yazısı tanıma ve elektrokardiyogram (EKG) sinyallerini anlamlandırmadır.

KNN ALGORİTMASI NEDİR?

Şimdi KNN algoritmasının sınıflandırma (classification) işleminde nasıl kullanılabileceğini göstereceğiz.

Aşağıdaki örnek veri verilmiş olsun:

ÖRNEK X = ÖZELLİK 1 Y = ÖZELLİK 2 Z = SINIFLANDIRMA
1 6 6 Kötü
2 6 4 Kötü
3 2 3 İyi
4 1 4 İyi

Yukarıdaki tabloda 4 adet örnek veri sorgulanmış ya da test edilmiş; X ve Y özelliklerine göre sınıflandırılmıştır.

Örnek 1 ve 2 kötü, Örnek 3 ve 4 iyi örneklerdir. Bu durumda elimizde eğitilmiş bir veri kümesi (training data) ya da denetlenmiş veri kümesi (supervised data) vardır. X ve Y değeri ölçülmüş yeni bir örnek gelirse hangi sınıfa dâhil olacağına (Elimizde iyi ve kötü olarak etiketlenmiş iki sınıf vardır) KNN algoritması karar verir.

ALGORİTMANIN ADIMLARI (KNN ALGORİTMASI):

  1. I. En yakın komşu sayısı parametresi olan K belirlenir.
  2. II. Yeni örnek ile bütün etiketlenmiş veriler arasındaki mesafeler hesaplanır (Yukarıdaki tablo etiketlenmiş verileri içerir)
  3. III. Mesafeler sıralanır ve en yakın komşuya dayalı k-minimum mesafesi belirlenir.
  4. IV. En yakın komşuların Y etiketleri değerlendirilir.
  5. V. Gelen örneğin hangi sınıfa ait olduğunu belirlemek üzere k adet en yakın komşu kümesine basit çoğunluk yöntemi uygulanır. Yani k adet komşunun çoğunluğu “iyi” ise örnek “iyi” olarak değerlendirilir. Aksi takdirde örnek “kötü” olarak belirlenir.

    Şimdi bu algoritmayı yukarıdaki tablo için uygulayalım:

    1. I. K = 3 olarak seçilir. Yani 3 adet en yakın komşu dikkate alınacaktır.
    2. II. Yeni gelen örnek veri X = 3 ve Y = 6 olsun. Hesabı hızlandırmak için mesafeler yerine karelerini alacağız ve karekök işleminden kurtulacağız.
    3. III. Mesafeler hesaplanmış ve sıralamalar aşağıdaki tabloda yapılmıştır:
      Örnek 

      X

      Y

      İlk üç, (K=3) İçinde mi? Sınıflandırma

      Yeni gelen verinin örneklere uzaklık sıraları Örneklerin (3, 6) Noktasına Uzaklıklarının Kareleri
      1 6 6 Evet Kötü 2 (6 - 3)2 + (6 - 6)2 = 9
      2 6 4 Hayır Kötü 4 (6 - 3)2 + (4 - 6)2 = 13
      3 2 3 Evet İyi 3 (2 - 3)2 + (3 - 6)2 = 10
      4 1 4 Evet İyi 1 (1 - 3)2 + (4 - 6)2 = 8
    4. IV. İlk üç 4., 1. ve 3. örneklerdir. 2. örnek değerlendirmeye katılmayacaktır.
    5. V. Basit çoğunluk metoduna göre 4. Örnek “iyi”; 3. örnek iyi ve 1. örnek kötüdür. Seçilen 3 en yakın komşudan ikisi “iyi” ve biri “kötü” olduğuna göre çoğunluk kuralına göre yeni gelen (3, 6) örneği de “iyi” sayılacaktır.

R DİLİNDE KNN ALGORİTMASINI UYGULAMAK

R dilinde KNN algoritması için KNN fonksiyonu vardır. Bu fonksiyonun yazılış biçimi,

                      
x <- knn (eğitim, test, sınıf, k)  
                      
                    

şeklindedir. Şimdi bu fonksiyonu yukarıdaki probleme uygulayalım:

                      
#A sınıfı kötüler
A1 = c(6,6)
A2 = c(6,4)

# B sınıfı iyiler
B1 = c(2,3)
B2 = c(1,4)
 
# eğitim(train) matrisi
train=rbind(A1,A2, B1,B2)
 
# Sınıf etiketleri vektörü her very için atanır 
cl = factor(c(rep("A",2),rep("B",2)))
 
# Sınıflandırılacak yeni gelen veri
test = c(3, 6)
 
# knn() fonksiyonu için aşağıdaki komut çalışmalıdır
library(class)
 
# knn() fonksiyonu ve sonucunu görüntüleme
summary(knn(train, test, cl, k = 1))
                      
                    

Burada k = 1 alınmıştır.

SONUÇ:

                      
> summary(knn(train, test, cl, k = 1))
A B 
0 1
                      
                    

Örnek veri B sınıfına ait olarak tahmin edilmiştir.

OLASILIKSAL (PROBABILISTIC) ÖĞRENME

NAIVE BAYES TEKNİĞİ

Pratikte çok kullanılan sınıflandırma yöntemlerinden biri de Naive Bayes yöntemidir. Bu yöntemi anlatmadan önce Bayes teoremi ve olasılık (probability) kavramlarından bahsetmek yararlı olacaktır.

Bayes teoremi çok ünlü bir teoremdir ve İngiliz matematikçisi Thomas Bayes (1701-1761)tarafından ortaya konulmuştur.

Bayes teoremi aşağıdaki gibi ifade edilir:

Bu teorem ifadesi içinde kullanılan bileşenler aşağıdaki gibi tanımlanır:

P(A | B) : A’nın B’ye göre şartlı olasılığıdır. (conditional probability). Bunun anlamı şudur: B olayı (event) gerçekleştiği takdirde A’nın gerçekleşme olasılığı P(A|B) olacaktır.

P(A B) : A ve B olaylarının aynı anda olma olasılığıdır.

P(A) : A olayının olma olasılığıdır.

P(B) : B olayının olma olasılığıdır.

ÖRNEK:

OLAY  AÇIKLAMA  OLASILIK
A Herhangi bir kişinin böbrek kanseri olması 0.0000018
B Herhangi bir kişinin idrarında mikroskopik kan bulunması 0.09
B|A   Belirli bir kişi böbrek kanseri ise (A gerçekleşmiş) idrarında mikroskopik düzeyde kan bulunma olasılığı(B) 1.0

Bu veriler belli olduğuna göre şimdi P(A|B) ’yi yani bir kişinin idrarında mikroskobik düzeyde kan bulunmuşsa (B) bu kişinin böbrek kanseri olması olasılığını (A) bulmak istiyoruz. Bayes teoremine göre bu değer B olmuşsa A’nın olasılığı nedir düşüncesiyle,

P(A | B) = [ P(B|A) P(A)] / P(B) = [1,0 . 0,0000018] / 0.09 = 0,00002

şeklinde hesaplanacaktır.

NAIVE BAYES SINIFLANDIRMA YÖNTEMİ

Naive sözcüğünün Türkçe’deki anlamları saf, bön, toy, deneyimsiz, basit gibi sözcüklerle karşılanmaktadır. Naive Bayes sınıflandırma yöntemi ya da algoritması şu prensibe dayanır;

Çok sayıda özellikten oluşan bir d olayında, bu özellikleri genel olarak ai ile tanımlayalım:

d = (ai) i = 1,2, ..., n

Burada n toplam özellik sayısıdır. Örneğin, d olayı “belirli bir günde maç yapmak” olsaydı a özellikleri de

a1 = görüş mesafesi  a2 = sıcaklık  a3 = nem  a4 = rüzgâr hızı

olabilirdi. (n = 4)

Naive Bayes algoritması bu durumda d’nin meydana gelmesinde ai özelliklerinin her birinin diğerinden bağımsız olarak etki yaptığını söylüyor:

Buradaki varsayım gerçek dünya uygulamalarında tam doğru olmasa bile bu yöntem özellikle,

  1. a. Metin sınıflandırma (text classifying)
  2. b. Tıbbi teşhis (medical diagnosis) uygulamalarında çok başarılı sonuçlar vermektedir.

ÖRNEK:

Aşağıda O1, O2 ve O3 özellikleri ile belirlenmiş sınıflar verilmiştir:

O1 O2 O3 SINIF
1 3 1 +
3 1 3 +
1 1 3 -
2 3 1 -
3 3 2 -

Buna göre sisteme yeni gelen O1 = 1, O2 = 3, O3 = 2 olayının hangi sınıfa (+ ya da -) ait olduğunu Naive Bayes metodu ile tespit edelim:

P(SINIF = +) = 2/5
P(O1 = 1|SINIF =+) = 1/2
P(O1 =1|SINIF = -) = 1/3
P(O1 = 2|SINIF = +) = 0
P(O1 = 2|SINIF= -) = 1/3
P(O1 =3|SINIF =+) = 1/2
P(O1 =3|SINIF =-) = 1/3
P(O2 =1|SINIF =+) = 1/2
P(O2 =1|SINIF = -) = 1/3
P(O2 = 3|SINIF =+) = 1/2
P(O2 = 3|SINIF= -) = 2/3
P(O3 = 1|SINIF =+) = 1/2
P(O3 = 1|SINIF = -) =1/3
P(O3 =2|SINIF =+) = 0; P(O3 =2|SINIF= -) = 1/3
P(O3 =3|SINIF= +) = 1/2; P(O3 =3|SINIF =-) = 1/3
P(O1 = 1|SINIF= +) P(O2 =3|SINIF= +) P(O3 = 2|SINIF =+) P(SINIF =+) = (1/2)(1/2)(0)(2/5) =0
P(O1 = 1|SINIF = -) P(O2 = 3|SINIF = -) P(O3 = 2|SINIF = -) P(SINIF = -) = (1/3)(2/3)(1/3)(2/3)

(+) sınıfına ait olasılık 0 çıktığı için gelen yeni gelen O1 = 1, O2 = 3, O3 = 2 olayı "-" sınıfına ait olacaktır.

IRIS VERİSİ İLE R’DE NAIVE BAYES UYGULAMASI

Daha önceki bölümlerde kullandığımız İris verisi bildiğiniz gibi 3 sınıftan oluşuyordu. Bu uygulamada bu sınıfları bulan bir Naive Bayes R kodu vereceğiz:

                      
install.packages('caret')
library('caret')
head(iris)
names(iris)
x = iris[,-5] 
y = iris$Species
model = train(x,y,'nb',trControl=trainControl(method='cv',number=10))
predict(model$finalModel,x)
table(predict(model$finalModel,x)$class,y)
naive_iris <- NaiveBayes(iris$Species ~ ., data = iris) 
yesplot(naive_iris)
                      
                    

Kodu çalıştırdığımızda aşağıdaki çıktıları ve grafikleri elde edeceğiz:

PROGRAMIN ÇIKTISI:

                      
> head(iris)
        Sepal.Length Sepal.Width Petal.Length   Petal.Width     Species
1          5.1            3.5       1.4             0.2         setosa
2          4.9            3.0       1.4             0.2         setosa
3          4.7            3.2       1.3             0.2         setosa
4          4.6            3.1       1.5             0.2         setosa
5          5.0            3.6       1.4             0.2         setosa
6          5.4            3.9       1.7             0.4         setosa

> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
.......
> predict(model$finalModel,x)
$class
  [1] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
  [9] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [17] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [25] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [33] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [41] setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa    
 [49] setosa     setosa     versicolor versicolor virginica  versicolor versicolor versicolor
 [57] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
 [65] versicolor versicolor versicolor versicolor versicolor versicolor virginica  versicolor
 [73] versicolor versicolor versicolor versicolor versicolor virginica  versicolor versicolor
 [81] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
 [89] versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor
 [97] versicolor versicolor versicolor versicolor virginica  virginica  virginica  virginica 
[105] virginica  virginica  versicolor virginica  virginica  virginica  virginica  virginica 
[113] virginica  virginica  virginica  virginica  virginica  virginica  virginica  versicolor
[121] virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica 
[129] virginica  virginica  virginica  virginica  virginica  versicolor virginica  virginica
......
$posterior
              setosa   versicolor    virginica
  [1,]  1.000000e+00 2.981309e-18 2.152373e-25
  [2,]  1.000000e+00 3.169312e-17 6.938030e-25
  [3,]  1.000000e+00 2.367113e-18 7.240956e-26
  [4,]  1.000000e+00 3.069606e-17 8.690636e-25
  [5,]  1.000000e+00 1.017337e-18 8.885794e-26
  [6,]  1.000000e+00 2.717732e-14 4.344285e-21
  [7,]  1.000000e+00 2.321639e-17 7.988271e-25
.....
> table(predict(model$finalModel,x)$class,y)
            y
                setosa    versicolor    virginica
  setosa            50             0            0
  versicolor        0             47            3
  virginica         0              3           47
> plot(naive_iris)
Hit < Return > to see next plot: 
Hit < Return > to see next plot: 
Hit < Return > to see next plot: 
Hit < Return > to see next plot: 
>
                      
                    

Şekil NB_1: Naive Bayes İris Verisi Uygulaması

Şekil NB_1: Naive Bayes İris Verisi Uygulaması

Şekil NB_2: Naive Bayes İris Verisi Uygulaması

Şekil NB_2: Naive Bayes İris Verisi Uygulaması

Şekil NB_3: Naive Bayes İris Verisi Uygulaması

Şekil NB_3: Naive Bayes İris Verisi Uygulaması

Şekil NB_4: Naive Bayes İris Verisi Uygulaması

Şekil NB_4: Naive Bayes İris Verisi Uygulaması

SINIFLANDIRMA

Sınıflandırma (Classification)

Sınıflandırma denildiğinde anlaşılan, bir girdi uzayından (input) sonlu bir çıktı uzayına (finite output space) olan dönüşümün nasıl olacağına dair bir şeyler öğrenme çabasıdır. (Şekil 1)

Şekil 1:  Sınıflandırma süreci

Şekil 1: Sınıflandırma süreci

Sınıflandırmada bir öğrenme (alıştırma - training) veri kümesi yardımı ile model oluşturulur ve daha sonra bu model kullanılarak verilen bir test veri setinin hangi sınıfa ait olduğu bilgisine ulaşılır. Şekil 1.a’da bu mekanizma görülmektedir:

Modelin oluşturulma aşamasında indüksiyon (induction - tüme varım), modelin uygulama aşamasında ise dedüksiyon (deduction-tümden gelim) yaklaşımları uygulanmaktadır.

Şekil 1.a: Model oluşturma, öğrenme ve modeli kullanma süreçleri

Şekil 1.a: Model oluşturma, öğrenme ve modeli kullanma süreçleri

Sınıflandırma problemleri iki ana gruba ayrılabilir:

  1. I. İkili sınıflandırma (Binary Classification)
  2. II. Çoklu sınıflandırma (Multi-Class Classification)

Şimdi bu grupları inceleyelim:

SINIFLANDIRMA YÖNTEMLERİ

İKİLİ SINIFLANDIRMA

İkili sınıflandırmada isminden de anlaşılacağı gibi girdi uzayındaki veriler iki sınıftan birine aittir. Sınıflandırma algoritması bu işlemi gerçekleştirir. Örneğin, girdi uzayı kredi kartı işlemlerine ait hareketlerden (transactions) oluşuyorsa bunlardan hangilerinin normal bir hareket hangilerinin ise illegal işlem (fradulent) olduğunun tespiti bir ikili sınıflandırma işlemidir. Benzer şekilde, girdi uzayı bir MR pikselleri (pixel) kümesinden oluşabilir. Bunlardan hangilerinin normal hücrelere, hangilerinin ise kanseri hücrelere ait olduğunun tespiti de bir ikili sınıflandırma problemidir.

İkili sınıflandırmada genellikle bir sınıfa ait veriler +1, diğer sınıfa ait veriler ise -1 etiketleri ile temsil edilir. O halde, ikili sınıflandırma problemi bir x giriş verisinin hangi yi sınıfına ait olduğunu bulma problemidir. Burada i, {-1,+1} kümesinin bir elemanıdır.

Şekil 2: İkili Sınıflandırma

Şekil 2: İkili Sınıflandırma

ÇOKLU SINIFLANDIRMA

Çoklu sınıflandırmada ise X giriş kümesindeki bir verinin n adet yi kümesinden hangisine ait olduğu araştırılır. Burada i, {1, 2, 3, 4, … n-1, n} kümesinin bir elemanıdır.

Çoklu sınıflandırma için pratikteki uygulamalardan en çok bilinenleri, basılı ya da el yazısı harf (karakter) tanıması ya da bir grup ses verisi içindeki seslerin kimlere ait olduğunun tanınmasıdır.

Şekil 3: Çoklu sınıflandırma

Şekil 3: Çoklu sınıflandırma

Sınıflandırmada esas hedef giriş veri kümesindeki farklı özelliklere sahip sınıfları ayıran karar sınırlarını (decision boundary) bulmaktır. Bu sınır düzlemde bir doğru ya da eğri, uzayda bir düzlem (plane) ya da yüzey (surface), n boyutlu uzayda ise bir hiper düzlemdir (hyperplane). Bu sınır genel olarak b(x) = 0 şeklinde bir analitik ifade ile temsil edilebilir.

İkili sınıflandırma probleminde b(x) > 0 bağıntısını sağlayan x verileri bir sınıfa, b(x) < 0 bağıntısını sağlayan x verileri ise diğer sınıfa aittir. b(x) = 0 bağıntısını sağlayan x verileri ise her iki sınıfa da aynı olasılıkla ait olabilirler.

SINIFLANDIRMA YÖNTEMLERİ
K ADET EN YAKIN KOMŞU SINIFLANDIRICISI (k-NEAREST NEIGHBOR CLASSIFIER)

Anlaşılması ve uygulanması çok kolay olan bir sınıflandırma yöntemidir.

Y = (x1, x2, x3, … xn) daha önceden sınıflandırılmış bir veri olsun. Y içindeki veriler de iki sınıfa ayrılmış olsun. Yeni gelen Xi verisinin hangi sınıfa ait olduğunu bulmak istediğimizde, Xi’nin Y’ye ait verilere olan uzaklıkları hesaplanır. Ardından bu uzaklıklardan en kısa olan k adedi (k seçilen bir tam sayı) belirlenir. k adet seçilen X’ler arasında kaç tanesinin birinci sınıfa kaç tanesinin de ikinci sınıfa ait olduğu bulunur. k adet bu veriden hangi sınıfa ait olanlar çoğunlukta ise yeni gelen Xi verisi o sınıfa ait olarak kabul edilir.

  1. I.
  2. II. Y kümesinin n tane elemanı olduğunu düşünelim; yani sınıf 1 ve sınıf 2 toplam olarak n adet veriye sahip olsun. Sisteme yeni gelen Xi verisi ile sınıf 1 ve sınıf 2’deki tüm noktalar arasındaki uzaklıklar hesaplanır.
  3. III. İki nokta arasındaki uzaklık ölçüsü olarak çeşitli uzaklık tipleri kullanılabilir.
  4. IV. Xi ve Xj ,p boyutlu uzayda verilen iki nokta olduğuna göre d uzaklığı göstermek üzere,
    • a. Euclidean uzaklık:
      Şekil 3b: Euclidean uzaklık

      Şekil 3b: Euclidean uzaklık

    • b. Manhattan uzaklık:
      Şekil 3c: Manhattan uzaklık

      Şekil 3c: Manhattan uzaklık

    • c. Minkowski uzaklığı:
      Şekil 3d: Minkowski uzaklığı

      Şekil 3d: Minkowski uzaklığı

  5. V. Seçilen bir uzaklık ölçüsüne göre Y’nin elemanları ile yeni gelen X arasındaki uzaklıklar hesaplanır. k = 5 seçilmişse bunlardan en kısa olan ilk 5’i belirlenir.
  6. VI. Bu 5 noktadan örneğin 4 tanesi sınıf 1’e 1 tanesi de sınıf 2’ye aitse yeni gelen X verisinin sınıf 1’e ait olduğuna karar verilir.

ÖRNEK:

Sekil1_9

Yukarıdaki örnekte Y kümesi Y1 (12,3), Y2 (11,4), Y3 (3,7), Y4 (4,8), Y5 (6,4), Y6 (14,5) ve Y7 (17,8) elemanlarından oluşuyor. Her noktada ise X1 ve X2 özellikleri (attribute) bulunuyor. Y sütunu ise bu veri küçülmesinin hangi iki sınıfa ayrıldığını belirtiyor (y; ya 1 ya da -1'dir). Sisteme Y8 (13,4) verisi geldiğinde bu verinin hangi sınıfa ait olduğu ise yukarıda görülür.

Bu örnekte Y8 ile Y1, Y2, Y3, Y4, Y5, Y6, Y7 noktaları arasındaki Euclidian uzaklıklar hesaplanarak G4 - G10 hücreleri arasına yerleştirilmiştir. k = 3 seçilerek bu uzaklıklardan en küçük 3 tanesi işaretlenmiştir (G4, G5 ve G9). Bunların tümü de 1 sınıfı ile ilişkili noktalara ait olduğu için Y8 noktasının da 1 ile temsil edilen sınıfa ait olduğu sonucuna varılır.

Not: Excel’de Euclidian uzaklıkları aşağıdaki formülle hesaplanır;

=SQRT(($C$11-C4)^2+($D$11-D4)^2)

YÖNTEMİN YARARLARI VE SAKINCALARI

Her yöntemde olduğu gibi k adet en yakın komşu sınıflandırıcısı yönteminin de yararlı ve sakıncalı tarafları mevcuttur. Bunları şu şekilde listeleyebiliriz:

YARARLARI

  1. 1. Anlaşılması ve uygulanması çok kolay olan bir yöntemdir.

SAKINCALARI

  1. 1. Hesaplama ve işlem sayısı çok fazladır.
  2. 2. Birkaç düzineden daha fazla özelliğe (attribute) sahip verilerin bu yöntemle sınıflandırılması pratik olarak mümkün değildir.

KARAR AĞAÇLARI (DECISION TREES) İLE SINIFLANDIRMA

Karar ağaçları sınıflandırma işlemlerinde sık kullanılan ve anlaşılması çok da zor olmayan yöntemlerden biridir.

Şekil 1.a’da verilen süreç şu şekilde uygulanır: İlk aşamada verilen bir öğrenme (training) verisi kullanılarak bir karar ağacı oluşturulur (model). Sonrasında ise bu karar ağacı (model) kullanılarak verilen bir test verisindeki veri kalemlerinin hangi sınıf ya da sınıflara ait olduğu belirlenir. (modelin (ağacın) uygulama aşaması).

Bir karar ağacında 3 farklı tipte düğüm (node) kullanılır:

  1. 1. Kök düğüm (root node): Karar ağacının başlangıcıdır. Bu düğüme gelen bir kenar ya da dal yoktur; ancak bir özelliğin (attribute) test edilmesi sonucunda düğümden çıkan 0 ya da daha fazla dal ya da kenar mevcuttur.
  2. 2. İç düğümler (internal nodes): Bu düğümlerin her birine gelen bir kenar ve düğümden çıkan 2 ya da daha fazla kenar mevcuttur.
  3. 3. Yaprak düğüm (leaf node): Yaprak düğüme gelen sadece bir kenar mevcuttur. Yaprak düğümden çıkan bir kenar ise mevcut değildir. Şekil 4’te bir karar ağacı görülüyor.
  4. 4. Kenarlar (edges): Bir test sunucuna karşı gelen ve düğümü başka bir düğüme ya da yaprağa bağlayan çizgilerdir.

Şekil 4 ’teki karar ağacı ile TC vatandaşı olup cinsiyeti erkek olan kişiler (+) sınıfına, diğerleri ise (-) sınıfına atanmaktadır. Bu ağaçta kök düğüm cinsiyet özelliğini (attribute), iç düğüm ise vatandaşlık özelliğini kontrol etmektedir. Verinin hangi sınıfa ait olduğu da yaprak düğümlerle belirtilmektedir. Şekil 4’teki ağaçta kök düğüm elips, iç düğüm daire, yaprak düğümler ise dikdörtgen sembolü ile gösterilmiştir.

Şekil 4: Bir karar ağacı

Şekil 4: Bir karar ağacı

KARAR AĞAÇLARININ TASARIMI

Verilen bir özellik (attribute) kümesi için oluşturulabilecek karar ağaçlarının sayısı üstel olarak artan özelliktedir. Bu nedenle verilen bir veri grubu için en iyi (optimal) olan ağacı aramak genellikle yapılabilir (feasible) bir işlem olmayacaktır. Yani aynı sınıflandırma işi birden çok ağaç tarafından gerçekleştirilebilir.

En iyi ağaç şüphesiz sınıflandırma işini en kısa sürede ve en az işlem sayısı ile yapan ağaçtır. O nedenle genellikle en iyiye yakın (suboptimal) ağacın bulunması ile yetinilir. Bunu sağlayan bazı algoritmalar vardır ve bunların başında Hunt algoritması gelir. Bu algoritmadan esinlenerek daha sonra üretilen algoritmalar ise,

                      
ID3
C4.5
C5.0
                      
                    

ve

                      
CART 
SLIQ
SPRINT
                      
                    

algoritmalarıdır.

C5.0 KARAR AĞACI ALGORİTMASI

VERİLEN BİR YENİ ÖRNEK VERİNİN SINIFLANDIRILMASI

  1. 1. Kökten başla
  2. 2. Seçilen özelliğe (attribute) göre test işlemini gerçekleştir
  3. 3. Test sonucuna uygun gelen kenarı izle
  4. 4. Yaprağa erişmedikçe 2.adıma GİT
  5. 5. Yaprak ile sonuçlanan test sonucunu belirle
Sekil 1_11

FONKSİYONLARIN KARAR AĞACI İLE GÖSTERİLMESİ

Genel olarak her fonksiyon değişkenleri (attribute) giriş bilgisi olarak alınarak bir karar ağacı ile gösterilebilir. Özellikle mantıksal (boolean) fonksiyonlar bu gösterim için çok uygundur. Örneğin; XOR fonksiyonunu ele alırsak, XOR (A,B) şeklindeki iki değişkenli bu fonksiyonun A ve B girişleri aynı ise (T-True veya F-false) sonuç F, A ve B girişleri farklı ise (biri T öteki F) sonuç T’dir. Aşağıda bu fonksiyonun doğruluk tablosu (truth table) ve ilişkili karar ağacı (decision tree) görülmektedir:

Sekil 1_12

SÜREKLİ (CONTINUOUS) GİRİŞLERE SAHİP SİSTEMLERİN SINIFLANDIRILMASI

Aşağıda grafiksel olarak verilmiş bir sınıflandırma nümerik değerlere göre gerçekleştirilmiştir:

Şekil 5: Nümerik değerlere göre geometrik sınıflandırma

Şekil 5: Nümerik değerlere göre geometrik sınıflandırma

Aşağıdaki karar ağacı ise Şekil 5’teki grafiğe göre oluşturulmuştur:

Şekil 5a

Verilen alıştırma verisine göre (Şekil 5) yukarıdaki karar ağacı oluşturulmuştur. Buna göre sisteme yeni bir veri gelirse ve bu veri X1 = 5.5, X2 = 1 noktası olursa, karar ağacında kök düğümden itibaren düğümler izlenerek bu noktanın A sınıfına ait olduğunu kolayca anlarız.

Şimdi aşağıdaki Tablo I’de verilen verileri göz önüne alalım:

Tablo I: Karar ağacı verileri

Cinsiyet Otomobil Sahipliği Seyahat Masrafı/Km Ulaşım Şekli
Erkek 0 Ucuz Otobüs
Erkek 1 Ucuz Otobüs
Kadın 1 Ucuz Tren
Kadın 0 Ucuz Otobüs
Erkek 1 Ucuz Otobüs
Erkek 0 Standart Tren
Kadın 1 Standart Tren
Kadın 1 Pahalı Otomobil
Erkek 2 Pahalı Otomobil
Kadın 2 Pahalı Otomobil

Bu verileri kullanarak aşağıdaki karar ağacı oluşturulabilir:

Şekil 6: Ulaşım şekli karar ağacı

Şekil 6: Ulaşım şekli karar ağacı

Bu durumda aşağıdaki Test verilerinin verilmiş olduğunu var sayalım:

Ad Cinsiyet Otomobil Sahipliği Seyahat Masrafı/Km Ulaşım Şekli
Ali Erkek 1 Standart ?
Ayşe Kadın 1 Ucuz ?

Test verisinin ait olduğu sınıf (Ulaşım şekli), oluşturulan karar ağacı yardımı ile kolayca bulunur. Buna göre aşağıdaki sonuca varılacaktır:

Ad Cinsiyet Otomobil Sahipliği Seyahat Masrafı/Km Ulaşım Şekli
Ali Erkek 1 Standart Tren
Ayşe Kadın 1 Ucuz Tren

KARAR AĞACINDAN KURALLAR OLUŞTURMA

Oluşturulan karar ağacındaki her yaprak düğüme kök düğümden itibaren ulaşım şeklini yorumlayarak bazı kurallar (rules) oluşturabiliriz.

Şekil 6’daki karar ağacından aşağıdaki kuralları çıkarmak mümkündür:

KURAL 1: Seyahat masrafı/KM pahalı ise ulaşım şekli otomobildir.
KURAL 2: Seyahat masrafı/KM standart ise ulaşım şekli trendir.
KURAL 3: Seyahat masrafı/KM ucuz ve cinsiyet erkek ise ulaşım şekli otobüstür.
KURAL 4: Seyahat masrafı/KM ucuz ise ve cinsiyet kadınsa ve otomobil sahipliği yoksa ulaşım şekli otobüstür.
KURAL 5: Seyahat masrafı/KM ucuz ise ve cinsiyet kadınsa ve otomobil sahipliği varsa ulaşım şekli trendir.

KARAR AĞACININ TASARIMI

Bir karar ağacının oluşturulmasında kullanılacak veri içinde pek çok özellik (attribute, feature) bulunduğunu biliyoruz. Örneğin, yukarıdaki ağaç 3 adet özellik kullanılarak oluşturulmuştur. Bunlar, Cinsiyet, Otomobil sahipliği ve Seyahat masrafı/KM özellikleridir. Sonuçta verinin üç sınıftan hangisine ait olduğu tespit edilmektedir (otomobil, otobüs, tren).

Buradaki önemli tasarım problemi şudur; karar ağacı oluşturulurken kök düğümdeki test ya da kontrol için hangi özellik alınmalıdır? Örneğin, kök düğümde cinsiyet mi yoksa seyahat masrafı/KM mi kontrol edilmelidir? Kök düğüme tatmin edici biçimde karar verildikten sonra diğer düğümlerde hangi özelliklerle ilerlemek gerekir?

Bütün bu soruların cevaplarını bulabilmek için yeni bazı kavramları öğrenmek ya da hatırlamak gereklidir. Bu bölümde bu konulara yer vereceğiz. Bunun için de aşağıdaki veri tablosunu kullanacağız:

Tablo II: Genişletilmiş karar ağacı verileri

Cinsiyet Otomobil Sahipliği Seyahat Masrafı/Km Gelir Ulaşım Şekli
Erkek 0 Ucuz Düşük Otobüs
Erkek 1 Ucuz Orta Otobüs
Kadın 1 Ucuz Düşük Tren
Kadın 0 Ucuz Orta Otobüs
Erkek 1 Ucuz Yüksek Otobüs
Erkek 0 Standart Orta Tren
Kadın 1 Standart Yüksek Tren
Kadın 1 Pahalı Orta Otomobil
Erkek 2 Pahalı Orta Otomobil
Kadın 2 Pahalı Orta Otomobil

Burada 4 özellik (cinsiyet, otomobil sahipliği, seyahat masrafı/KM, gelir) ve bir sınıf (ulaşım şekli) mevcuttur.

ENTROPY KAVRAMI

Entropi bir ortam ya da maddenin saf olmama derecesini (impurity degree) ya da heterojenlik derecesini gösteren bir büyüklüktür. Aşağıdaki biçimde tanımlanmıştır:

Sekil 11_16

Burada pj tablodaki sınıf değerlerine göre hesaplanan olasılıklardır (probability). j = 1 otobüs, j = 2 otomobil ve j = 3 tren olabilir. Örneğin, yukarıdaki tabloda ulaşım şekli sınıfına ait 3 farklı değer vardır (otobüs, otomobil ve tren). Son sütunda bunların sayıları sırası ile 4, 3, 3 ve her birinin olasılığı ise p(otobüs) = 4 / 10, p(otomobil) = 3 / 10 ve p(tren) = 3 / 10’dur.

ÖRNEK:

Yukarıdaki Tablo II’de, 4 adet otobüs, 3 adet otomobil ve 3 adet tren mevcuttur. Buna göre tablo verisine ait entropi;

Entropi= -0,4 log(0.4) – 0,3 log(0.3) – 0,3 log(0.3) = 1.571

şeklinde hesaplanacaktır.

Entropi, tek bir sınıftan oluşan (örneğin, sadece otobüs) bir tabloda (saf bir tablo(pure)) 0’dır, çünkü bu tabloda p(otobüs) = 1 olacaktır. log(1) değeri de 0’dır.

Entropinin en yüksek olduğu durum n adet sınıftan oluşan tabloda her sınıfa ait olasılığın birbirine eşit olması halidir. Bu durumda olasılık, p = 1 / n olacaktır.

Bu durumda maksimum entropi, -n. p. log(p) değerine eşit olacaktır.

Şekil 7: Entropi ve olasılıklar

Şekil 7: Entropi ve olasılıklar

GINI İNDEKSİ

Tablonun saf olmama derecesini ölçmek üzere kullanılan başka bir büyüklük te Gini İndeksi’dir. Gini indeksi aşağıdaki gibi tanımlanmıştır:

Sekil 11_18

ÖRNEK:

Tablo II ’deki veri için p (otobüs) = 0.4, p (otomobil) = 0.3 ve p (tren) = 0.3 olup Gini indeksini,

Gini indeksi = 1 - (0.4 * 0.4 + 0.3 * 0.3 + 0.3 * 0.3) = 0.660

şeklinde hesaplayabiliriz.

Gini indeksi de homojen (saf, tek sınıf değerli) bir tablo için 0 değerini alır. (Çünkü 1 - p2 = 1 - 12 = 0)

Entropiye benzer şekilde Gini indeksi için de maksimum değer, eşit olasılıklara sahip sınıf değerleri durumunda elde edilir. Aşağıdaki Şekil 8 ise olasılıklar ve Gini indeksi değerlerini göstermektedir.

Şekil 8: Olasılıklar ve Gini indeksi değerleri

Şekil 8: Olasılıklar ve Gini indeksi değerleri

SINIFLANDIRMA HATASI (CLASSIFICATION ERROR)

Tablonun heterojenliğini ölçmenin diğer bir yolu da sınıflandırma hata indeksini hesaplamaktır.

Sınıflandırma hata indeksi = 1 - max { pj }

Şeklinde tanımlanır. Yukarıdaki tablo için bu değer,

Max {0.4,0.3,0.3} = 1 - 0.4 = 0.6 olacaktır.

Sınıflandırma hata indeksi saf (tek sınıf değerli) bir tabloda 0 olacaktır (Entropi ve Gini indeksi gibi). Sınıflandırma hata indeksi daima 0 - 1 aralığındadır. Maksimum sınıflandırma hata indeksi ile maksimum Gini indeksi birbirine eşittir ve her biri 1 – 1 / n ’e eşittir.

R DİLİNDE KARAR AĞACI OLUŞTURMA

Bir karar ağacı oluşturmak için önce çok basit bir R kodunu çalıştıracağız:

                      
library (rpart)
data(mcycle)
plot(accel~times,data=mcycle)
mct <- rpart(accel ~ times, data=mcycle)
plot(mct)
                      
                    

Bu kodların sonucunda aşağıdaki basit ağaç yapısını elde edeceğiz:

ŞEKİL AG_1: Basit Karar ağacı

ŞEKİL AG_1: Basit Karar ağacı

İRİS VERİSİ İLE İLİŞKİLİ KARAR AĞACININ OLUŞTURULMASI

Aşağıdaki R kodunu çalıştıralım:

                      
iris_ctree <- ctree(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data=iris)
print(iris_ctree)
plot(iris_ctree)
                      
                    

Aşağıdaki çıktıyı elde ederiz:
Conditional inference tree with 4 terminal nodes
Response: Species
Inputs: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
Number of observations: 150

1) Petal.Length <= 1.9; criterion = 1, statistic = 140.264
      2)* weights = 50
2) Petal.Length > 1.9
      3) Petal.Width <= 1.7; criterion = 1, statistic = 67.894
          4) Petal.Length <= 4.8; criterion = 0.999, statistic = 13.865
              5)* weights = 46
      4) Petal.Length > 4.8
              6)* weights = 8
    3) Petal.Width > 1.7
        7)* weights = 46

Şekil AG_2: İris verisi ile ilişkili karar ağacı

Şekil AG_2: İris verisi ile ilişkili karar ağacı

REGRESYON METOTLARI (REGRESSION METHODS)

EĞRİ UYDURMA (CURVE FITTING)

Önce eğri uydurma (curve fitting) kavramını kısaca inceleyelim. (xi, yi) (i = 1,2, … n) bir deney ya da ölçüm sonucunda elde edilen veri çiftleri olsun. Bu noktalardan faydalanarak y değerlerini temsil etmek üzere sürekli bir g(x) fonksiyonunu en az hata ile oluşturma işlemine eğri uydurma (curve fitting) adı verilir.

Örneğin, g(x) bir polinomsa ve derecesi k ile gösteriliyorsa,

g(x)=c1xk+c2xk-1+… ckx+ck+1

şeklinde ifade edilebilir. k = n - 1 ise, n adet noktadan n - 1’nci dereceden bir polinom tam olarak geçirilebileceği için problem enterpolasyon problemi haline gelir. k < n - 1 olması halinde ise g(x)’teki katsayıların sayısı nokta sayısından az olacağı için, problem en küçük kareler yöntemi ile çözülebilir. Her nokta için hesaplanacak olan f(x) - g(x) hata değerlerinin karelerinin toplamını minimize ederek uygun g(x) katsayıları bulunur.

BASİT LİNEER REGRESYON

Basit Lineer Regresyon istatistiksel bir metottur ve iki değişken arasındaki bağıntıyı bulmayı hedefler.

x ile göstereceğimiz bir değişken bağımsız (independent), açıklayıcı (explanatory) ya da belirleyici (predictor) değişken adını alır.

y ile göstereceğimiz diğer değişken ise, cevap (response), çıkış (outcome) ya da bağımlı (dependent) değişken adını alır.

VERİYE EN İYİ UYAN (BEST FITTING) DOĞRUYU BULMAK

x ve y değerleri için elimizde ölçülmüş veriler bulunmaktadır. Bunları xi ve yi olarak temsil edelim:

xi, i noktasına ait ölçülmüş belirleyici değişken değeri
yi, i noktasına ait ölçülmüş cevap değeri
i ise i noktasına ait belirleyici cevap veya uydurulmuş değer olsun.

Verilen n adet noktadan oluşan veri kümesi için (xi, yi, i=1,2,… n) bu kümeye en iyi uyan doğru

şeklinde ifade edilir. yi ölçülmüş ya da gerçek değeri ile y ̌i kestirim ya da uydurulmuş değer arasındaki fark, yani e değeri bize hatayı verecektir:

Hata yerine genellikle hatanın karesi kullanılır, çünkü değişik noktalarda hata değerleri hem pozitif hem de negatif olacağı için birbirlerini götürebilirler. Bu nedenle daima pozitif olan e2i ‘yi kullanmak daha doğru olacaktır:

Aşağıdaki sigma notasyonu, bildiğiniz gibi 1’den n’e kadar toplam işlemini ifade etmektedir:

n adet noktadaki hataların kareleri toplamı,

şeklinde ifade edilebilir. y ̌i yerine b0 + b1xi ifadesini yazarsak ifade aşağıdaki şekle gelir:

Bu ifadenin b0 ve b1 ’e göre kısmi türevleri alınır ve 0’a eşitlenirse b0 ve b1’in değerlerini hesaplayacağımız iki denklem elde edilir. Bu ayrıntıyı atlayıp sonuçları verirsek:

Burada x̄ ve ȳ sırası ile x ve y değerlerinin aritmetik ortalamalarıdır ve

y  =(x1 + x2 + … xn) / n ve = (y1 + y2 + … yn) / n şeklinde tanımlanır.

Şekil R_1’de verilmiş veri kümesi (mavi noktalar) ve uydurulmuş doğru (kırmızı renkli) görülmektedir.

Şekil R_1: Veri noktaları (mavi) ve uydurulmuş doğru (kırmızı)

Şekil R_1: Veri noktaları (mavi) ve uydurulmuş doğru (kırmızı)

R DİLİNDE BASİT LİNEER REGRESYON ÖRNEĞİ:

X ve Y’nin ölçülmüş değerleri aşağıdaki gibi olsun:

X Y
2 3,1
5 4,2
8 6
12 7,9
17 10,7
19 11
25 14,6
26 15,3
30 16,5
40 21,8

Bu veri kümesinden faydalanarak,

Lineer bağıntısını bulmaya çalışacağız. R dilinde aşağıdaki kodu çalıştıralım:

                      
x <- c (2, 5, 8, 12, 17, 19, 25, 26, 30, 40)
y <- c (3.1,4.2, 6, 7.9, 10.7, 11, 14.6,15.3, 16.5, 21.8)
bag <- lm(y~x)
print(bag)
                      
                    

Aşağıdaki çıktıyı elde ederiz:

                      
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept)   x  
1.9770        0.4964  
                      
                    

Burada b0 = 1.9770 ve b1=0.4964 olarak bulunur. Şimdi ölçülmemiş X = 4 noktası için tahmin yapmak için

y̌ = b0+b1.x = 1,9770 + 0,4964.x
bağıntısında x = 4 koymak yeterli olacaktır.
y̌ = 1,9770 + 0,4964.4 = 3,9626 değeri bulunur.

TAHMİN DEĞERİNİ PREDICT FONKSİYONU İLE BULMA

Aşağıdaki R kodunu çalıştırınız:

                      
x <- c(2, 5, 8, 12, 17, 19, 25, 26, 30, 40)
y <- c(3.1,4.2, 6, 7.9, 10.7, 11, 14.6,15.3, 16.5, 21.8)
bag <- lm(y~x)
z<-data.frame(x,y)
r <-  predict(bag,data.frame(x=4))
print(r)
                      
                    

Sonuçta x = 4 için y değeri aşağıdaki gibi bulunur:

                      
3.962408 
>
                      
                    

Bu sonuç yukarıdaki değer ile aynıdır.

VERİ NOKTALARI İLE UYDURULAN EĞRİYİ AYNI EKSENLER ÜZERİNDE GÖRME

Aşağıdaki grafikte verilen veri noktaları ile bunlardan faydalanarak yukarda anlatılan metotla uydurulan doğru (fitting line) aşağıdaki R kodu ile oluşturulur:

                      
x <- c(2, 5, 8, 12, 17, 19, 25, 26, 30, 40)
> y <- c(3.1,4.2, 6, 7.9, 10.7, 11, 14.6,15.3, 16.5, 21.8)
> bag <- lm(y~x)
> plot(x,y,abline(bag))
                      
                    

Bu kod ile oluşturulan grafik Şekil R_2’de görülür:

Şekil R_2: Veri noktaları ve lineer regresyon ile uydurulan doğru

Şekil R_2: Veri noktaları ve lineer regresyon ile uydurulan doğru

ÇOKLU LİNEER REGRESYON (MULTIPLE REGRESSION)

Çoklu Regresyon, Lineer Regresyonun genişletilmiş halidir. İki değişken yerine ikiden fazla değişken arasında bağıntı kurmayı dener. Bu durumda çoklu regresyonda birden çok bağımsız değişken (x1,x2, ... xn) ve bir tane bağımlı değişken mevcuttur.

Çoklu regresyonun genel matematiksel ifadesi aşağıdaki gibidir:

Y = a + b1x1 + b2x2 + … bnxn

Aşağıda bu değişkenlerin anlamları verilmektedir:

  • • y Cevap değişkeni ya da bağımlı değişken
  • • a, b1, b2, ... bn katsayılardır
  • • x1, x2, ...xn ise belirleyici ya da bağımsız değişkenlerdir.

R dilinde regresyon modeli bildiğiniz gibi lm( ) fonksiyonu ile oluşturulur. Model, giriş verisini kullanarak katsayıların değerlerini belirler. Daha sonra verilen bazı veri değerleri için bu katsayılar yardımı ile cevap değeri (y) hesaplanacaktır.

lm( ) FONKSİYONU

Bu fonksiyon bağımlı ve bağımsız değişkenler arasında bir ilişki modeli oluşturur. Yazılış biçimi aşağıdaki gibidir:

lm(y~x1+x2+x3…,VERİ)

ÖRNEK:

Aşağıdaki tabloda görülen veriler verilmiştir:

y x1 x2 x3
4 1 1 1
0 1 3 4
5 2 1 2
11 3 2 1
11 4 1 1
9 2 1 3
3 1 2 2

Bu veriden faydalanarak,

Y = a + b1x1 + b2x2 + b3x3

Şeklinde bir bağıntı bulalım. Bu bağıntıyı bulduğumuz takdirde, tabloda bulunmayan ve ölçülmemiş mesela x1=5, x2=3, x3 = -2 veri kümesi için y değerinin ne olacağını tahmin edebiliriz. Aşağıdaki program bu işlevi yerine getir:

                      
x1<-c(1, 1, 2, 3, 4, 2, 1)
x2<-c(1, 3, 1, 2, 1, 3, 2)
x3<-c(1, 4, 2, 1, 2, 1, 2)
y<-c(4, 0, 5, 11, 11, 9, 3)
s<-data.frame(y, x1, x2, x3)
gir <- s

model <- lm(s$y~s$x1+s$x2+s$x3, data = gir)

print(model)

a <- coef(model)[1]
print(a)
b1 <- coef(model)[2]
b2 <- coef(model)[3]
b3 <- coef(model)[4]

print(b1)
print(b2)
print(b3)
                      
                    

PROGRAMININ ÇIKTISI

                      
> a <- coef(model)[1]
> print(a)
(Intercept) 
          2 
> b1 <- coef(model)[2]
> b2 <- coef(model)[3]
> b3 <- coef(model)[4]
> print(b1)
s$x1 
   3 
> print(b2)
s$x2 
   1 
> print(b3)
s$x3 
  -2 
>
                      
                    

Programın çıktılarını incelediğimizde a = 2, b1 = 3, b2 = 1 ve b3 = -2 olduğunu görürüz. Buna göre model ya da bağıntı,
Y=2+3.x1+x2-2.x3

Şeklinde olacaktır. Bu durumda
x1 = 5, x2 = 3, x3 = -2 veri kümesi için y değeri,
y = 2+3.5+3-2.(-2)
şeklinde hesaplanır. Sonuç y = 24 olur.

KOVARYANS VE KORELASYON

KOVARYANS (COVARIANCE)

x ve y gibi iki değişken arasında bir ilişki olup olmadığını gösterir. Eğer kovaryans pozitif çıkarsa, x ve y arasında pozitif bir ilişki vardır, yani biri artarken diğeri de artar. Kovaryans negatif çıkarsa x ve y arasında negatif bir ilişki olduğu söylenebilir, yani bu durumda biri artarken diğeri azalır. Kovaryansın sıfır çıkması ise iki değişken arasında bir ilişki olmadığını gösterir.

Kovaryans formülü aşağıdaki gibidir:

Burada,
COV(x, y) — x ve y değişkenleri arasındaki kovaryans değeridir.
xi — x değişkeni değeri
yi — y değişkeni değeri
— xi veri değerlerinin ortalaması
— yi veri değerlerinin ortalaması
n — Toplam veri miktarı

R DİLİNDE KOVARYANSIN HESAPLANMASI

    x     y
2 5
5 2
7 9
12 3
16 23
21 45
25 11
36 23
41 54

R dilinde bunlar arasındaki korelasyonu hesaplayalım. Bu amaçla R dilinde cov fonksiyonu kullanılır. Yazılış biçimi,

                      
cov(x,y)
                      
                    

Şeklindedir. x, xi veri kümesi vektörü y ise yi veri kümesi vektörüdür.

ÖRNEK VERİ İÇİN KOVARYANS HESAPLAYAN R PROGRAMI

                      
x<-c(2,5,7,12,16,21,25,36,41)
y<-c(5,2,9,3,23,45,11,23,54)
print(cov(x, y))
                      
                    

PROGRAMININ ÇIKTISI

                      
> print(cov(x, y))
[1] 192.5833
>
                      
                    

Burada pozitif bir değer çıkması, x ve y arasında pozitif bir ilişki olduğunu gösterir. Bir değer artarken öteki de aynı yönde artmaktadır.

KORELASYON (CORRELATION)

Korelasyon da kovaryans gibi x ve y değişkenleri arasında bir ilişki olup olmadığını belirler. Kovaryanstan farkı, korelasyonda bu ilişkinin kuvveti ya da derecesi de belirlenir. Korelasyon katsayısı formülü aşağıdaki gibidir:

Burada,
r(x,y) — x ve y değişkenleri arasındaki korelasyon katsayısıdır.
COV(x,y) — x ve y değişkenleri arasındaki kovaryans değeridir.
Sx — x değişkenine ait örneğin standart sapmasıdır.
Sy — y değişkenine ait örneğin standart sapmasıdır.
Korelasyon katsayısı -1 ile +1 arasında sınırlı bir değerdir.

(-) : Negatif korelasyonu gösterir. x artarken y azalır ya da tersi.
(+) : Pozitif korelasyonu gösterir. x artarken y de artar.
0 : iki değişken arasında bir ilişki yoktur.

R DİLİNDE UYGULAMALAR

ÖRNEK:

Elimizde aşağıdaki veri olsun:

   x    y
2 5
5 2
7 9
12 3
16 23
21 45
25 11
36 23
41 54

Bu veri için R dilinde korelasyon katsayısını hesaplayalım:

                      
x<-c(2,5,7,12,16,21,25,36,41)
y<-c(5,2,9,3,23,45,11,23,54)
print(cor(x, y))                        
                      
                    

PROGRAMIN ÇIKTISI

                      
> print(cor(x,y))
[1] 0.7479503
>                       
                      
                    

Sonucun 1’e yakın çıkması kuvvetli bir pozitif korelasyonu gösteriyor.

İLİŞKİLİ KURAL ÖĞRENMESİ (ASSOCIATION RULE LEARNING)

TEMEL KAVRAMLAR
İLİŞKİLENDİRME KURALI (ASSOCIATION RULE)

Aşağıdaki tabloda bir markette gerçekleştirilen hareketlerle ilgili (transactions) veri tabanı verilmektedir. Her hareket bir müşteri tarafından satın alınan ürünlerin bir listesini içermektedir.

HAREKET_KOD PEYNİR EKMEK COLA ŞEFTALİ
1 1 1 1
2 1 1 1 1
3 1 1
4 1 1 1
5 1 1 1 1

Burada amaç, bir hareketteki ürün kombinasyonu ile başka bir hareketteki ürün kombinasyonu arasında mevcut bazı ilişkileri bulmaktır. Örneğin yukarıdaki tablodan hızlıca çıkan bir sonuçta "Ekmek satın alanların çoğu aynı zamanda şeftali de satın almıştır”.

DESTEK (SUPPORT) VE GÜVEN (CONFIDENCE) KAVRAMLARI

  1. I. DESTEK (SUPPORT)

    Destek kavramı aşağıdaki formüle göre ifade edilebilir:
    Destek (Support)(X) = Miktar(X)/N
    Burada,
    N — Hareket sayısı,
    X — Tek bir ürün ya da ürün kümesidir. Yukarıdaki veri için X = {ekmek, kola} alınırsa ve N = 5 olursa,
    DESTEK(X) = Miktar{ekmek, kola} / 5 = 4 / 5 = 0,8 olacaktır.

    X = {peynir} alınırsa bu durumda destek,
    Destek = 3 / 5 = 0,6 olacaktır.

  2. II. GÜVEN (CONFIDENCE) KAVRAMI

    Güven kavramı da aşağıdaki biçimde tanımlanır:

    GÜVEN (X ⇒ Y) = DESTEK (X, Y) / DESTEK (X)

    Burada pay X ve Y’yi içeren veri kümesi için destek değerini, payda ise sadece X’i içeren destek değerini simgelemektedir.

    ÖRNEK:

    X = {ekmek} ve Y = {peynir} olsun.
    Destek (ekmek, peynir) = 3 / 5 = 0.6
    Destek (ekmek) = 5 / 5 = 1
    Güven (ekmek ⇒ peynir) = 0,6 / 1 = 0,6 olacaktır.
    Buradan şu sonuca ulaşırız; Ekmek alanların sadece %60’ı peynir de almıştır.

    Şimdi,
    Güven (peynir ⇒ ekmek) değerini hesaplayalım.
    Destek (peynir, ekmek) = 3 / 5 = 0.6 ve
    Destek (peynir) = 3 / 5 = 0.6

    Sonuçta,
    Güven (peynir ⇒ ekmek) = 0.6 / 0.6 = 1.0
    olacaktır. Yani, peynir alanlar mutlaka ekmek de almıştır. Bu bilgiden hareketle söz konusu market çeşitli kampanyalar yapabilir.

SIKÇA (FREQUENT) TEKRAR EDEN HAREKETLER

Destek oranı belli bir değerde ya da bu değerin yukarısında olan hareketler “sık tekrar eden” hareketler olarak nitelendirilir ve bunlar ilişki çıkarma işlemlerinde çok faydalı olabilir.

ÖRNEK:

Aşağıdaki hareket tablosu verilmiş olsun:

HAREKET NO SATILAN ÜRÜNLER
1 A, D
2 A, C
3 A, B, C
4 B, E, F

Sık tekrar eden ürün kümesi = {A, C}, Tekrar sayısı -> 2
A -> C — Destek = %50   Güven == %66
C -> A — Destek = %50   Güven = %100

İLİŞKİ KURALLARI MADENCİLİĞİ (ASSOCIATION RULE MINING)

Bu bölümde verilen bir hareket tablosundan ilişki kurallarını nasıl çıkaracağımızı inceleyeceğiz. Bunun için önceden bilmemiz gereken bazı kurallar mevcuttur. En sık tekrar eden hareketleri ya da ürün kümelerini bulmak önemli bir aşamadır. Aşağıdaki örneğe bakalım:

Şekil PT_1: İlişki kuralları madenciliği

Şekil PT_1: İlişki kuralları madenciliği

Bu tablodaki bilgilere göre,
A ⇒ C KURALI İÇİN:
DESTEK = DESTEK ({A, C }) = 50%
GÜVEN = DESTEK({A, C }) / DESTEK({A}) = 66,6%
değerleri elde edilecektir.

APRIORI PRENSİBİ

  1. I. “Sık tekrar eden bir ürün kümesinin herhangi bir alt kümesi de sık tekrar eder”. Örneğin, {A,B,C} sık tekrar ediyorsa, {A,B} de sık tekrar eder.
  2. II. “Sık tekrar etmeyen bir ürün kümesinin üst kümeleri (superset) de sık tekrar etmez.”. Örneğin, {A,B} sık tekrar etmiyorsa {A,B,C} de sık tekrar etmez.

Şekil PT_2’deki gibi bir ürün seti kafesi ile bu tür ilişkileri düzenlemek kolaylaşır:

Şekil PT_2: Ürün kümesi kafesi

Şekil PT_2: Ürün kümesi kafesi

ÖRNEK UYGULAMA

VERİ TABANINDAN SIK ÜRÜN HAREKETLERİNİN ÇIKARILMASI

Bunun için aşağıdaki basit algoritmayı kullanabiliriz;

  1. 1. Önce tek ürünler için bütün veri tabanı taranır ve tekrar sayıları bulunur:
    Şekil PT_3: Veri tabanının tekli ürünler için taranması

    Şekil PT_3: Veri tabanının tekli ürünler için taranması

  2. 2. Minimum tekrar sayısı belirlenir. Örneğin burada minimum tekrar sayısı 2 alınırsa tablo Şekil Pt_4’teki hale gelir:
    Şekil PT_4: Minimum tekrar sayısına göre ayıklama

    Şekil PT_4: Minimum tekrar sayısına göre ayıklama

  3. 3. Veri tabanı taranarak şekil PT_4’teki ürünleri içeren ikililer bulunur (Şekil PT_5).
    Şekil PT_5: En çok tekrar eden ürünleri içeren ikililer

    Şekil PT_5: En çok tekrar eden ürünleri içeren ikililer

  4. 4. Veri tabanı taranarak Şekil PT_5’teki ikililerin kaçar kere tekrar ettiği bulunur (Şekil PT_6).
    Şekil PT_6: İkili kümelerin tekrar sayısı

    Şekil PT_6: İkili kümelerin tekrar sayısı

  5. 5. Minimum tekrar sayısı 2 kabul edilerek bunun altındaki tekrar sayılarına ait (1 olan) satırlar silinir (Şekil PT_7).
    Şekil PT_7: Minimum tekrar sayısının altındaki hareketlerin silinmesi

    Şekil PT_7: Minimum tekrar sayısının altındaki hareketlerin silinmesi

  6. 6. Veri tabanı taranarak Şekil PT_8’deki ürünleri içeren ve en çok tekrar eden üçlü ürün kümeleri bulunur.
    Şekil PT_8: Üçlü ürün kümelerinin bulunması

    Şekil PT_8: Üçlü ürün kümelerinin bulunması

  7. 7. Nihayet Şekil PT_8’deki 3’lü ürün kümesinin tekrar sayısı bulunur (Şekil PT_9).
    Şekil PT_9: Üçlü kümelerin tekrar sayısı

    Şekil PT_9: Üçlü kümelerin tekrar sayısı

SIK TEKRAR EDEN KÜMELERDEN İLİŞKİ KURALLARI BULUNMASI

Elimizde aşağıdaki gibi 3’lü bir sık tekrar eden ürün kümesi olsun:
{A,B,E}

Bu kümeden sistematik olarak aşağıdaki ilişki kurallarını çıkarabiliriz:

A => B, E — A’yı satın alan B ve E’yi de satın alır.
A, B => E — A ve B’yi satın alan E’yi de satın alır.
A, E => B — A ve E’yi satın alan B’yi de satın alır.
B => A, E — B’yi satın alan A ve E’yi de satın alır.
B, E => A — B ve E’yi satın alan A’yı da satın alır.

KÜMELEME (CLUSTERING) ALGORİTMALARI

KÜMELEME (CLUSTERING) İŞLEMİ

Kümeleme algoritmaları elinizdeki bir veriyi, verinin sahip olduğu bazı özelliklere (attribute / feature) göre belirli sayıda kümeye ya da gruba ayırır.

K-ORTALAMALAR (MEANS) KÜMELEME (CLUSTERING) ALGORİTMASI

Basitçe söylemek gerekirse bu algoritma elinizdeki bir veriyi, verinin sahip olduğu bazı özelliklere (attribute / feature) dayanarak, k sayıda kümeye ya da gruba ayırma işlemini gerçekleştirir. Burada k uygulamaya göre kullanıcının seçtiği küme sayısıdır.

k bir tamsayıdır. Algoritmanın esası, her kümeye isabet eden verilerle o kümenin merkezi (centroid) arasındaki mesafelerin en aza indirilmesidir (minimize edilmesi). Böylece k-means algoritması veriyi k adet kümeye ayıracaktır.

ÖRNEK:

Aşağıdaki tabloda 4 ayrı tür bilgisayarın bellek ve hız parametreleri verilmiştir. Buradaki değerler gerçek durumla uyumlu değildir ve sadece uygun örnek oluşturmak için seçilmiştir:

VERİ BELLEK HIZ
Bilgisayar 1 32 15
Bilgisayar 2 25 25
Bilgisayar 3 88 34
Bilgisayar 4 128 22

Yukarıdaki tabloda verilen verilerin grafiksel olarak gösterimi aşağıdadır:

Burada amaç k = 2 seçerek bilgisayarları 2 özelliğe göre (hız ve bellek) iki kümeye ayırmaktır. Böylece her kümedeki bilgisayarlar benzer özellikler taşıyacaklardır.

k-ortalamalar kümeleme algoritmasında temel adımlar oldukça basittir.
Öncelikle, küme sayısı (Burada k = 2) ve her kümenin merkezi (centroid) belirlenir. Küme merkezi olarak bu örnekte;

  1. a. Ya rasgele 2 nokta seçilir.
  2. b. Ya da ilk 2 nokta küme merkezleri olarak seçilir.

k-ortalamalar kümeleme algoritması yakınsaklık (kararlı durum) sağlanana kadar aşağıda verilen 3 adımı tekrarlayacaktır:

  1. 1. Küme merkezlerini belirle,
  2. 2. Her veri noktasının küme merkezlerine uzaklıklarını hesapla,
  3. 3. Veriyi en yakın olan merkeze ait kümeye ata.

Herhangi bir iterasyon adımında farklı kümeye atanan hiçbir veri kalmayınca algoritma sona erer.

Algoritma için akış diyagramı aşağıda verilmiştir:

Şimdi algoritma adımlarını sayısal hesaplamalarla gösterelim:

  1. I. Birinci kümenin merkezi (Centroid) C1=(32, 15) ve ikinci kümenin merkezi ise C2=(25, 25) olsun:
    VERİ BELLEK HIZ
    1 Bilgisayar 1 32 15
    2 Bilgisayar 2 25 25
    3 Bilgisayar 3 88 34
    4 Bilgisayar 4 128 22
  2. II. Diğer bütün veri noktalarının bu merkezlere Euclidyen uzaklıklarını formülüne göre hesaplayalım:

    Önce C1’in diğer noktalara uzaklıkları:

    Şimdi de C2’nin diğer noktalara uzaklıklarını hesaplayalım:

    Koordinatlar

        1     2     3     4
    32 25 88 128
    15 25 34 22

    Uzaklıklar

    0 12.2065 59.1354 96.2548 C1(32, 15)
    12.2065 0 63.6396 103.0436 C2(25,25)
    Bu durumda ilk iterasyon sonucunda 3 ve 4 noktası ve 1 noktası Küme 1’e (C1 merkezli), 2 noktası ise Küme 2’ye ait olacaktır.

    Kümeler

    NOKTA   1   2   3   4
    Küme 1 1 1 1
    Küme 2 0 1 0 0
    Bu durumda ilk iterasyon sonucunda 3 ve 4 noktası ve 1 noktası Küme 1’e (C1 merkezli), 2 noktası ise Küme 2’ye ait olacaktır.

  3. III. Algoritmanın ikinci adımı şu şekilde ilerleyecektir:
    Küme 1, 1, 3 ve 4 noktalarını içerdiği için Küme 1’in merkezi (centroid) bunların aritmetik ortalaması olarak yeniden hesaplanacaktır:

    C1-=>
    X = (32 + 88 + 128) / 3
    Y = (15 + 34 + 22) / 3
    X = 82,6666 Y = 23,6666

    C2-=> Değişmeyecektir (sadece 2 noktası var)
    Böylece C1 (82.6666, 23.6666) ve C2 (25, 25) olarak algoritmanın ikinci adımı buradan devam edecektir. Ardından yine 1, 2, 3 ve 4 noktalarının C1 ve C2’ye uzaklıkları aynı şekilde hesaplanacaktır. Her nokta en yakın olduğu kümeye katılacaktır.

    Bu işlemler herhangi bir algoritma adımında hiç bir nokta küme değiştirmeyene kadar sürecektir. Yukarıdaki grafikteki verilere göre sonuçta Küme 1, 1 ve 2 noktalarından, Küme 2 ise 3 ve 4 noktalarından oluşacaktır.

Bu örneği R dilinde gerçekleştirmek için aşağıdaki adımları izleriz:

                            
> B = matrix( c(32, 15, 25, 25, 88, 34, 128, 22), nrow=4, ncol=2)
> colnames(B)<-c("HIZ", "BELLEK")
> gg<-kmeans(B,2)
> plot(B, col=gg$cluster)
 
> gg

                            
                          

K-means clustering with 2 clusters of sizes 2, 2
Cluster means:
    HIZ     BELLEK
1   28.5     108
2   20.0     28
Clustering vector:
[1] 1 2 1 2

Within cluster sum of squares by cluster:
[1] 824.5 122.0
(between_SS / total_SS = 87.2 %)

Available components:
[1] "cluster"  "centers"  "totss"  "withinss"  "tot.withinss"  "betweenss"  "size"  "iter"  "ifault">

Şekil K-Means_1: K-MEANS algoritması ile 2 küme oluşturma

Şekil K-Means_0: K-MEANS algoritması ile 2 küme oluşturma

Küme merkezleri 1. Küme için (108, 28.5) ve 2. Küme içinse (28, 20) dir. 1.Küme elemanları;

2.Küme elemanları;

ÖRNEK:

Bu tablodaki veriyi 3 kümeye ayırmak istiyoruz. Aşağıdaki R kodunu inceleyelim:

                      
x<-c(2,5,7,12,16,21,25,36,41,34,13,23,53)
y<-c(5,2,9,3,23,45,11,23,54,22,40,17,24)
z<-data.frame(x,y)
kmeans.result <- kmeans(z, 3)
table(z$x, kmeans.result$cluster)
plot(z$x,z$y, col = kmeans.result$cluster)
  points(kmeans.result$centers[,c("x", "y")], col = 1:3, pch = 8, cex=2)
                      
                    

Kodu çalıştırdığımızda aşağıdaki çıktıyı elde ederiz:

Şekil K-Means_1: 3 Küme oluşturma

Şekil K-Means_1: 3 Küme oluşturma

K-MEDOID ALGORİTMASI

K-Medoid algoritması kümeleme (clustering) algoritmalarından biridir ve K-means algoritmasına çok benzer. En önemli farkı başlangıçtaki kümelere ait merkez (centroid) noktalarının gerçek veri noktaları içinden seçilmesidir.

K adet küme ile ilişkili birer merkez nokta seçildikten sonra bütün noktalar merkezlere göre uzaklıklarına göre işaretlenir; başka bir deyişle her nokta en yakın olduğu merkezin ait olduğu kümeye (cluster) etiketlenir.

Bu işlemden sonra her kümeye ait ortalamalar hesaplanır. Hesaplanan ortalamaya en yakın olan gerçek veri noktası yeni merkez olarak alınır ve bütün noktaların yeni merkezlere uzaklıkları hesaplanır. Her nokta yeniden en yakın olduğu merkeze ait kümeye etiketlenir. Ardından bu işlem tekrarlanır ve bir algoritma adımında hiç bir nokta yer değiştirmiyorsa kümeleme işlemi sonuçlanmış demektir.

k-medoid algoritması, k-means’e göre uç noktalara (outlier) çok daha az hassastır. Buna karşılık büyük veri miktarları için performansı düşüktür.

Buna göre algoritmayı aşağıdaki gibi tasvir edebiliriz:

  1. I. k değeri ve veri kümesinin içindeki noktalardan k adet nokta merkez olarak seçilir.
  2. II. Veri kümesi içindeki her noktanın merkezlere uzaklıklarını hesaplar ve her noktayı en yakın olduğu merkeze ait kümeye koyar.
  3. III. Her küme için ortalama değer hesaplanır ve ortalama değerine en yakın olan veri noktası yeni merkez olarak seçilir.
  4. IV. Bütün noktaların yeni merkezlere olan uzaklıkları hesaplanır. Her nokta yeniden en yakın olduğu merkeze ait kümeye yerleştirilir.
  5. V. Adım II-IV arasını hiç bir nokta yer değiştirmeyene kadar tekrarlar.

R DİLİNDE ÖRNEK UYGULAMALAR

R DİLİNDE K-MEDOID KÜMELEME YÖNTEMİ

Aşağıdaki veri mevcut olsun:

Bu tablodaki veriyi 3 kümeye ayırmak istiyoruz. Bu amaçla kullanılacak k-medoid yöntemi ile ilgili R kodu aşağıdadır:

                      
x<-c(2,5,7,12,16,21,25,36,41,34,13,23,53)
y<-c(5,2,9,3,23,45,11,23,54,22,40,17,24)
z<-data.frame(x,y)

library(fpc)
 pamk.result <- pamk(z,3)
 pamk.result$nc
table(pamk.result$pamobject$clustering, z$x)

layout(matrix(c(1,2),1,2)) 
plot(pamk.result$pamobject)
layout(matrix(1))

                      
                    

Bu programı çalıştırdığımızda aşağıdaki sonucu elde edeceğiz:

Şekil MED_1: k-medoid yöntemi ile kümeleme

Şekil MED_1: k-medoid yöntemi ile kümeleme

Aynı veri için küme sayısını 2 olarak belirleyelim:

                      
x<-c(2,5,7,12,16,21,25,36,41,34,13,23,53)
y<-c(5,2,9,3,23,45,11,23,54,22,40,17,24)
z<-data.frame(x,y)

library(fpc)
 pamk.result <- pamk(z,2)
 pamk.result$nc
table(pamk.result$pamobject$clustering, z$x)

layout(matrix(c(1,2),1,2)) 
plot(pamk.result$pamobject)
layout(matrix(1))
                      
                    

Bu durumda aşağıdaki sonuç elde edilecektir:

Şekil MED_2: Küme sayısının 2 olması hali

Şekil MED_2: Küme sayısının 2 olması hali

SINIFLANDIRMA İÇİN MODEL PERFORMANSI

Algoritmanın performansını değerlendirme işlemi aslında istatistikteki hipotez testi problem ile çakışır. Verinin iki sınıfa ayrılması probleminde aşağıdaki durumlar söz konusudur:

  • TN — True Negative: Bir sınıfa ait olmayanların o sınıftan kabul edilmemesi.
  • FP — False Positive: Bir sınıfa ait olmayanların o sınıfa ait kabul edilmesi.
  • FN — False Negative: Bir sınıfa ait olanların o sınıftan kabul edilmemesi.
  • TP — True Positive: Bir sınıfa ait olanların o sınıftan kabul edilmesi.

Hata Matrisi (Confusion matrix) yardımı ile kolaylıkla gerçekleştirilebilir:

TABLO S_2: İki sınıfa ayırma probleminde hata matrisi

TABLO S_2: İki sınıfa ayırma probleminde hata matrisi

Buna göre hata matrisinden doğruluk değeri aşağıdaki biçimde hesaplanabilir:

Doğruluk(Accuracy) = (a+d)/(a+b+c+d) = (TN + TP)/(TN+FP+FN+TP)

R İLE UYGULAMALAR

ÖRNEK:

TABLO S_2_1: Tahmin Değerleri

TABLO S_2_1: Tahmin Değerleri

Doğruluk = (10 + 7) / (10 + 3 + 3 + 7) = 17 / 23 = 0.7391 olacaktır.

Hata matrisi burada ikili sınıf problemi için kullanılmıştır, ancak ikiden çok sınıf hali için de genişletilebilir.
Şimdi başka bazı kavramlara da bakacağız:

Yanılma Oranı (Misclassification Rate) = (FP + FN) / TOPLAM
Yanılma Oranı = (3 + 3) / 23 = 6 / 23 = 0.2608
TruePositive (DogruPozitive) = TP / (SatırToplamı) = 7 / 10 = 0.7
FalsePositive (YanlıPozitif) = FP / (SatırToplamı) = 3 / 13 = 0.2307

KAPPA İSTATİSTİĞİ

Aynı şeyi değerlendirmek için (evet, hayır; ya da 1,0 şeklinde sadece 2 durum söz konusu ise) iki farklı kişi mevcutsa bu durumda “Kappa İstatistiği” kullanılabilir.

Kappa, tablonun esas köşegeni üzerindeki veri değerlerinin yüzdesini ölçer ve bu değerleri beklenen kabul değerleri olarak kullanır. İki değerlendirici, nesneleri 1 veya 2 sınıfına sokacaktır. 2x2’lik tabloda hücre olasılık değerleri bulunmaktadır.

Şekil Kp1: Kappa istatistiği

Şekil Kp1: Kappa istatistiği

Kappa değerini hesaplamak için önce gözlenen kabul değerlerini hesaplamalısınız:
P0 = P11 + P22
Bu değerin iki değerlendiricinin bağımsız olarak verdikleri beklenen değer(pe) ile karşılaştırılması gerekir:

Pe = P.1P1. + P.2P2.

Bu değeri aşağıdaki gibi yorumlayabiliriz;

  • • ZAYIF KABUL = 0.20 den daha küçük
  • • AZ KABUL = 0.20 , 0.40 arası
  • • ORTA KABUL = 0.40 , 0.60 arası
  • • İYİ KABUL = 0.60 , 0.80 arası
  • • ÇOK İYİ KABUL = 0.80 , 1.00 arası

ÖRNEK:
HATA MATRİSİNDEN KAPPA DEĞERİNİN HESABI

Gözlenenen (Gerçek) Değerler

Po = (150 + 95) / 313 = 0.783

Gözlenen değerlerden 169 tanesi pozitif ve 144 tanesi negatiftir. Pozitif olma olasılığı;
169 / 313 = 0.539'dur.

Tahmin değerlerinden 199’u pozitiftir. Pozitif olasılığı
199 / 313 = 0.635’tir.

Gözlenen ve tahmin değerlerindeki pozitif olasılıkları çarpımı,
0.539 * 0.635 = 0.343

Gözlenen ve tahmin değerlerindeki negatif olasılıkları çarpımı ise
0.461 * 0.365 = 0.167’dir.

Beklenen değerler olasılığı,
Pe = 0.343 + 0.167 = 0.51

Ve sonuçta Kappa değeri = (0.783 – 0.51) / (1-0.51) = 0.557 olacaktır.

F - ÖLÇME METODU

Sınıflandırma için kullanılabilecek diğer bir değerlendirme ölçüsü de F parametresidir. Aşağıdaki terimleri tanımlayalım:

Tahmin Değerleri

Hassasiyet (Precision) = a / (a + c)
F = 2 * (Hassasiyet * GeriÇağırma) / (Hassasiyet + GeriÇağırma)

Ya da

F = 2 * TP / (2 * TP + FP + FN)

F değeri hassasiyet ve GeriÇağırma değerlerinin harmonik ortalaması olarak tanımlanmıştır.

Yukarıdaki örnek için;
HASSASİYET = 50 / (50 + 5) = 50 / 55 = 0.9090
GERİÇAĞIRMA = 50 / (50 + 10) = 50 / 60 = 0.8333
F = 2 * 0.9090 * 0.8333 / (0.9090 + 0.8333) = 0.8695

F değeri de daima 0 - 1 aralığındadır.

KARA KUTU (BLACK BOX) YÖNTEMLERİ

Genellikle mühendislikte ya da diğer sistemlerde kara kutu yöntemleri denilince aşağıdaki gibi bir yaklaşım kullanılır:

Şekil BB_1: Kara kutu (Black Box) Sistemi

Şekil BB_1: Kara kutu (Black Box) Sistemi

Burada sistem çok karmaşık ve modellenmesi çok güç olabilir. Bu durumda sistemden bağımsız olarak girişlere ve bunların ürettiği çıkışlara bakılır. Kara kutu yöntemi yazılım testi konusunda da çok kullanılır. Çok karmaşık bir yazılım sisteminin performansını test etmek için, bu yazılımın iç yapısını hiç bilmeyen bağımsız bir ekip sadece giriş ve çıkışlarla ilgilenir.

SİNİR AĞLARI (NEURAL NETWORKS)

DOĞAL NÖRON (NEURON) YAPISI

Şekil N_1’de doğal sinir hücresi görülmektedir. Bu sinir hücresinde dendritler (dendrits) gelen sinyalleri alır; hücre gövdesinde bir kimyasal süreç sonucu gelen sinyallerin ağırlığı bir eşik değerini (threshold) aşınca aksona (axon) aktarılır. Daha sonra kimyasal süreç sonucu aksonlardan da sinaps (synapse) denilen yapı ile de sinyaller komşu sinir hücrelerine aktarılır.

Şekil N_1: Doğal Nöron Hücresi

Şekil N_1: Doğal Nöron Hücresi

YAPAY SİNİR AĞLARI (ARTIFICIAL NEURAL NETWORKS)

Şekil N_2’de yapay sinir hücresi görülmektedir. Doğal nörondaki dendritler tarafından alınan sinyaller burada X1, X2, X3 ile çıkış sinyali ise y ile temsil edilmektedir. Giriş sinyallerine önemlerine göre birer ağırlık (w) atanır. Giriş sinyalleri hücre gövdesinde toplanır ve çıkış sinyali f aktivasyon fonksiyonuna göre (activation function) çıkışa aktarılır.

Tipik bir yapay nöron aşağıdaki matematiksel bağıntı ile ifade edilebilir:

y(x) çıkış aksonudur. Girişteki WiXi toplamları da aktivasyon fonksiyonu ‘f’ tarafından kullanılmaktadır.

Şekil N_2: Yapay Sinir Hücresi

Şekil N_2: Yapay Sinir Hücresi

Buradaki yapay nöron yapısı kullanılarak çok daha karmaşık yapay sinir ağı modelleri geliştirilebilir.

Bu en basit yapay sinir ağı bir eğitim sonucunda ağırlıkları belirlenerek (denetimli öğrenme - supervised learning) yeni bir giriş değeri için (x) çıkışın (y) ne olacağı konusunda kestirimde (prediction) bulunulabilir.

Bu anlamda çıkış değerler (y) belli giriş değerleri için (xi) belli olan bir veri yardımı ile (eğitim veri kümesi - training data set) ve uygun algoritma kullanılarak w ağırlıkları belirlenir (öğrenme aşaması). Daha sonra da yeni bir X girişi için çıkışın (y) ne olacağı konusunda kestirimde bulunulur. (Kestirim-prediction)

Bu konu ile ilişkili olan aşağıdaki üç kavram çok önemlidir:

  1. I. Aktivasyon Fonksiyonu (f) (Activation Function): Bir nöronun net sinyal girişini tek bir çıkış sinyaline(y) dönüştüren ve ağda yayılmasını sağlayan fonksiyon
  2. II. Ağdaki nöron ve katman (layer) sayısını ve bunların birbiri ile nasıl bağlanacağını belirleyen ağ topolojisi (network topology) ya da ağ mimarisi (network architecture)
  3. III. Eğitim algoritması(training algorithm): Sistemdeki ağırlıkların değerlerinin ne olması gerektiğini belirleyen bir eğitim ya da öğrenme algoritması

YAPAY SİNİR AĞLARI (ARTIFICIAL NEURAL NETWORKS)
THRESHOLD FONKSİYONU

x girişlerini işleyerek y çıkışını oluşturan aktivasyon fonksiyonları yapay sinir ağları için farklı biçimlerde olabilir. Şekil N_3’te bir threshold activation function (eşik aktivasyon fonksiyonu) ya da unit step activation function (birim adım aktivasyon fonksiyonu) görülmektedir. Burada şekilden de görüldüğü gibi x vektörü 0’dan küçükse f(x) yani y çıkışı 0, aksi takdirde yani x ≥ 0 ise f(x) ya da y çıkışı 1 olacaktır.

Şekil N_3: Threshold aktivasyon fonksiyonu

Şekil N_3: Threshold aktivasyon fonksiyonu

SİGMOID FONKSİYONU

Belki de en sık kullanılan aktivasyon fonksiyonu ise sigmoid aktivasyon fonksiyonudur (sigmoid activation function). Şekil N_4’te bu fonksiyon görülmektedir. Burada e sayısı yaklaşık 2.718 olan doğal logaritma tabanı olan sayıdır. Çıkış değeri y, (0,1) aralığında herhangi bir değer olabilir. Ayrıca sigmoid aktivasyon fonksiyonu türetilebilir (differentiable) bir fonksiyondur. Bu özellik, Yapay Sinir Ağları (Artificial Neural Networks-ANN) optimizasyon algoritmalarının oluşumunda çok faydalı olan bir özelliktir.

Şekil N_4: Sigmoid aktivasyon fonksiyonu

Şekil N_4: Sigmoid aktivasyon fonksiyonu

Sigmoid fonksiyonunun en yaygın olarak kullanılan fonksiyon olmasına rağmen bazı uygulamalarda diğer fonksiyonlar da kullanılabilmektedir. Aşağıda bunların bir kısmını tanıtacağız:

LİNEER FONKSİYON (LINEAR FUNCTION)

Şekil N_5’te lineer aktivasyon fonksiyonu görülmektedir. Lineer aktivasyon fonksiyonu, girişi lineer (doğrusal) bir ilişki ile çıkışa aktarmaktadır.

Şekil N_5: Lineer aktivasyon fonksiyonu

Şekil N_5: Lineer aktivasyon fonksiyonu

TANJANT HİPERBOLİK (HYPERBOLIC TANGENT) AKTİVASYON FONKSİYONU

Şekil N_6 tanjant hiperbolik türünde bir aktivasyon fonksiyonunu göstermektedir.

Şekil N_6: Tanjant hiperbolik aktivasyon fonksiyonu

Şekil N_6: Tanjant hiperbolik aktivasyon fonksiyonu

GAUSYEN AKTİVASYON FONKSİYONU (GAUSSIAN ACTIVATION FUNCTION)

Şekil N_7’de ise Gausyen aktivasyon fonksiyonu görülmektedir.

Şekil N_7: Gausyen aktivasyon fonksiyonu

Şekil N_7: Gausyen aktivasyon fonksiyonu

GAUSYEN AKTİVASYON FONKSİYONU (GAUSSIAN ACTIVATION FUNCTION)

Ağ topolojisi konusunda çeşitli mimariler söz konusudur. Bu konuda 3 önemli parametre dikkate alınmalıdır:

  1. I. Katmanların (layer) sayısı
  2. II. Ağda bilginin geri dönmesi, geri besleme (feedback) olup olmadığı
  3. III. Ağ içindeki her tabakada bulunan nöron sayısı

KATMAN SAYISI

Şekil N_8’de tek katmanlı bir ağ yapısı görülmektedir. Tek katmanlı ağ yapısı örüntü (iz) sınıflandırma (pattern recognition) probleminin çözümünde kullanılır. Ancak burada da lineer ayrılabilir (linearly separable) izler üzerinde başarılı çalışır. Daha ileri örnekler için çok daha karmaşık sinir ağları gerekecektir.

Bu örnekten de anladığımız gibi katman sayısının artması ağın problem çözme yeteneğini arttırmaktadır.

Şekil N_8: Tek katmanlı ağ yapısı

Şekil N_8: Tek katmanlı ağ yapısı

Şekil N_9’de ise çok katmanlı (multilayer) bir ağ yapısı görülmektedir. Burada bir adet gizli katman (hidden layer) bulunmaktadır. Çok katmanlı yapılarda bir katmandaki düğümler bir sonraki katmandaki düğümlerin tümüne bağlanıyorsa bu tür ağlara tam bağlı (fully connected) adı verilir, ancak bu zorunlu değildir.

Çok katmanlı ağlar derin öğrenme (deep learning) işlemini de yerine getirebilirler. Eskiden çok katmanlı yapılarda hesaplama zamanı nedeni ile kullanım problemleri vardı, ancak artan bilgisayar hesaplama gücüyle ile bu problem çözülmüş ve derin öğrenme teknikleri devreye sokulabilmiştir.

Şekil N_9: Çok katmanlı ağ yapısı

Şekil N_9: Çok katmanlı ağ yapısı

DESTEK VEKTÖR MAKİNESİ (SUPPORT VECTOR MACHINE)

Veri sınıflandırma yöntemlerinden son yıllarda önemi daha da çok anlaşılan biri de destek vektör makinesidir (Support Vector Machine-SVM).

Destek vektör makinesi (DVM) iki boyutlu uzayda doğrusal, üç boyutlu uzayda düzlemsel ve çok boyutlu uzayda da hiperdüzlem (hyperplane) şeklindeki ayırma mekanizmaları ile veriyi iki ya da daha çok sınıfa ayırma yeteneğine sahiptir.

TEORİ:

DVM ile sınıflandırma yapabilmek için aşağıdaki yol izlenir:

  1. I. Örnek bir veri grubu alınarak (training data-öğrenme verisi) bu veri grubunu iki sınıfa ayıran (iki sınıf söz konusu ise) en iyi (optimal) hiper düzlem bulunur.
  2. II. Yeni veri noktalarının hangi sınıfa ait olduğu bulunan en iyi hiper düzlem yardımı ile belirlenir.

Burada izlenen yol denetimli öğrenme (supervised learning) metodudur.

Genel olarak ikili sınıf ayrımı (binary classification) problemlerinde uygulanır. Örneğin bir kredi kartı hareketinin normal bir işlem mi şüpheli (fradulent) bir işlem mi olması ikili sınıf ayrımını gerektirir:

  1. I. Normal işlemler
  2. II. Şüpheli işlemler

Benzer şekilde bir MR görüntüsünde normal hücre ve kanserli hücre ayrımı da ikili sınıflandırmadır.

Bu örnekler çoğaltılabilir. Destek vektör makineleri özellikle son 10 yıldır bu tür problemlerde yaygın olarak kullanılmaktadır. Destek vektör makineleri ikili sınıflandırma ile sınırlı değildir; çoklu sınıf ayrımını da gerçekleştirebilirler. İlerleyen kısımlarında bu konuya da değinilecektir.

LİNEER AYRILABİLİR HAL (Linearly Separable Case)

Veri grubunun bir doğru ile ayrılabildiği durumdur. Aşağıdaki şekilde mavi ve yeşil noktalar kırmızı doğru ile iki sınıfa ayrılabilmektedir:

Şekil 1: Lineer Ayrılabilir Hal

Şekil 1: Lineer Ayrılabilir Hal

Doğal olarak iki veri grubunu birden fazla doğru ile ayırmak ta mümkün olabilir. Aşağıdaki şekilde ise bu durum görülmektedir:

Şekil 2: Birden Fazla Ayırıcı Doğru Olması Hali

Şekil 2: Birden Fazla Ayırıcı Doğru Olması Hali

Burada Vapnik ve diğerleri [1] tarafından ileri sürülen bir fikir iki sınıfı ayıran nesnenin bir doğru yerine bir koridor olması ve bu koridorun genişliğinin bazı veri vektörleri tarafından belirlenerek mümkün olan en büyük (maksimum) genişlikte olmasıdır. Şekil 3’te bu durum görülmektedir:

D doğrusu <w.x> + b = 0 denklemi ile belirlenmekte olup w ağırlık vektörü ve b de sabit sayı (bias) değeridir. D1 doğrusu <w.x> + b = 1 denklemi ile ve D2 doğrusu <w.x> + b = -1 denklemi ile belirlenir.

<w.x>, w ve x vektörlerinin skaler çarpımını göstermekte olup iki boyutlu uzay için <w.x> = w1.x1 + w2.x2 şeklinde hesaplanır.

<w.x> + b ≥ 1 bağıntısı ile belirlenen noktalar (kırmızı elipsler) bir sınıfa (class), <w.x> + b ≤ -1 bağıntısı ile belirlenen noktalar ise (mavi üçgenler) diğer sınıfa ait noktalardır. Burada w ağırlık vektörü (weight vector), iki boyutlu uzayda w = (w1,w2), 3 boyutlu uzayda w = (w1,w2,w3) ve n boyutlu uzayda w = (w1,w2,w3, … wn) şeklinde belirlenir.

X, öğrenme kümesine (training set) ait vektörleri (noktaları) belirtir. Kümedeki eleman sayısı n ise, n adet vektör söz konusu olacaktır. Şekil 3’teki küme için n=9’dur.

D1 kırmızı sınıfa D2 ise mavi sınıfa en yakın olan doğrulardır. Bu doğruların geçtiği A, B, C noktaları aslında w ve b’yi aşağıda verilecek olan bir optimizasyon probleminin çözümü ile belirleyen noktalardır (vektörler) ve bunlara destek vektörler (support vectors) adı verilir.

D1 ve D2 doğruları arasındaki uzaklık (marjin) d ile gösterilirse, analitik geometri bilgileri ile, d’nin,

şeklinde hesaplanabileceği kolayca görülür. |(|w|)| değeri bilindiği gibi 2 normudur ve şeklinde hesaplanır. ’nin maksimum değerinin elde edilmesi için doğal olarak ||w|| ‘nin ya da ||w||2 ‘nin minimum değerinin bulunması gerekir.

Şekil 3: Destek Vektörleri ve Marjin

Şekil 3: Destek Vektörleri ve Marjin

Buna göre optimizasyon problemi,

Kısıtlar:
  < w.x > + b ≥ 1 ise yi = 1 (Sınıf I-Kırmızı)
  < w.x > + b ≤ -1 ise yi = -1 (Sınıf II-Mavi)

şeklinde bir kuvadratik programlama (quadratic programming) problemi haline dönüşür.

Burada iki kısıt aşağıdaki şekilde birleştirilebilir:
yi .( < w.x > + b)  ≥ 1

Buna göre kuvadratik programlama problem,

Kısıtlar:
yi .( < w.x > + b)  ≥ 1

haline gelecektir. Bu problem primal problem olarak adlandırılır. Aşağıda bu problemin duali de verilecektir.

ÖRNEK:

Bu basit problemde suni bir data üzerinde DVM’nın lineer ayrılabilir hal için pratikte nasıl kullanılabileceğini göstereceğiz.

Örnek verimiz kredi kartları ile ilgili olsun. İki değişken (iki özellik, attribute) kullanıyoruz;

  1. 1. Kredi kartı limiti(x1)
  2. 2. Kredi kartı için bir seferlik harcama(x2)

Bir seferlik harcama limitin %15’ini geçiyorsa o harcama şüpheli ya da illegal (fradulent) olarak kabul ediliyor. (Burada durum çok basitleştirilmiş ve gerçeğe fazla uymayan bir durumdur ancak eğitici amaçla seçilmiştir. Gerçekte kredi kartı ödemelerinde illegal (fraud) durumları tespit etmek için kullanılan parametre sayısı 20 - 50 aralığındadır.)

Buna göre 1, 2, 3, 4 ve 8 no’lu hareketler (transaction) normal (y=1), 5, 6 ve 7 ise şüpheli ya da illegal (fradulent) hareketlerdir (y= -1). Bu veri bir excel tablosuna aşağıdaki gibi yerleştirilmiştir. Normal hareketler grafikte küçük mavi dörtgenler ve şüpheli (fraud) olanlar ise siyah renkli büyük dikdörtgen şeklinde gösterilmiştir.

Kırmızı çizgi, bu iki sınıfı (normal ve fraud) ayırmaktadır, ancak bu çizgi optimal değildir. Optimal ayrım çizgisini destek vektör makinesi yardımı ile bulacağız ve yeni bir harcamanın normal mi ya da şüpheli mi olduğunu da bu optimal çizgi yardımı ile belirleyeceğiz.

Aşağıdaki adımları izleyelim:

  1. I. Kredi kartı limiti (x1) ve bir seferlik harcama(x2) bilgilerini aşağıdaki gibi Excel’ e yükleyelim:

    Burada n = 8’dir yani i = 1, 2, ... 8 şeklinde değişecektir.
    Çözeceğimiz kuvadratik programlama problemini hatırlayalım:

    Kısıtlar: yi .(<w.x> + b) ≥ 1

    Burada 8 tane eşitsizliğin de sağlanması gerekecektir.
  2. II. A2 ve B2 hücrelerini w ağırlık vektörünün w1 ve w2 bileşenleri için ayıralım. Düzlemde (iki boyut) işlem yaptığımız için w’nin iki bileşeni olacaktır:
    Ayrıca, C2 hücresini de b katsayısı için ayıralım. w1, w2 ve b’ye ilk değer olarak 1 değerini keyfi olarak atayalım.
  3. III. H6 hücresine ilk kısıtı, y1*(w1*x1+w2*x2+b) şeklinde yerleştirmek için H2 hücresine
    =F6*($A$2*C6+$B$2*D6+$C$2)
    ifadesini yerleştirelim. A2, B2 ve C2’nin satırlar boyunca sabit kalması için $ sembolleri kullanılmıştır.
  4. IV. H6 hücresini H7 - H13 aralığına kopyalayalım:
  5. V. D2 hücresine ( 1/2. )w2 şeklindeki amaç fonksiyonunu = 1 / 2 * (A2 * A2 + B2 * B2) şeklinde yerleştirelim:
  6. VI. Excel’in Data menüsünden Solverı(Çözücü) seçelim.

    Aşağıdaki pencere gelecektir:
  7. VII. Bu pencereyi aşağıdaki gibi oluşturalım:

  8. VIII. Solve butonuna tıklayalım. Aşağıdaki sonucu elde ederiz:

    Optimal doğru w1.x1+w2.x2+b=0 şeklinde belirleneceği için bu doğrunun denklemi,
    0.000746.x1 - 0.00119.x2 - 0.701492537
    şeklinde olacaktır. Aşağıdaki şekilde bu doğru ve ayırdığı normal ve fraud sınıflar görülmektedir:

YENİ GELEN BİR VERİNİN HANGİ SINIFA AİT OLDUĞUNUN BULUNMASI

Şimdi, x1 = 3000 ve x2 = 2500 değerleri ile gelen bir verinin hangi sınıfa ait olduğunu bulalım. Bunun için w1.x1 + w2.x2 + b ifadesini hesaplamalıyız.

Excel’de bu hesaplama =A2*3000 + B2*2500 + C2 şeklinde yapılırsa -1,44776 değeri bulunacaktır. Bu değer w.x+b ≤ -1 durumuna karşı geldiği (y = -1) için şüpheli (fraud) bir işlem söz konusudur.

LİNEER OLARAK AYRILAMAYAN DURUM (LINEARLY NON-SEPARABLE CASE)

Şekil 4: Doğrusal Olarak Ayrılamayan Durum (Linearly non-separable case)

Şekil 4: Doğrusal Olarak Ayrılamayan Durum (Linearly non-separable case)

Şekil 4’te görüldüğü gibi iki sınıfın (kırmızı ve mavi) geniş bir marjin boyunca net olarak ayrılamadığı durumdur. Sınırı aşma durumunu simgeleyen ζi parametresi amaç fonksiyonu içine girecek ve bu parametrenin de minimum olması istenecektir. Buna göre primal optimizasyon problem,

şekline gelecektir. Burada ζi değişkenleri gevşek (slack) değişken olarak isimlendirilir.

Burada, w, b ve ζi değişkenlerinin en iyi (optimal değerleri aranacaktır. C parametresi için de aşağıdaki bilgiler faydalı olacaktır; C’nin değeri 0 ile sonsuz arasında herhangi bir değer olabilir:

0 < C < ∞

C parametresi modeli kuran kişi tarafından hatayı tolere etmek amacı ile uygun bir değer olarak seçilir. C değeri 0’a yaklaşırsa gevşek (slack) değişkenler kısıtsız hale gelir. Bu durumda marjin genişliği maksimum hale gelir; marjin içinde ya da yanlış tarafta kaç tane veri olduğu önemini yitirir. Bu durum bazı hallerde yararlıdır. Öğrenme (training) fazında hassasiyet azalır ancak yeni data kabulünde başarı artar.

C’nin sonsuza yaklaşması hassasiyeti çok arttırır; marjin genişliği çok azalır. Öğrenme fazında hassasiyet yüksek ancak yeni veri kabulünde güçlükler oluşur. C’nin değeri kullanıcının tecrübesine göre deneme-yanılma yöntemi ile belirlenir.

Kırmızı sınıfın, kırmızı çizgi ile sarı çizgi arasında yer alan elemanları için ve aynı zamanda mavi sınıfın, mavi çizgi ile kırmızı çizgi arasında yer alan elemanları için ζi > 1,kırmızı sınıfın kırmızı ve mavi çizgiler arasında kalan elemanları ile mavi sınıfın kırmızı ve sarı çizgiler arasında kalan elemanları için de 0 ≤ ζi ≤ 1 değerleri arasındadır.

Optimizasyon probleminin çözümü ile gerçekleştirilen düzeltmeden sonra, Şekil D1’deki sınır Şekil D2’deki gibi değişecektir:

Şekil D.1: Lineer Ayrılamayan Data

Şekil D.1: Lineer Ayrılamayan Data

Şekil D.2: Düzeltmeden Sonra Sınıf Ayrımı

Şekil D.2: Düzeltmeden Sonra Sınıf Ayrımı

ÖRNEK:

x1 ve x2 verileri, a2 : b18 bölgesine yerleştirilmiştir. ζi değerleri ise f2:f18 bölgesine yüklenmiştir. y değerleri d2:d18 bölgesindedir. h2 : h18 bölgesine ise yi .(<w.x> + b) ≥ 1 - ζi kısıtları yi .(<w.x> + b) ≥ 1 şeklinde yerleştirilmiştir. Excel’de bu ifade,


=d2 * ($a$22*a2 + $b$22*b2 + $c$22) + f2

şeklinde yer almıştır. w1, w2, b ve C değerleri ise sırası ile, a22, b22, c22 ve d22 hücrelerine yerleştirilmiştir.

Şeklindeki amaç fonksiyonu ise C27 hücresine
=1/2 * ($a$22^2 + $b$22^2) + $d$22*sum(F2:F18) şeklinde yerleştirilmiştir.

Bu örnekte yanlış sınıflandırma yapılan noktalar ise yukarıdaki şekilde de görüldüğü gibi, A(6, 9), B(8, 6) ve C(8, 8) noktalarıdır. Şimdi daha önceki örnekteki gibi solver’ı çağırarak aşağıdaki verileri giriniz:

Solve butonunu tıkladığınızda aşağıdaki sonucu elde edeceksiniz:

İKİ BOYUTTAN ÜÇ BOYUTA GEÇİŞ-KERNEL KULLANIMI

Birçok veri kümesi için iki boyutlu durumdaki veriler doğrusal ayraç yardımı ile birbirinden ayrılabilir değildir. Şekil 5’te bu durum görülmektedir.

Şekil 5: İki Boyuttan 3 Boyuta Geçiş

Şekil 5: İki Boyuttan 3 Boyuta Geçiş

x --> Φ (x) dönüşümünün yapılması ile ayırıcı düzlem f(x)=w.Φ (x) + b = 0 haline gelecektir. İki boyutlu uzaydaki ifadelerde, < xi.x j > skaler çarpımları yerine çok boyutlu uzayda < Φi. Φj> şeklindeki iç çarpımlar (scalar product) gelecektir. Bu durumda < Φi. Φj> çarpımı yerine,
K(X1,X2) = Φ(X1) .Φ(X2)= Φ(X1) T.Φ(X2) = < Φ(X1) ,Φ(X2) >

şeklinde tanımlanan bir K fonksiyonu kullanılabilirse, o takdirde özellikle çok büyük veri miktarları için çok büyük zaman harcanarak hesaplanabilecek olan < Φ(X1) ,Φ(X2) > iç çarpımları yerine K(X1,X2) ifadesi ile bu hesaplamaları çok daha az işlem ve zaman harcayarak gerçekleştirmek mümkün olacaktır. Burada K fonksiyonu bir çekirdek (kernel) adını alır; < Φ(X1), Φ(X2) >  ifadesi yerine K’nın kullanılması ise çekirdek püf noktası (kernel trick)  olarak isimlendirilir.

Kernel fonksiyonu Φ (x) fonksiyonunun karesi gibi de görülebilir.

KERNEL FONKSİYONU TİPLERİ

Aşağıda Tablo 1’de K kernel fonksiyonu için kullanılabilecek alternatifler hakkında bilgi verilmektedir:

Tablo 1.Kernel fonksiyonları

  Kernel Adı   Formülü   Parametreleri
Polinomyal(Polinomial) K(x,y)=(axTy+b)d A,b,d ≥ 2
Radyal tabanlı Gausyen(Gaussian Radial Basis) K(x,y)=exp(-a ||x-y||2) a,b
Sinir ağı sigmoidi(neural network sigmoid) K(x,y)=tanh(a xTy+b) a,b
Doğrusal(Linear) K(x,y)=xTy Yok
Kuvvet(Power) K(x,y)=(xTy)d d ≥ 2

Bir kernel fonksiyonunu kullanarak ve bu fonksiyon üzerinde çarpma toplama ölçekleme gibi işlemleri uygulayarak yeni bir kernel fonksiyonu üretebilirsiniz. Örneğin, K(x,y) bir kernel fonksiyonu ise,

U = aK(x,y)+ bK(x,y)
V = cK(x,y)+ dK(x,y)

fonksiyonları da kernel fonksiyonlarıdır. Burada a, b, c ve d sabit sayılardır.

ÖRNEK:
POLİNOMYAL DÖNÜŞÜM

Şekil 6: x1,x2 düzleminden z1, z2, z3 uzayına geçiş

Şekil 6: x1,x2 düzleminden z1, z2, z3 uzayına geçiş

Burada olup w ağırlık vektörü w(w1,w2,w3) şeklinde olup sınıfları ayırma düzlemi de w1.z1 + w2.z2 + w3.z3 + b = 0 şeklinde ifade edilebilecektir.

ÖRNEK:

Düzlemde x1 ve x2 özellikleri için örnek data Şekil 8’de görülmektedir. Üç boyutlu uzayda ise şeklinde hesaplanmıştır ve bu değerler de Şekil 8‘de görülmektedir. Şekil 7’de verilen datanın x1, x2 düzleminde ayrılamayan hali ve Şekil 9’da ise 3 boyutlu dönüşümden sonra aynı datanın ayrışmış hali görülmektedir.

Şekil 7: x1,x2 düzleminde ayrılamayan iki sınıfın görünümü

Şekil 7: x1, x2 düzleminde ayrılamayan iki sınıfın görünümü

Şekil 8: x1, x2, z1, z2 ve z3 değerleri

Şekil 8: x1, x2, z1, z2 ve z3 değerleri

Şekil 9: Şekil 7’de düzlemde ayrılamayan sınıfların 3 boyutlu uzayda ayrışması

Şekil 9: Şekil 7’de düzlemde ayrılamayan sınıfların 3 boyutlu uzayda ayrışması

DUAL PROBLEM

Bu bölümde matematiksel ayrıntılara çok fazla girmemeye dikkat ederek DVM için dual problem vermeye çalışacağız.

Yukarıda belirttiğimiz gibi primal problem,

Kısıtlar:   yi .( < w.x > + b)  ≥ 1

şeklinde idi. Birçok durumda buradaki w ağırlık vektörünün (weight vector) katsayılarını bulmak için kuvadratik optimizasyon probleminin çözümü, veri miktarı fazla ise uzun zaman alabilir .O nedenle çözümü bir çok durumda daha kolay ve az zaman gerektiren dual problemin çözümü bulunur (α katsayıları) ve sonra primalin w katsayıları , α ile aralarındaki bağıntılar yardımı ile hesaplanır.
Yukarıda verilen primal problemin duali aşağıdaki gibi ifade edilir:

Burada e,  elemanları 1 olan bir vektördür. diag(y) ise, esas köşegeni y ‘nin elemanlarından oluşan ,diğer elemanları 0 olan bir matristir. G matrisi ise Gram matrisi  adını alır ve elemanları Kij=xi.xj = < Φ (xi), Φ(xi) > şeklinde tanımlanır. G matrisinin açık yazılışı aşağıdadır:

K(x1,x1) K(x1,x2) K(x1,x3) K(x1,xn)
K(x2,x1) K(x2,x2) K(x2,x3) K(x2,xn)
K(x3,x1) K(x3,x2) K(x3,x3) K(x3,xn)
K(xn,x1) K(xn,x2) K(xn,x3) K(xn,xn)

Dual problem, α’ya göre çözüldükten sonra primal problemin çözümünü bulmak için aşağıdaki adımları izleyebilirsiniz:

  1. I. w’nun optimal değerini

    bağıntısı yardımı ile bulabilirsiniz.
  2. II. b katsayısının optimal değeri ise,

    şeklinde hesaplanır.

Buna göre iki sınıfı ayıran hiper düzlemin denklemi ise,
f(x)=wopt Tx +bopt
şeklinde olacaktır.

ÖRNEK:
LİNEER OLARAK AYRILAMAYAN DURUM

Lineer olarak ayrılamayan veriler için primal problemde kurulan model aşağıdaki gibiydi:

Bu problemin duali ise aşağıdaki gibi formüle edilebilir:

Burada kernel kullanımı ve DVM’nın dual formülasyonu ile dönüşüm fonksiyonunu(Φ) bilme ihtiyacı olmadan hesaplama yapmak mümkün olmaktadır. Bilinmesi gereken tek şey Gram matrisinin K kerneli ile değiştirilebileceğidir. Kij=K(xi,xj) ifadesini bir kez daha hatırlayalım. Ayrıca K(xi, xj)= ΦT(xi). Φ(xj) idi. Buna göre lineer olarak ayrılamayan durum için dual problem,

Dual problemin α’ya göre optimal çözümü bulunduktan sonra aşağıdaki adımlar izlenerek primal problem ait ağırlık vektörü (w) ve sabit sayı (b) bulunabilir:

  1. I. Optimal ağırlık vektörünü hesapla:
  2. II. bopt değerini aşağıdaki bağıntıya göre hesapla:
  3. III. Herhangi bir yeni x verisi için karar verme kuralını, f(x)= αiopt yi K(xi,x)+bopt
    şeklinde uygula.

Α değerleri veri noktalarının konumu hakkında bilgi edinmek için kullanılabilir. Aşağıdaki tablo bu konuda fikir vermektedir:

Tablo 2: αiopt değerleri ve veri noktaları konumları

αiopt Değeri i veri noktasının konumu
αiopt = 0 Doğru Tarafta
0 < αiopt < C Marjin sınırlarında (Bir destek vektörü)
αiopt = 0 Marjin içinde veya yanlış tarafta

ÇOK SAYIDA SINIF (MULTICLASS) OLMASI DURUMUNDA DESTEK VEKTÖR MAKİNESİ

Dikkate alınması gereken önemli bir konu da büyük veri gruplarının belirli özelliklere göre ikiden fazla gruba ayrılma durumudur. Aşağıdaki şekilde bu durum görülmektedir:

Destek vektör makinesini çok sayıda sınıf durumunda kullanabilmek için problem çok sayıda ikili sınıf problemine dönüştürülmelidir.

En çok kullanılan yaklaşımlar,

  1. I. Biri ve diğerleri (One vs Rest ya da One vs All) yaklaşımı
  2. II. Bire bir (One-vs-One, Pairwise, All-vs-All) yaklaşımı.

BİRİ VE DİĞERLERİ YAKLAŞIMI
İLK ADIM

Bu adımda iki sınıf A sınıfı ve B,C sınıfı olarak alınır ve destek vektör makinesi için yukarda anlatılan işlemler gerçekleştirilir. Ayırıcı doğru (kırmızı) ve destek vektörleri (mavi kesikli çizgiler) bulunur.

İKİNCİ ADIM

Bu adımda ise iki sınıf B sınıfı ve A, C sınıfı olarak alınır ve gene destek vektör makinesi için yukarda anlatılan işlemler gerçekleştirilir. Ayırıcı doğru (kırmızı) ve destek vektörleri (mavi kesikli çizgiler) bulunur.

ÜÇÜNCÜ ADIM

3 sınıf için son adım olan bu adımda ise iki sınıf C sınıfı ve A, B sınıfı olarak alınır ve destek vektör makinesi için yukarıda anlatılan işlemler gerçekleştirilir. Ayırıcı doğru (kırmızı) ve destek vektörleri (mavi kesikli çizgiler) bulunur.

Sonuçta 3 sınıf fi(x)= < wi.x > + bi doğruları ile birbirinden ayrılacaktır.

Verilen bir x noktasının hangi sınıfa ait olduğunu anlamak içinse f1(x), f2(x) ve f3(x) değerleri hesaplanmalı ve bulunan sayısal değerlere göre karar verilmelidir. (İkili sınıftaki örneğe bakınız)

DESTEK VEKTÖR MAKİNESİ (SUPPORT VECTOR MACHINE)

R DİLİNDE DESTEK VEKTÖR MAKİNESİ İLE SINIFLANDIRMA

R dilinde ‘e1071’ paketini yükledikten sonra SVM ile işlemler yapılabilir. Aşağıdaki örnekte daha önceki bölümlerde gösterilen ‘iris’ verisi ile sınıflandırma yapılmaktadır:

                      
library("e1071")
head(iris,5)
attach(iris)
x <- subset(iris, select=-Species)
y <- Species
svm_model <- svm(Species ~ ., data=iris)
summary(svm_model)
                      
                    

Programın çıktısı aşağıdadır:

                      
Call:
svm(formula = Species ~ ., data = iris)

Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.25 
Number of Support Vectors:  51
 ( 8 22 21 )
Number of Classes:  3 

Levels: 
 setosa versicolor virginica
                      
                    

Veri içinde 3 sınıf bulunduğu belirlenmiştir:

  1. I. Setosa
  2. II. Versicolor
  3. III. Virginica

Svm fonksiyonu aşağıdaki biçimde de kullanılabilir:

                      
library("e1071")
head(iris,5)
attach(iris)
x <- subset(iris, select=-Species)
y <- Species
svm_model1 <- svm(x,y)
summary(svm_model1)
pred <- predict(svm_model1,x)
system.time(pred <- predict(svm_model1,x))
table(pred,y)
                      
                    

Bu durumda aşağıdaki çıktı elde edilir:

                      
> system.time(pred <- predict(svm_model1,x))
   user  system elapsed 
  0.002   0.001   0.002 

> table(pred,y)
            y
pred        setosa    versicolor    virginica
  setosa        50        0           0
  versicolor     0        48          2
  virginica      0        2          48
>
                      
                    

Bu çıktıda her sınıftan ne kadar olduğu da tahmin edilmiş ve işlem zamanı da belirtilmiştir.

ÖRNEK UYGULAMALAR

SVM FONKSİYONUNUN R’DE REGRESYON İŞLEMİNDE KULLANILMASI

Önce X ve y veri kümelerini kartezyen koordinat sisteminde görüntüleyelim:

x = c (1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
y = c (3, 4, 5, 4, 8, 10, 10, 11, 14, 20, 23, 24, 32, 34, 35, 37, 42, 48, 53, 60, 62, 63, 65, 67, 70)

                      
#DATAFRAME OLUSTUR
train=data.frame(x,y)
#VERI KUMESINI CIZ
plot(train,pch=16)
                      
                    

Kodu çalıştırdığımızda aşağıdaki çıktıyı elde edeceğiz:

Şekil SVM_1: Veri noktaları ile SVM fonksiyonu yardımı ile eğri uydurmak

Şekil SVM_1: Veri noktaları ile SVM fonksiyonu yardımı ile eğri uydurmak

DESTEK VEKTÖR MAKİNESİ (svm fonksiyonu) İLE VERİ NOKTALARINA EN AZ HATA İLE YAKLAŞIM SAĞLAYAN EĞRİYİ ÇİZMEK

Aşağıdaki R kodunu çalıştıralım:

x = c (1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
y = c (3, 4, 5, 4, 8, 10, 10, 11, 14, 20, 23, 24, 32, 34, 35, 37, 42, 48, 53, 60, 62, 63, 65, 67, 70)

                      
library(e1071)
model <- lm(y ~ x, train)
abline(model)
tr=data.frame(x,y)
#VERI KUMESINI CIZ
plot(tr,pch=16)
model_svm <- svm(y ~ x , tr)
pr<- predict(model_svm, tr)
points(train$x, pr, col = "blue", pch=4)
                      
                    

Aşağıdaki grafik elde edilir:

Şekil SVM_2: Veri noktaları ile SVM fonksiyonu yardımı ile eğri uydurmak

Şekil SVM_2: Veri noktaları ile SVM fonksiyonu yardımı ile eğri uydurmak

SVM FONKSİYONU İLE İRİS VERİSİNDE SINIFLARI FARKLI RENKLERLE GÖRÜNTÜLEME

Aşağıdaki kodu çalıştıralım:

                      
library(e1071)
data(iris)
m2 <- svm(Species~., data = iris)
plot(m2, iris, Petal.Width ~ Petal.Length,slice = list(Sepal.Width = 3, Sepal.Length = 4))
                      
                    

Aşağıdaki grafik elde edilir:

Şekil SVM_3: İris verisinin sınıflarının farklı renklerde görüntülenmesi

Şekil SVM_3: İris verisinin sınıflarının farklı renklerde görüntülenmesi

ÖRNEK:
HAVA DURUMUNA GÖRE BİR HAFTA BOYUNCA MUTLU OLUNAN GÜNLERİN SINIFLANDIRILMASI

Aşağıdaki R kodunu çalıştıralım:

                      
library(e1071)

gun = c(0,1,2,3,4,5,6)
hava = c(1,0,0,1,0,0,0)
sonuc = factor(c(T,F,F,T,F,F,F))

d = data.frame(gun=gun, hava=hava, sonuc=sonuc)
m= svm(sonuc ~ gun +hava, data = d)
plot(m ,d)
                      
                    

Aşağıdaki grafik elde edilir:

Şekil SVM_4:Hava ve memnuniyet ilişkisi

Şekil SVM_4:Hava ve memnuniyet ilişkisi

ÖRNEK:
KLASİK DESTEK VEKTÖR MAKİNESİ UYGULAMASI

Aşağıdaki R kodunu çalıştıralım:

                      
require('kernlab')

kfunction <- function(linear =0, quadratic=0)
{
  k <- function (x,y)
  {
    linear*sum((x)*(y)) + quadratic*sum((x^2)*(y^2))
  }
  class(k) <- "kernel"
  k
}

n = 25
a1 = rnorm(n)
a2 = 1 - a1 + 2* runif(n)
b1 = rnorm(n)
b2 = -1 - b1 - 2*runif(n)
x = rbind(matrix(cbind(a1,a2),,2),matrix(cbind(b1,b2),,2))
y <- matrix(c(rep(1,n),rep(-1,n)))

svp <- ksvm(x,y,type="C-svc",C = 100, kernel=kfunction(1,0),scaled=c())
plot(c(min(x[,1]), max(x[,1])),c(min(x[,2]), max(x[,2])),type='n',xlab='x1',ylab='x2')
title(main='Linear Separable Features')
ymat <- ymatrix(svp)
points(x[-SVindex(svp),1], x[-SVindex(svp),2], pch = ifelse(ymat[-SVindex(svp)] < 0, 2, 1))
points(x[SVindex(svp),1], x[SVindex(svp),2], pch = ifelse(ymat[SVindex(svp)] < 0, 17, 16))

# w ve b yi modelden çıkar  
w <- colSums(coef(svp)[[1]] * x[SVindex(svp),])
b <- b(svp)

# doğruları çiz
abline(b/w[2],-w[1]/w[2])
abline((b+1)/w[2],-w[1]/w[2],lty=2)
abline((b-1)/w[2],-w[1]/w[2],lty=2)

                      
                    

Şekil SVM_5’teki grafik elde edilir:

Şekil SVM_5: Klasik destek vektör makinesi uygulaması

Şekil SVM_5: Klasik destek vektör makinesi uygulaması

ÖRNEK:
KUVADRATİK (QUADRATIC) KERNEL KULLANILMASI

Yukarıdaki bölümlerde Kernel kavramı anlatılmıştı. Şimdi bununla ilgili aşağıdaki kodu çalıştıralım:

                      
require('kernlab')
kfunction <- function(linear =0, quadratic=0)
{
  k <- function (x,y)
  {
    linear*sum((x)*(y)) + quadratic*sum((x^2)*(y^2))
  }
  class(k) <- "kernel"
  k
}

n = 20
r = runif(n)
a = 2*pi*runif(n)
a1 = r*sin(a)
a2 = r*cos(a)
r = 2+runif(n)
a = 2*pi*runif(n)
b1 = r*sin(a)
b2 = r*cos(a)
x = rbind(matrix(cbind(a1,a2),,2),matrix(cbind(b1,b2),,2))
y <- matrix(c(rep(1,n),rep(-1,n)))

svp <- ksvm(x,y,type="C-svc",C = 100, kernel=kfunction(0,1),scaled=c())
par(mfrow=c(1,2))
plot(c(min(x[,1]), max(x[,1])),c(min(x[,2]), max(x[,2])),type='n',xlab='x1',ylab='x2')
title(main='OZELLIK UZAYI')
ymat <- ymatrix(svp)
points(x[-SVindex(svp),1], x[-SVindex(svp),2], pch = ifelse(ymat[-SVindex(svp)] < 0, 2, 1))
points(x[SVindex(svp),1], x[SVindex(svp),2], pch = ifelse(ymat[SVindex(svp)] < 0, 17, 16))

# w ve b yi modelden çıkar  
w2 <- colSums(coef(svp)[[1]] * x[SVindex(svp),]^2)
b <- b(svp)

x1 = seq(min(x[,1]),max(x[,1]),0.01)
x2 = seq(min(x[,2]),max(x[,2]),0.01)

points(-sqrt((b-w2[1]*x2^2)/w2[2]), x2, pch = 16 , cex = .1 )
points(sqrt((b-w2[1]*x2^2)/w2[2]), x2, pch = 16 , cex = .1 )
points(x1, sqrt((b-w2[2]*x1^2)/w2[1]), pch = 16 , cex = .1 )
points(x1,  -sqrt((b-w2[2]*x1^2)/w2[1]), pch = 16, cex = .1 )

points(-sqrt((1+ b-w2[1]*x2^2)/w2[2]) , x2, pch = 16 , cex = .1 )
points( sqrt((1 + b-w2[1]*x2^2)/w2[2]) , x2,  pch = 16 , cex = .1 )
points( x1 , sqrt(( 1 + b -w2[2]*x1^2)/w2[1]), pch = 16 , cex = .1 )
points( x1 , -sqrt(( 1 + b -w2[2]*x1^2)/w2[1]), pch = 16, cex = .1 )

points(-sqrt((-1+ b-w2[1]*x2^2)/w2[2]) , x2, pch = 16 , cex = .1 )
points( sqrt((-1 + b-w2[1]*x2^2)/w2[2]) , x2,  pch = 16 , cex = .1 )
points( x1 , sqrt(( -1 + b -w2[2]*x1^2)/w2[1]), pch = 16 , cex = .1 )
points( x1 , -sqrt(( -1 + b -w2[2]*x1^2)/w2[1]), pch = 16, cex = .1 )

xsq <- x^2
svp <- ksvm(xsq,y,type="C-svc",C = 100, kernel=kfunction(1,0),scaled=c())

plot(c(min(xsq[,1]), max(xsq[,1])),c(min(xsq[,2]), max(xsq[,2])),type='n',xlab='x1^2',ylab='x2^2')
title(main='KUVADRATIK KERNEL UZAYI')
ymat <- ymatrix(svp)
points(xsq[-SVindex(svp),1], xsq[-SVindex(svp),2], pch = ifelse(ymat[-SVindex(svp)] < 0, 2, 1))
points(xsq[SVindex(svp),1], xsq[SVindex(svp),2], pch = ifelse(ymat[SVindex(svp)] < 0, 17, 16))

# w ve b yi modelden çıkar  
w <- colSums(coef(svp)[[1]] * xsq[SVindex(svp),])
b <- b(svp)

# doğruları çiz
abline(b/w[2],-w[1]/w[2])
abline((b+1)/w[2],-w[1]/w[2],lty=2)
abline((b-1)/w[2],-w[1]/w[2],lty=2)


                      
                    

Şekil SVM_6’daki grafik elde edilir.

Şekil SVM_6: Kuvadratik Kernel örneği

Şekil SVM_6: Kuvadratik Kernel örneği

RCURL PAKETİ İLE WEB'TEN VERİ ELDE ETME

RCURL PAKETİ İLE WEB’DEN VERİ ELDE ETME

Web üzerinde ne kadar büyük ve çeşitli veri mevcut olduğunu biliyoruz. Bunların bazıları formatlı verilerdir; bu tür verileri web’ den indirip kullanmak oldukça kolaydır. Neticede sıkıştırılmış dosyalarsa çözülür ve uygulama diline aktarılır. (R, Excel vb.)

Fakat web’ deki bütün içerik bu dosyalardan ibaret değildir. Web sayfalarından özellikle dinamik ve online türde verilere erişmek de söz konusudur. Bu tür bir erişim Web Scraping (Webi Kazıma) olarak adlandırılır. Bazı durumlarda internetten bir sayfayı indirmek ve bu sayfadan ihtiyacınız olan bilgiyi çıkarmak isteyebilirsiniz.

R dilinde bununla ilişkili 2 olanak mevcuttur:

  1. 1. R temel paketinde bulunan readLines() komutu
  2. 2. RCurl paketinde bulunan getURL() komutu

Bazı basit web scap işlemleri için readLines() komutu yeterlidir. readLines() komutu güvenli olmayan (non-secure) sürücülerdeki web sayfası veri kaynağına basit erişim sağlar. En basit şeklinde okunacak Web sayfasının adresini argüman olarak alır:

                      
web_sayfası <- readLines("http://www.example.com")
                      
                    

XML PAKETİ İLE XML DOSYALARINI OKUMA VE YAZMA

RCURL VE XML PAKETLERİNİN YÜKLENMESİ

R dilinde web sayfası erişimlerinde daha ileri http özelliklerini kullanmak (POST, PUT gibi) ve https erişimi yapmak isterseniz R’ ın RCurl paketini yüklemelisiniz. RCurl’de web scap işlemleri için getURL() fonksiyonunu kullanmak gerekir. Verinin getURL() fonksiyonu ile getirilmesinden sonra yeniden yapılandırılması ve ayrıştırılması (parse) gerekir.

XML paketi içindeki htmlTreeParse() fonksiyonu bu iş için yazılmıştır. getURL() fonksiyonu ile güvenli bir siteye erişim sağlayarak bu sitede web scrap işlemini gerçekleştirebiliriz.

ÖRNEK:
RCURL VE XML PAKETLERİ

Aşağıdaki örnek R kodunda, RCurl ve XML paketleri yüklenmekte ve web scrap işlemi yapılarak erişilen web sayfasına ait XML kodu listelenmektedir:

                      
#  RCurl PAKETİNİ YÜKLE
install.packages("RCurl", dependencies = TRUE)
library("RCurl")

# XML PAKETİNİ YÜKLE
install.packages("XML", dependencies = TRUE)
library("XML")

# WEB SAYFASINA ERİŞ
SAYFA_HEDEF<- getURL("www.itu.edu.tr", ssl.verifypeer = FALSE)
SAYFA_HEDEF_PARSE <- htmlTreeParse(SAYFA_HEDEF)
                      
                    

PROGRAMIN ÇIKTISI

İTÜ’nün web sayfasının HTML kodu listelenecektir. Aşağıda sadece head etiketinin bir kısmı görülüyor:

                      
<!-- ITU | page charsets / viewport -->
  <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <!-- ITU | page title --> 
  <title>
  İstanbul Teknik Üniversitesi 
  </title>
  
  <!-- ITU | page favicon / apple-touch-icon --> 
  <link rel="shortcut icon" type="image/x-icon" href="Sitefinity/WebsiteTemplates/ITU/App_Themes/ITU/Images/Favicon/favicon.ico" />
  <link rel="apple-touch-icon" href="Sitefinity/WebsiteTemplates/ITU/App_Themes/ITU/Images/Favicon/touch-icon-57x57.png" />
  <link rel="apple-touch-icon" href="Sitefinity/WebsiteTemplates/ITU/App_Themes/ITU/Images/Favicon/touch-icon-72x72.png" />
  <link rel="apple-touch-icon" href="Sitefinity/WebsiteTemplates/ITU/App_Themes/ITU/Images/Favicon/touch-icon-114x114.png" />
  <link rel="apple-touch-icon" href="Sitefinity/WebsiteTemplates/ITU/App_Themes/ITU/Images/Favicon/touch-icon-144x144.png" /> 

  
  <!-- ITU |  page metatags -->
  <meta name="description" content="İstanbul Teknik Üniversitesi, 250. yılına doğru yol alan, dünyanın en eski teknik üniversitelerinden biridir." />
  <meta name="keywords" content="İTÜ, itu, Istanbul Technical University, İstanbul Teknik Üniversitesi, ITU, itü, 1773" />
  <meta name="copyright" content="İstanbul Teknik Üniversitesi © 2013" />
  <meta name="author" content="İSTANBUL TEKNİK ÜNİVERSİTESİ" />
  <meta name="robots" content="index, follow" />
  <meta name="revisit-after" content="1" />
  <meta name="format-detection" content="telephone=no" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Cache-Control" content="no-cache" />
  <meta http-equiv="Content-Language" content="english, tr" />
  <meta name="googlebot" content="noodp" />
  <meta name="rating" content="general" />

                      
                    

RJSON PAKETİ İLE JSON DOSYALARINI OKUMA VE YAZMA

ÖRNEK:
R ORTAMINA JSON PAKETİNİ YÜKLEYEN VE DOSYA ERİŞİMİ YAPAN R KODU

                      
install.packages("jsonlite")
library("jsonlite")
JSON_DOSYA <- https://jsonplaceholder.typicode.com/posts
VERI <- fromJSON(JSON_DOSYA)
VERI
                      
                    

R PROGRAMININ ÇIKTISI

                      
> install.packages("jsonlite")
Error in install.packages : Updating loaded packages
> library("jsonlite")
> JSON_DOSYA <- "https://jsonplaceholder.typicode.com/posts"
> VERI <- fromJSON(JSON_DOSYA)
> VERI
                      
                    

userId id Title
1 1 1 sunt aut facere repellat provident occaecati excepturi optio reprehenderit
2 1 2 qui est esse
3 1 3 ea molestias quasi exercitationem repellat qui ipsa sit aut
4 1 5 eum et est occaecati
5 1 5 nesciunt quas odio
........

EXCEL İLE VERİ İLETİŞİMİ

ÖRNEK:
R ORTAMINDAN EXCEL’E BİLGİ YÜKLENMESİ

R ortamından Excel’e bilgi yüklemek için xlsx ve rJava paketlerinin sisteminizde kurulu olması gerekir. Aşağıdaki kodu inceleyiniz:

                      
install.packages("rJava")
library(rJava)
install.packages("xlsx")
library(xlsx)
a<-c(2,7,9,11,15)
b<-c("a", "b", "c", "d", "e")
x<-data.frame(a,b)
write.xlsx(x = xx.dataframe, file = "BENIM.excelfile.xlsx",
sheetName = "TestSheet", row.names = FALSE)
                      
                    

Bu programdan sonra Excel’de aşağıdaki dosya oluşacaktır:

HADOOP VE MAPREDUCE

BÜYÜK VERİ (BIG DATA) İLE ÇALIŞMAK
R İLE HADOOP VE MAPREDUCE ETKİLEŞİMİ
BÜYÜK VERİ (BIG DATA)

Büyük veri dediğimiz zaman şu özelliklerde olan bir veriyi kastediyoruz:

  1. I. Bilgisayarın belleğine (RAM) sığmayacak kadar büyüktür.
  2. II. Çok büyük ve karmaşık yapıdaki veriler olabilir.
  3. III. Yapısal, yarı yapısal ya da yapısal olmayan özellikte bir veri olabilir.

Bu özellikteki veriyi işleyebilmek için en uygun yöntem "veriyi bulunduğu yerde" işlemektir. Büyük veri için yazılım geliştiren kişilerin vurguladığı “3V” özelliği üzerinde durmalıyız. “3V” şu anlama gelmektedir:

Velocity (Hız):Uygulamacı kişilerin arzu ettiği düşük gecikmeli gerçek zamanlı işlem yapabilmektir. Örneğin bir sosyal ağdan sürekli olarak gelen bir veri akışı gerçek zamanlı olarak işlenebilecek midir?

Volume (Hacim): Verinin büyüklüğü demektir. MB, GB, TB ya da PB büyüklükte olabilir.

Variety (Çeşitlilik): Çeşitlilik, verinin farklı biçimlerde olması demektir. Metin (text), Ses (audio), Video(video) ya da fotoğraf (Photo) şeklinde olabilir.

BÜYÜK VERİ (BIG DATA) ÜRETEN ÜNLÜ ORGANİZASYONLAR

Aşağıda çok ünlü sosyal ağ ve internet şirketlerinin ürettiği büyük verinin miktarları konusunda bir tablo veriliyor. Bu bilgi Vignes Prajapati’nin kitabından (Big Data Analytics with R and Hadoop) alınmıştır:

ORGANİZASYON VERİ MİKTARI
Facebook 40 PB veriye sahip ve günlük veri hızı 100 TB/gün
Yahoo 60 PB veriye sahip
Twitter Günlük 8 TB/gün hızında veri dönmekte.
EBay 40 PB veriye sahip ve günde 50 TB/gün hızında veri dönüyor.

HADOOP NEDİR?

Apache Hadoop çok büyük miktarlarda veriyi işlemek ve sorgulamak için geliştirilmiş bir açık sistem (open source) çerçeve yazılımıdır (framework). Çok çeşitli ve büyük donanım kombinasyonları üzerinde çalışabilir. Hadoop, Apache’ın en üst düzeyde bir projesidir; Yahoo tarafından başlatılmış ve yönetilmiştir. Apache Hadoop bugün işletmelere yönelik bir “bulut hesaplama teknolojisi” (Cloud Computing Technology) haline gelmiştir.

Hadoop’un iki temel özelliği vardır:

  1. I. HDFS(Hadoop Distributed File Sistem):Hadoop Dağıtık Dosya Sistemi
  2. II. MapReduce

HADOOP’UN BAŞLICA BİLEŞENLERİ


Mahout: Makine öğrenmesi (machine learning) algoritmaları için çok geniş bir kütüphanedir.

Pig: Büyük veri kümelerini analiz etmek için geliştirilmiş bir yüksek düzey dilidir (high level language - HLL)

Hive: Hadoop için geliştirilmiş bir veri ambarı(data warehouse) sistemidir.

HBase: Hadoop Database anlamındadır. Hadoop için geliştirilmiş dağıtık ve sütun bazlı bir veri tabanı sistemidir.

Sqoop: SQL’den Hadoop’a veri transferi sağlayan özel bir yazılımdır. SQL to Hadoop ‘tan oluşturulmuş yapay bir sözcüktür.

ZooKeeper: Dağıtık sistemlerin işletimini sağlayan özel bir yazılımdır.

Ambari: Apache Hadoop kümelerini (clusters) yönetmek ve izlemek için geliştirilmiş bir yazılımdır; diğer bileşenlerin hepsi ile uyumlu çalışır.

R VE HADOOP

R dili veri analitiği veri madenciliği ve makine öğrenmesi konularında çok zengin bir kütüphaneye sahiptir ve RAM içerisinde nispeten küçük bir veri ile bu tür işlemleri gerçekleştirir. Fakat R dilinin yukarıda bahsedilen büyüklükte veriler üzerinde aynı işlemleri yapması mümkün değildir.

Öte yandan Hadoop büyük veriyi saklamak, sorgulamak ve işlemek için geliştirilmiştir.

R ile Hadoop arasında bir ara yüz ile ilişki kurulursa R dili ile Hadoop ortamındaki büyük veri tabanları üzerinden alınacak nispeten küçük veri miktarları ile veri analitiği ve veri madenciliği uygulamaları yapılabilir ve bunların sonuçları büyük veri yığını için de kullanılabilir. Aslında Amazon EMR gibi platformlar da aynı mantık ile çalışmaktadır.

Şekil RH_1: R ile Hadoop’un birlikte çalışması

Şekil RH_1: R ile Hadoop’un birlikte çalışması

MAPREDUCE NEDİR?

Mapreduce, büyük veriyi (big data) işlemeye uygun olarak tasarlanmış bir programlama modelidir. Hadoop, farklı dillerde yazılmış Mapreduce programlarını çalıştırma yeteneğine sahiptir. Bunlar Java, Ruby, Python ve C++ dillerinde olabilir.

MapReduce programları tabiatları itibarı ile paralel işlem yapabilen programlardır; bu sayede büyük ölçekli veriyi kümedeki (cluster) farklı makineler üzerinde işleyebilirler.

MapReduce programları iki fazda çalışır:

  1. I. Map Fazı
  2. II. Reduce Fazı

Her faz için giriş bilgisi anahtar - değer (key - value) çiftleridir Her programcı iki fonksiyonu belirlemelidir:

  1. I. Map fonksiyonu
  2. II. Reduce fonksiyonu

Şekil MR_1 sistemin çalışması konusunda bir fikir vermektedir:

Şekil MR_1: MapReduce’un İşlevi

Şekil MR_1: MapReduce’un İşlevi

DERİN ÖĞRENME (DEEP LEARNING)

DERİN ÖĞRENME (DEEP LEARNING)

Yapay Sinir Ağları (Artificial Neural Networks - ANN) bölümünde bir yapay sinir ağının yapısı ve işlevlerini anlatmıştık. Derin öğrenme makine öğrenmesinin (machine learning) bir dalıdır. Burada öğrenme mekanizmasındaki girişler ya da gözlem değerleri ile çıkışlar arasında kullanılan öğrenme mekanizması çok katmanlı mimariye sahip bir mekanizmadır ve genellikle de çok katmanlı bir yapay sinir ağıdır.

Yapay zekâ (Artificial Intelligence), makine öğrenmesi (machine learning) ve derin öğrenme (deep learning) arasındaki ilişkiyi şu şekilde tanımlayabiliriz:

Makine öğrenmesi, yapay zekânın bir alt kümesidir. Derin öğrenme ise makine öğrenmesinin bir alt kümesidir. Şekil D_1 bu ilişkiyi göstermektedir:

Şekil D_1: Yapay zekâ, makine öğrenmesi, derin öğrenme ilişkisi

Şekil D_1: Yapay zekâ, makine öğrenmesi, derin öğrenme ilişkisi

DERİN SİNİR AĞLARI (DEEP NEURAL NETWORKS)

Derin sinir ağı için en basit ama içeriği tam olarak açıklamayan tanım, ”derin sinir ağının gizli (hidden) katman sayısının ikiden fazla ama genel olarak çok daha fazla sayıda olduğu bir sinir ağı” tanımıdır. Bu tanımı daha ayrıntılı hale getirmek için aşağıdaki noktaları da vurgulamak gerekir:

  1. a. Derin öğrenme ya da sinir ağları önceki ağlardan çok daha fazla sayıda nöron içermektedir.
  2. b. Katmanların bağlantılarında daha karmaşık yollar kullanılmaktadır.
  3. c. Eğitim için gerekli hesaplama hızı çok yüksek boyutlardadır.
  4. d. Derin öğrenme ağları “otomatik özellik çıkarma” (automatic feature extraction) özelliğine sahiptir.

Derin ağlarda kullanılan 4 temel mimari aşağıda listelenmiştir:

  1. I. Denetimsiz ön eğitimli ağlar (Unsupervised Pretrained Networks)
  2. II. Katlamalı Sinir Ağları (Convolutional Neural Networks)
  3. III. Tekrarlı Sinir Ağları (Recurrent Neural Networks)
  4. IV. Öz yineli Sinir Ağları (Recursive Neural Networks)

Derin öğrenme modellerinin en önemli özelliklerinden biri de verinin nonlineer temsiline ve modellenmesine de imkân tanımalarıdır.
Son yıllarda derin sinir ağlarının kullanımı ve derin öğrenme yöntemleri oldukça büyük bir ivme kazanmış durumdadır. En önemli ve başarılı uygulama alanları aşağıdaki gibidir;

  1. I. Görüntü tanıma (Image recognition)
  2. II. Ses tanıma (Speech Recognition)
  3. III. Doğal dil işleme (Natural language processing)
  4. IV. Sürücüsüz araç kontrolü (Driverless Car Control)

Bunların dışında da pek çok alanda uygulamalar sürmektedir. Derin sinir ağlarının teorik temelleri çok eski senelerden beri bilinmesine karşın, hem çözülemeyen bazı teknik problemlerden hem de büyük miktarda verinin hızla işlenememesinden dolayı uygulanması oldukça gecikmiştir. Son senelerde hem teknik problemlerin çözümü hem de büyük hıza sahip CPU ve GPU ’ların devreye girmesi derin ağların kullanımını hızla yaygınlaştırmıştır. Şekil D_2’de bir derin sinir ağının yapısı görülmektedir:

Şekil D_2: Derin sinir ağının yapısı

Şekil D_2: Derin sinir ağının yapısı

Şekil D_3’te ise derin sinir ağının daha ayrıntılı bir modeli görülmektedir:

ŞEKİL D_3: Derin Sinir Ağının ayrıntılı yapısı

ŞEKİL D_3: Derin Sinir Ağının ayrıntılı yapısı

DERİN ÖĞRENME KONUSUNDA GELİŞTİRİLMİŞ YAZILIMLAR

Derin öğrenme konusundaki başarılar, pek çok bilgisayar programlama dilinde bu konunun kolayca uygulanmasına imkân veren çerçeve yazılımlar (framework) ve kütüphanelerin (libraries) geliştirilmesine yol açmıştır.

Başlıca örnekler,

  1. I. Caffee
  2. II. Theano
  3. III. Torch
  4. IV. Tensor Flow

gibi yazılımlardır. Ayrıca diğer birçok yazılım da mevcuttur. Aşağıda ise derin öğrenme yazılımları ile ilgili daha geniş bir liste sunulmaktadır:

YAZILIMIN ADI ÖZELLİĞİ
Blocks Sinir ağlarını eğitmek amacı ile kullanılan bir Theano çerçeve yazılımıdır.
Caffee Berkeley Yapay zekâ laboratuvarında geliştirilmiş bir yazılımdır.
Cuda/Convnet Tekrarlı (convolutional) ya da daha genel olarak ileriye doğru beslemeli (feed forward) sinir ağlarının hızlı gerçekleştirimini sağlayan bir C++/CUDA yazılımıdır.
ConvNet Matlab’de oluşturulmuş, Tekrarlı Sinir Ağı araç kutusudur (toolbox). Ham veriden faydalı özellikleri (feature) kendisi öğrenebilir.
convnet.js Javascript’te yazılmış derin öğrenme yazılımıdır. Tarayıcınız üzerinde tekrarlı sinir ağını eğitir.
CUV Nvidia CUDA fonksiyonlarının kolay kullanımı için geliştirilmiş Python destekli C++ yazılımıdır. Bonn üniversitesi yapay zeka laboratuvarında geliştirilmiştir.
cudamat Python ile yazılmış, GPU’ya dayalı bir matris kütüphanesidir. Sinir ağlarını eğitecek örnek kodu ve Sınırlı Boltzmann makinelerini de (Restricted Boltzmann Machines) içerir.
CXXNET MShadow’a dayalı, hızlı bir dağınık derin öğrenme çerçeve yazılımıdır. C++/CUDA ve Python/Matlab ara yüzleri de mevcuttur.
Deep Learn Toolbox Derin öğrenme için geliştirilmiş bir Matlab araç kutusudur.
Deep Belief Networks Derin İnanç Ağlarını (Deep Belief Networks) öğrenmek için geliştirilmiş bir Matlab yazılımıdır.
Deeplearning4j Java’da ve Scala’da yazılmış Apache 2.0 lisanslı açık kaynak dağıtık sinir ağı kütüphanesidir.
DeepDist Basit bir Python ara yüzü ile, HDFS/Spark’ta depolanmış verinin dağıtık stokastik gradyan eğitimini hızlandıran bir yazılımdır.
deepnet R’de derin öğrenmeyi gerçekleştiren bir araç kitidir (toolkit).
Deepwalk Grafikler için derin öğrenmeyi sağlar.
Deep Pink Bir satranç yapay zekâ ürünüdür. Derin öğrenme sayesinde satranç oynar.
darch R programlama dilinde derin mimariler oluşturma imkânı sağlar.
di-machine Derin öğrenme için kütüphaneleri ile birlikte GPU/CUDA esaslı hesaplama sürücüsü tanımlama imkânı sağlayan bir script dilidir.
Eblearn.lsh Enerji esaslı öğrenme için LUSH bazlı bir makine öğrenmesi kütüphanesidir.
Eblearn Enerjiye dayalı öğrenme sağlayan BSD lisanslı bir makine öğrenmesi kütüphanesidir. Tekrarlı sinir ağları, görüntü tanıma gibi uygulamalarda kullanıma uygundur. C++ ile yazılmıştır.
Gnumpy Numpy ile bağlantı sağlayan bir Python arayüzüdür. Hesaplamaları bilgisayarınızın GPU’sunda gerçekleştirir. cudamat üzerinde çalışır.
gensim Etkin online algoritmalar kullanarak büyük metin grupları üzerinde işlem yapabilen Python’da yazılmış bir vektör uzayı modellemesi ürünüdür. Açık kaynak yazılımıdır.
H2O Büyük veri üzerinde, istatistiksel işlemler, makine öğrenmesi ve matematiksel işlemler sağlayan bir yazılımdır. R, Excel ve Json ile ara yüzleri mevcuttur.
hebel Python’da yazılmış, GPU ile hızlandırılmış bir derin öğrenme kütüphanesidir.
Keras Theano’ya dayalı bir derin öğrenme kütüphanesidir.
Learning Deep Boltzmann Machines Deep Boltzmann makinelerinin eğitimi ve ince ayarı (fine tuning) için yazılmış bir Matlab kodudur.
LUSH Derin tekrarlı ağlar için New York Üniversitesi’nce geliştirilmiş programlama dili ve geliştirme ortamıdır.
Lasagne Theano’daki sinir ağlarını oluşturmak ve eğitmek için tasarlanmış bir basit bir kütüphanedir
libdeep C/C++ ortamında derin öğrenme sağlayan bir kütüphanedir.
matrbm Ruslan Salakhutdinov’un kodunun basitleştirilmiş bir sürümüdür. Matlab’de geliştirilmiştir.
MXNet Etkinlik ve esneklik öncelikli olarak geliştirilmiş bir derin öğrenme çerçeve yazılımıdır.
MShadow C++/CUDA ortamında, CPU/GPU bazlı Matris/Tensör şablon kütüphanesidir. Amacı, makine öğrenmesi projelerinde basitlik ve yüksek performans sağlamaktır. Etkin ve cihazdan bağımsız bir tensor kütüphanesi içerir.
mPot Doğal görüntülerin modellerini eğitmek amacı ile geliştirilmiş CUDAMat ve gnumpy kullanan Python yazılımıdır.
Nengo Büyük ölçekli sinir ağı sistemlerini simüle etmek amacı ile geliştirilmiş grafiksel ve metin içerikli bir yazılım paketidir.
neuralnetworks Derin öğrenme algoritmaları için geliştirilmiş Java tabanlı bir GPU kütüphanesidir.
NVIDIA DIGITS Derin sinir ağlarını geliştirmek, eğitmek ve görselleştirmek için yeni bir sistemdir.
ND4J Java için geliştirilmiş n boyutlu bilimsel bir hesaplama ortamıdır.
Neon Python bazlı derin öğrenme ortamıdır.
n42 Nodejs için derin öğrenme modülüdür.
OpenDL Spark üzerinde çalışan Derin öğrenme eğitimi çerçeve yazılımıdır.
Overfeat Tekrarlı Ağ bazlı (Convulutional Network), görüntü özellik çıkarıcı ve sınıflandırıcıdır.
Pylearn2 Makine öğrenmesi araştırmalarını kolaylaştırma amaçlı bir kütüphanedir.
pydeeplearn Bir derin öğrenme uygulama ara yüzüdür (Application Program Interface - API).
pddn Derin öğrenme için Python araç kitidir.
RNNLM Tomas Mikolov’un Tekrarlı sinir ağı modeline dayalı dil modelleri araç kitidir.
senna Doğal dil işleme araçlarına dayalı bir derin öğrenme ortamı
TensorFlow Veri akışı grafiklerini kullanarak hesaplama yapmak için geliştirilmiş bir açık kaynak kütüphanesidir.
Torch Makine öğrenmesi algoritmaları için geliştirilmiş Matlab esaslı bir yazılım ortamıdır.
Theano Python’da yazılmış CPU/GPU’da çalışan, sembolik ifade derleyicisidir
tiny-cnn C++’ta geliştirilmiş Derin öğrenme ortamıdır.
Veles Hızlı derin öğrenme uygulaması geliştirmek için kullanılan dağıtık bir platformdur.

R DİLİNDE DERİN ÖĞRENME PAKETLERİ

PAKET ÖZELLİKLERİ
MXNetR İleri - beslemeli (Feed - Forward Neural Network) ve tekrarlı sinir ağları (Convolutional Neural Network (CNN)) için uygundur.
darch Kısıtlı Boltzmann Makinesi (Restricted Boltzmann Machine), ve derin inanç ağı (Deep Belief Network) için uygundur.
deepnet İleri beslemeli sinir ağı (Feed - Forward Neural Network), Kısıtlı Boltzmann Makinesi (Restricted Boltzmann Machine), derin inanç ağı (Deep Belief Network) ve yığılmış otomatik kodlayıcılar (Stacked Autoencoders) için uygundur.
H2O İleri beslemeli sinir ağları (Feed-forward neural network), ve derin otomatik kodlayıcılar (deep autoencoders) için uygundur.
deepr H2O ve deepnet paketlerindeki bazı işlevleri basitleştirmektedir.

R DİLİNDE BİR DERİN ÖĞRENME UYGULAMASI

Bu bölümde, R dilinde yazılmış neuralnet yazılımını kullanarak bir uygulama geliştireceğiz. Önce gerekli paketleri yükleyelim:

                      
install.packages('neuralnet')
library('neuralnet')
                      
                    

Ayrıca RMysql paketi de yüklü olmalıdır.

Bu uygulamada y=x2 + 0.5 parabolünü oluşturulan bir veriden faydalanarak yeniden üretecek bir Derin Sinir Ağı (DNN) uygulaması geliştireceğiz. Önce x bağımsız değişkeni ve y cevap ya da bağımsız değişkenini tanımlayalım:

                      
set.seed(2017)
X = as.data.frame(sample(seq(-3, 3, length=60), 60, replace=FALSE), ncol=1)
Y =X^2+0.5
                      
                    

Burada x için -3, +3 aralığında 60 tane rastgele değer ve onlara bağlı y değerleri üretilmektedir. Şimdi x bağımsız değişkeni ve y bağımlı değişkenini bir data frame içinde birleştirelim:

                      
data = cbind (X, Y)
colnames (data) = c ('X', 'Y')
                      
                    

Şimdi rasgele üretilen verinin ilk 8 tanesini görelim:

                      
head(data, 8)
                      
                    

Oluşturulan x ve y değerleri için çizdirdiğimiz grafikse aşağıdadır (Şekil D_4).

                      
 plot(data,  pch=21, col=2)
                      
                    

Şekil D_4: Üretilen x, y verileri ile çizilen grafik

Şekil D_4: Üretilen x, y verileri ile çizilen grafik

DNN uygulamamızda 3 katmanlı ve 1. katmanda 4, 2. katmanda 4 ve 3. katmanda 2 nöron olan bir sinir ağını aşağıdaki komutla oluşturuyoruz:

                      
UYG = neuralnet(Y~X, data = data, hidden = c(4, 4,2), threshold  = 0.015, act.fct = "logistic")
                      
                    

Ayrıca bu sinir ağının grafiğini de aşağıdaki komutla çiziyoruz:

                      
plot(data, pch = 21, col = 2)
                      
                    

Şekil D_7: Oluşturulan derin sinir ağı(DNN)

Şekil D_7: Oluşturulan derin sinir ağı(DNN)

Şekil D_7’de görüldüğü gibi hassasiyet 0.019475 ve iterasyon sayısı 4623’tür. Şimdi oluşturulan modeli ve bulunan ağırlıkları kullanarak bir test verisi ile deney yapmak gerekecektir yani oluşturulan DNN’in parabol üretip üretmeyeceği görülmelidir. Aşağıdaki komutla test verisini üretiyoruz:

                      
testdata = as.matrix(sample(seq(-3, 3, length = 11), 11, replace = FALSE), ncol = 1)                        
                      
                    

Burada -3,+3 aralığında 11 adet test verisi üretilmektedir. Aşağıdaki komut ise üretilen test verisi ile parabol oluşturmayı deniyor:

                      
KEST = compute(UYG, testdata)                        
                      
                    

Şekil D_5’te gerçek veri ile kestirim sonucu elde edilen paraboller görülmektedir:

Şekil D_5: Gerçek değerlerle kestirim değerleri kullanılarak çizilen paraboller

Şekil D_5: Gerçek değerlerle kestirim değerleri kullanılarak çizilen paraboller

cor() fonksiyonu ise korelasyonu hesaplamaktadır. Programın tam listesi aşağıdadır:

                      
library("neuralnet")
set.seed(2017)
X = as.data.frame(sample(seq(-3, 3, length = 60), 60, replace = FALSE), ncol = 1)

Y = X^2 + 0.5
data = cbind(X, Y)
colnames(data) = c('X', 'Y')

head(data, 8)
plot(data, pch = 21, col = 2)
x = data$X[order(data$X)]
y = data$Y[order(data$X)]
lines(x, y, col=8, lty=4, lwd=3)
UYG = neuralnet(Y~X, data=data, hidden=c(4, 4,2), threshold =0.015, act.fct="logistic")
plot(UYG)
testdata = as.matrix(sample(seq(-3, 3, length =11), 11, replace=FALSE), ncol =1)

cor(KEST$net.r, testdata^2)
r = cbind(testdata, KEST$net.r, testdata^2)
colnames(r) = c('X', 'KESTIRIM(HESAPLAMA)', 'GERCEK DEGER')
round(r, 5)
x = r[,"X"][order(r[,"X"])]
y_act = r[,"GERCEK DEGER"][order(r[,"X"])]
y_KEST = r[,"KESTIRIM(HESAPLAMA)"][order(r[,"X"])]
par(mfrow=c(1,2))

# plot actual data
plot(x, y_act, pch=21, col=2, xlab='X', ylab="GERCEK DEGER")
lines(x, y_act, col=9, lty=3, lwd=2)
plot(x, y_KEST, pch=21, col=1, xlab='X', ylab="KESTIRIM(HESAPLAMA)")
lines(x, y_KEST, col=9, lty=4, lwd=2)
                      
                      
                    

DERİN AĞ İÇİN ALTERNATİF

Derin ağ için şimdi farklı parametreleri deneyelim. Ağı, 3 katmanlı ve her katmanda 2 nöron bulunacak şekilde üretelim (Şekil D_6). Bu durumda iterasyon sayısı 21414 (öğrenme için gerekli iterasyon sayısı) ve hassasiyet ise 0.030759 olmaktadır.

ŞEKİL D_6: Derin ağın 3 katmanlı ve her katmanda 2 nöron bulunarak üretilmesi

ŞEKİL D_6: Derin ağın 3 katmanlı ve her katmanda 2 nöron bulunarak üretilmesi

GELENEKSEL MAKİNE ÖĞRENMESİ VE DERİN ÖĞRENME İLE SINIFLANDIRMA İŞLEMİ

Makine öğrenmesi algoritmaları ile sınıflandırma işlemi 2 faz içerecektir:

  1. I. Eğitim fazı: Görüntü sınıflandırması söz konusu ise bu fazda veri kümesindeki görüntüler ve onların etiketlerini kullanarak makine öğrenmesi algoritmasını eğitiriz.
  2. II. Kestirim fazı: Bu fazda eğitilmiş modeli kullanarak etiketsiz yani hangi sınıftan olduğu belli olmayan görüntüler için etiket buluruz yani onları bilinen bir sınıfa ait sayarız (Şekil D_8).
Şekil D_8: Geleneksel Makine Öğrenmesi

Şekil D_8: Geleneksel Makine Öğrenmesi

Görüntü sınıflandırma işlemi için eğitim aşaması da 2 adımdan oluşur:

  1. a. Özellik (feature) çıkartma: Bu aşamada mevcut veriyi kullanarak makine öğrenmesi algoritmasında kullanılacak özellikleri tespit ederiz.
  2. b. Modelin eğitimi: Bu aşamada görüntüler ve onlara atanmış etiketleri kullanarak modeli eğitiriz.

Kestirim fazında ise aynı özellik çıkartma sürecini yeni görüntülere uygularız. Bulunan özellikleri eğitilmiş makine öğrenmesi modeline geçirerek görüntüler için etiket (sınıf) kestiriminde bulunuruz.

Geleneksel makine öğrenmesi algoritması ile derin öğrenme algoritmaları arasındaki temel fark özellik mühendisliği (Feature Engineering) sürecindedir. (Şekil D_9)

Şekil D_9: Geleneksel makine öğrenmesi ve derin öğrenme mukayesesi

Şekil D_9: Geleneksel makine öğrenmesi ve derin öğrenme mukayesesi

Geleneksel makine öğrenmesi algoritmalarında özellikler bir anlamda manuel olarak ya da kişisel deneyim ile elde edilir. Bunun karşıtı olarak derin öğrenme algoritmalarında ise özellik çıkarımı algoritma sayesinde otomatik olarak yapılır. Özellik mühendisliği güç bir işlemdir; zaman alıcı ve çalışılan alana özgü uzmanlık gerektiren bir iştir. Bu anlamda derin öğrenme algoritmaları bu alanda oldukça kolaylık sağlamaktadır.

DERİN ÖĞRENME AĞLARININ ÇEŞİTLERİ

Kullanım amacına göre derin öğrenme ağlarında farklı modeller ortaya konulmuştur. Bu bölümde bu türlerden en önemli olanları gözden geçireceğiz.

ELMAN SİNİR AĞLARI

ELMAN SİNİR AĞLARI (ELMAN NEURAL NETWORKS)

En basit ve en çok kullanılan tekrarlı sinir ağlarından (Recurrent Neural Network - RNN) biridir. Elman sinir ağında giriş (input), çıkış (output) ve gizli (hidden) katmanların (layer) dışında bir de içerik (context) katmanı bulunur.

Giriş ve içerik katmanları gizli katmana bağlanır; gizli katman çıkışları da çıkış katmanına bağlanır.

İçerik katmanı bir önceki adımdaki gizli katman aktivasyonunun bir kopyasıdır. Başka bir deyişle bir önceki adımdaki gizli katman değerleri geri besleme ile (feedback) içerik katmanına gönderilir.

TEKRARLI SİNİR AĞLARI ÇALIŞMA PRESİBİ

Elman ağları gibi tekrarlı ağlarda aşağıdaki çalışma mekanizması mevcuttur:

t anındaki tekrarlı ağ çıkışı 4 adımda hesaplanır:

  1. I. Giriş vektörü, giriş katmanı birimlerine kopya edilir.
  2. II. Gizli katmanın t-1 anındaki ağırlıkları içerik katmanı birimlerine kopya edilir.
  3. III. Gizli katman birimleri yeni aktivasyonları (ağırlıkları) hesaplar.
  4. IV. Çıkış katmanı birimleri kendi ağırlıklarını hesaplar ve ağ çıkışına kopya eder.

Şekil EL_1 ve EL_2’de Elman sinir ağı yapısı ve çalışma biçimi görülmektedir.

Şekil EL_1: Elman Sinir Ağı

Şekil EL_1: Elman Sinir Ağı

Şekil EL_2: Elman Sinir Ağı

Şekil EL_2: Elman Sinir Ağı

İÇERİK (CONTEXT) KATMANI NÖRONLARININ FAYDASI

İçerik katmanı nöronları gizli (hidden) katmanın değerlerini saklayarak sinir ağının bir önceki iç durumunu hatırlar. Gizli katman değerleri bir zaman adımı gecikmeli olarak saklanır ve bir sonraki zaman adımında sinir ağı için ilave giriş değerleri sağlar.

ELMAN AĞININ PRATİKTE KULLANIMI

Khatib v.d. Elman ağını, saatlik radyasyon değerlerini tahmin etmek için kullanmışlardır (Şekil El_3).

Şekil El_3: Elman ağının saatlik radyasyon değerlerinin tahmini için kullanılması

Şekil El_3: Elman ağının saatlik radyasyon değerlerinin tahmini için kullanılması

Khatib v.d. üç katmanlı ve 8 adet özellik girişi (Latitude (enlem), Longitude (boylam), Temperature (sıcaklık), Sunshine ratio (gün ışığı oranı), Humidity (nem), Month (ay), Day (gün), Hour (saat)), 5 adet gizli nöron, 5 adet içerik nöronu ve iki adet çıkış nöronu içeren bir ağ tasarlamışlardır. Sonuçta global güneş radyasyonu (global solar radiation) ve difüz güneş radyasyonu (diffused solar radiation) tahmin edilmektedir.

Şekil EL_4’te ise ayrıntıları ile bir Elman sinir ağı görülmektedir.

Şekil EL_4: Elman sinir ağı

Şekil EL_4: Elman sinir ağı

JORDAN SİNİR AĞLARI

Jordan sinir ağları Elman sinir ağlarına oldukça benzemektedir. Aralarındaki tek fark Elman sinir ağlarında içerik nöronları gizli katmandan geri besleme almasına karşılık Jordan sinir ağlarında içerik nöronları çıkış (output) katmanından geri besleme almaktadır.

Şekil J_1. Jordan Sinir Ağı

Şekil J_1. Jordan Sinir Ağı

Çıkış (output) birimindeki aktivasyon değerleri içerik düğümlerine aynen kopya edilir.

JORDAN AĞLARI İLE ÇÖZÜLMÜŞ PRATİK PROBLEMLER

  1. I. Rüzgâr hızı tahmini
  2. II. Protein - Protein etkileşimi problem
  3. III. İspanyolca sayısal dijit okunuşlarının hassas biçimde sınıflandırılması

KISITLI BOLTZMANN MAKİNELERİ (RESTRICTED BOLTZMANN MACHINES)

KISITLI BOLTZMANN MAKİNESİ (RESTRICTED BOLTZMANN MACHINE)

Basit bir denetimsiz (unsupervised) öğrenme modülüdür. Gizli katman (hidden layer) ve giriş katmanı (input layer - visible unit) birer tanedir. Gizli nöronlar veya giriş nöronlarının kendileri arasında bağlantı yoktur (Kısıtlı sözcüğü buradan gelir, Şekil RB_1).

Şekil RB_1: Kısıtlı Boltzman Makinesi

Şekil RB_1: Kısıtlı Boltzman Makinesi

Şekildeki örnekte 3 nöronu olan bir gizli (hidden) katman ve 2 nöronu olan bir giriş katmanı bulunmaktadır. Kısıtlı Boltzmann makinesi, boyut indirgeme, sınıflandırma, regresyon, işbirlikçi (collaborative) filtreleme, özellik öğrenme gibi konularda kullanılabilecek bir algoritma ya da bir yapıdır.

KISITLI BOLTZMAN MAKİNESİNDE BİR YOLA AİT ÇIKIŞ DEĞERİNİN HESAPLANMASI

Şekil RB_2 kısıtlı bir Boltzmann makinesi ile ilişkili çıkış değerinin nasıl hesaplanacağı konusunda fikir vermektedir.

Şekil RB_2: Kısıtlı Boltzmann Makinesi

Şekil RB_2: Kısıtlı Boltzmann Makinesi

f((w * x)+b) = a çıkışı

DERİN İNANÇ AĞLARI (DEEP BELIEF NETWORKS)

Derin inanç ağları üst üste konmuş çok sayıda Kısıtlı Boltzmann Makinesinden oluşan bir yapıdır. Üst üste konulmuş yapı içindeki her KBM’nın (Kısıtlı Boltzmann Makinesi) girişi bir önceki KBM’nın çıkışı olacaktır. Bu yapı ile girişler bir nonlineer transformasyon ile çıkışa verilmektedir.

DİA (Derin İnanç Ağı) genellikle iki tip katmandan oluşur; Görünür (Visible)katman ve gizli (hidden) katman. Görünür katmanlar giriş ve çıkış düğümlerinden oluşur, gizli katmanlar ise gizli düğümleri saklamaktadır (Şekil DB_1).

Şekil DB_1: Derin inanç Ağı

Şekil DB_1: Derin inanç Ağı

DERİN İNANÇ AĞLARININ ÇOK YAYGIN KULLANILDIĞI ALANLAR

Derin inanç ağları aşağıda listelenen alanlarda başarı ile kullanılmaktadır:

  1. I. Ses tanıma
  2. II. Görüntü tanıma
  3. III. Doğal dil işleme

TENSORFLOW İLE VERİ ÇIKIŞ GRAFLARI KULLANARAK HESAPLAMA

DERİN ÖĞRENME İÇİN TENSORFLOW YAZILIMI

Bu bölümde Google tarafından geliştirilen TensorFlow yazılımı konusunda bilgi vereceğiz.

TENSORFLOW YAZILIMININ MAC ORTAMINDA YÜKLENMESİ

Öncelikle Mac ortamında TensorFlow yazılımının nasıl yükleneceğini göstereceğiz.

  1. I. TensorFlow yazılımının kurulabilmesi için öncelikle sisteminizde
    Python 2.7
    Python 3.3+

    sürümlerinden birinin mevcut olması gerekir. Eğer yoksa yüklemeniz gerekir.
  2. II. pip, Python’da yazılım paketlerini yöneten ve kurulumlarını gerçekleştiren bir programdır. O nedenle TensorFlow yüklenmeden önce programın aşağıdaki sürümlerinden biri sistemde mevcut olmalıdır:
    pip for Python 2.7
    pip3 for Python 3.n.

pip veya pip3 büyük ihtimalle sisteminize Python ile beraber yüklenmiştir. Sisteminizde gerçekten pip ya da pip3’ün yüklü olup olmadığını test etmek için aşağıdaki komutları kullanırız:

                      
$ pip -V  #  Python 2.7 
$ pip3 -V #  Python 3.n                       
                      
                    

TensorFlow için pip3 versiyon 9.0.1’i tavsiye ediyoruz. Eğer pip ya da pip3 için 8.1 ve daha ötesi yüklenmemişse sürümü güncellemek için aşağıdaki komutları kullanabilirsiniz:

                      
$ sudo easy_install—upgrade pip 
$ sudo easy_install—upgrade six                   
                      
                    

TensorFlow KURULUMU

Yukarıdaki ön koşulları yerine getirdikten sonra aşağıdaki komutlarla TensorFlow yazılımının kurulumunu gerçekleştirebilirsiniz:

                      
$ pip install tensorflow      # Python 2.7;
$ pip3 install tensorflow     # Python 3.n;                 
                      
                    

Yukarıdaki kurulumlar CPU kullanan versiyon içindir. GPU kullanımını da desteklemek için aşağıdaki komutlar girilmelidir:

                      
$ pip install tensorflow -gpu     # Python 2.7;
$ pip3 install tensorflow-gpu     # Python 3.n;             
                      
                    

Aşağıda sistemin pip3 9.0.1 sürümüne güncellenmesi ve TensorFlow yazılımının başarı ile kurulumu ile ilişkili adımlar ve sonuçları görülmektedir:


MacBook-Air:~ macuser$ pip3 install—upgrade pip
Collecting pip
Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)

                                              
Installing collected packages: pip
Found existing installation: pip 8.1.1
Uninstalling pip-8.1.1:
Successfully uninstalled pip-8.1.1
Successfully installed pip-9.0.1
MacBook-Air:~ macuser$ pip3 install tensorflow
Collecting tensorflow
Downloading tensorflow-1.3.0-cp35-cp35m-macosx_10_11_x86_64.whl (39.4MB)
                        
                      

                         
Collecting wheel>=0.26 (from tensorflow)
Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
                          
                      

                         
Requirement already satisfied: six>=1.10.0 in 
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (from tensorflow) Requirement already satisfied: numpy>=1.11.0 in
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (from tensorflow) Collecting tensorflow-tensorboard < 0.2.0, > =0.1.0 (from tensorflow) Downloading tensorflow_tensorboard-0.1.6-py3-none-any.whl (2.2MB)

                         
Collecting protobuf<=3.3.0 (from tensorflow)
Downloading protobuf-3.4.0-py2.py3-none-any.whl (375kB)
                          
                      

                         
Collecting werkzeug<=0.11.10 (from tensorflow-tensorboard <0.2.0, > =0.1.0-> tensorflow)
Downloading Werkzeug-0.12.2-py2.py3-none-any.whl (312kB)
                          
                      

                         
Collecting markdown>=2.6.8 (from tensorflow-tensorboard < 0.2.0, > =0.1.0-> tensorflow)
Downloading Markdown-2.6.9.tar.gz (271kB)
                          
                      

                         
Collecting html5lib==0.9999999 (from tensorflow-tensorboard < 0.2.0, > =0.1.0->tensorflow)
Downloading html5lib-0.9999999.tar.gz (889kB)
                          
                      

                         
Collecting bleach==1.5.0 (from tensorflow-tensorboard<0.2.0,>=0.1.0->tensorflow)
Downloading bleach-1.5.0-py2.py3-none-any.whl
Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (from protobuf>=3.3.0->tensorflow)
Installing collected packages: wheel, protobuf, werkzeug, markdown, html5lib, bleach, tensorflow-tensorboard, tensorflow
Running setup.py install for markdown ... done
Running setup.py install for html5lib ... done
Successfully installed bleach-1.5.0 html5lib-0.9999999 markdown-2.6.9 protobuf-3.4.0 tensorflow-1.3.0 tensorflow-tensorboard-0.1.6 werkzeug-0.12.2 wheel-0.30.0
                          
                      

TENSORFLOW YAZILIMININ WINDOWS’TA KURULUMU

TensorFlow yazılımı Windows’ta Python 3.5.x ve 3.6.x sürümlerinde çalışmaktadır. Bunlar yüklü değilse bilgisayarınıza öncelikle bu sürümleri yükleyiniz.

Python 3 pip3 adlı yazılım paketleri yöneticisi ile yüklenmektedir. Bu yazılımı aynı zamanda TensorFlow kurulumu için de kullanabilirsiniz.

Sadece CPU destekli yazılım için aşağıdaki komutu kullanınız:

                         
C:\> pip3 install—upgrade tensorflow
                          
                      

TensorFlow’un GPU sürümünü de kullanmak için aşağıdaki komutu girmelisiniz:

                         
C:\> pip3 install—upgrade tensorflow-gpu
                        
                      

TENSORFLOW YAZILIMINI LINUX ORTAMINDA YÜKLEMEK

Bunun için gerekli işlemler MacOS X bölümünde anlatılanlarla aynıdır.

TENSORFLOW NEDİR?

Tensorflow Derin Öğrenme (deep learning) odaklı, çok boyutlu dizi işlemlerini etkin biçimde yapma iddiasında olan bir fonksiyon kütüphanesidir. Google Beyin Takımı (Google Brain Team) tarafından geliştirilmiştir ve 9 Kasım 2015 tarihinde Açık Kaynaklı (Open Source) yazılım olarak kullanıma açılmıştır.

TensorFlow kullanıma açıldıktan sonra hem profesyonel dünyada hem de akademik ortamlarda büyük bir popülariteye sahip olmuştur. Python API’ı ve R arayüzü (interface) ile kullanım alanını oldukça yaygınlaştırmıştır.

TensorFlow Python’un NumPy paketinin özelliklerine benzer bazı özellikler taşımaktadır. Çok boyutlu dizilere dayanan veri yapıları ve hesaplamalar bunlar arasındadır. Ayrıca Tensörlerle ilişkili fonksiyonlar tanımlama, paralel tensor işlemleri, otomatik türev hesaplama gibi derin öğrenmeye (deep learning) destek olacak özelliklere de sahiptir.

TensorFlow tamamen bir veya birden fazla CPU üzerinde çalıştığı gibi ayrıca GPU’uyu da desteklemektedir. GPU (Graphical Processing Unit - Grafiksel İşlem Birimi) yüksek hızlı paralel hesaplama konusunda oldukça etkin bir işlemcidir.

TensorFlow ayrıca dağıtık sistemleri Android ve iOS gibi mobil platformları da desteklemektedir.

ÖRNEK:
BASİT BİR TENSORFLOW KODUNUN ÇALIŞTIRILMASI

                         
import tensorflow as tf
MERHABA= tf.constant('MERHABA, TensorFlow!')
sess = tf.Session()
print(sess.run(MERHABA))

x = tf.constant(10)
y = tf.constant(32)
print(sess.run(x+ y))
                        
                      

KODUN ÇIKTISI

                         
'MERHABA, TensorFlow!'
42
>>>
                        
                      

Bu çok basit kodda x ve y değerlerinin toplamı ve ‘Merhaba,TensorFlow’ ifadesi yazdırılmaktadır.

ÖRNEK:

                         
import tensorflow as tf
x= tf.placeholder("float") 
y= tf.placeholder("float") 
z = tf.multiply(x, y) 
with tf.Session() as sess: 
    print("%f 8.0 ye esit olmali" % sess.run(z, feed_dict={x: 2, y: 4}))   
    print("%f 10.0 a esit olmali" % sess.run(z, feed_dict={x: 2, y: 5}))
                        
                      

KODUN ÇIKTISI

Programı çalıştırınca aşağıdaki sonucu alacaksınız:

                         
8.000000 8.0 ye esit olmali
10.000000 10.0 a esit olmali
>>>
                        
                      

Multiply fonksiyonu iki sayıyı çarpmaktadır.

ÖRNEK BİR TENSORFLOW KODUNUN ÇALIŞTIRILMASI

Bu amaçla önce Python çalışma ortamını yüklemeliyiz (Şekil D_10).

Şekil D_10: Python Çalışma Ortamı

Şekil D_10: Python Çalışma Ortamı

Bu uygulamada aşağıdaki gibi bir matris oluşturup bunun sütun toplamlarını hesaplatmak istiyoruz:

MAT =

TensorFlow’da numerik hesaplamalar iki adımda gerçekleştirilir:

  1. I. Hazırlık adımı
  2. II. Çalışma adımı

Buna göre önce matris yapısı ve verileri tanımlanacak ve daha sonra gerekli hesaplama yapılacaktır.

  1. I. HAZIRLIK ADIMI:

    Aşağıda TensorFlow’un bu matrisi oluşturmak için gerekli komutları görülüyor:

                             
    g = tf.Graph()
    with g.as_default() as g:
    MAT = tf.constant(   [[5., 10.],
    [15., 20.],
    [25., 30.]], dtype=tf.float32)
    SUT_TOP= tf.reduce_sum(MAT ,axis=0)
    print(‘tf_x:\n’, MAT)
    print(‘\ncol_sum:\n’, SUT_TOP
                            
                          

  2. II. ÇALIŞMA ADIMI:
                             
    with tf.Session(graph=g) as sess:
    M, ST= sess.run([MAT, SUT_TOP])
    print(‘\nMATRIS:\n’, M)
    print(‘\nST:\n’, ST)
                            
                          

Şimdi kodu tümüyle çalıştırmak için gerekli işlemleri tamamlayalım:

  1. I. Burada File/New File menü adımları ile bir boş pencere açıp buraya aşağıdaki kodu yükleyiniz:
                             
    import tensorflow as tf
    g = tf.Graph()
    with g.as_default() as g:
    MAT = tf.constant(   [[5., 10.],
    [15., 20.],
    [25., 30.]], dtype=tf.float32)
    SUT_TOP= tf.reduce_sum(MAT ,axis=0)
    print(‘tf_x:\n’, MAT)
    print(‘\ncol_sum:\n’, SUT_TOP)
    with tf.Session(graph=g) as sess:
    M, ST= sess.run([MAT, SUT_TOP])
    print(‘\nMATRIS:\n’, M)
    print(‘\nST:\n’, ST)
                            
                          

  2. II. Şimdi File/Save menü adımları ile kodu saklayınız. Örneğin deep1.py adını kullanabilirsiniz.
  3. III. Daha sonra Run/Run Module adımları ile kodu çalıştırınız. Aşağıdaki sonucu elde edeceksiniz:

PROGRAMIN ÇIKTISI:

                         
tf_x:
Tensor(“Const:0”, shape=(3, 2), dtype=float32)
col_sum:
Tensor(“Sum:0”, shape=(2,), dtype=float32)
                        
                      

MATRIS:

                         
[[  5.  10.]
[ 15.  20.]
[ 25.  30.]]

ST:
[ 45.  60.]
>>>
                        
                      

Burada sütun toplamları aşağıdaki komutla hesaplanıyor:

                         
SUT_TOP= tf.reduce_sum(MAT ,axis=0)
                        
                      

reduce_sum, Python’un NumPy paketindeki sum() fonksiyonunun gerçekleştirdiği işi yapmaktadır. Axis = 0 parametresi işlemin sütunlar için yapılacağını gösterir. Axis = 1 olsa idi satır toplamları hesaplanacaktı. Yukarıdaki kodda axis = 1 yaparak kodu tekrar çalıştırınız. Aşağıdaki sonucu elde edeceksiniz:

                         
tf_x:
Tensor(“Const:0”, shape=(3, 2), dtype=float32)
col_sum:
Tensor(“Sum:0”, shape=(3,), dtype=float32)                        
                        
                      

MATRIS:

                         
[[  5.  10.]
[ 15.  20.]
[ 25.  30.]]

ST:
[ 15.  35.  55.]
>>>
                        
                      

Tensör (İng. Tensor) en basit ifade ile çok boyutlu bir sayı dizisi olarak tanımlanabilir. Bu anlamda tensör, skaler (scalar), vektör (vector) ve matris (matrix) şeklinde ilerleyen hiyerarşinin son noktasıdır. Aşağıda matematiksel olarak bu durum açıklanmaktadır:

R, reel sayılar kümesini göstermek üzere,

1. Skaler (Sayı) R
2. Vektör Rn
3. Matris RnxRn
4. Tensör RnxRnxRp
5. .......

Bu yapıyı görsel olarak aşağıdaki gibi gösterebiliriz:

Şekil D_11

Şekil D_11

VEKTÖR:


MATRİS:
İNDİSLER

DEĞERLER


TENSÖR
İNDİSLER
İKİNCİ KATMAN


İLK KATMAN


DEĞERLER


T[0, 2, 1]=-3     T[1, 3, 0]=54

DEĞİŞKEN (VARIABLE)

Değişken (variable) kavramı programlama dillerinde çok bilinen bir kavramdır ve bellekte sabit bir değer taşıyan ve bir ismi olan veri yapısı olarak bilinir:

Yukarıdaki örnekte a bir değişkendir ve değeri 99’dur. Bir değişkenin değeri program boyunca değişir. TensorFlow yazılımında ise değişkenler eğitim sırasında modelin parametrelerini bellekte tutan ve güncelleyen veri yapıları olarak görülür.

TensorFlow’da bir değişken “tensor” tanımlayabilmek için, TensorFlow yazılımının Variable() adlı yapıcısını (constructor) kullanırız. Bu daha önceden matris oluşturmakta kullandığımız constant yapıcısına benzer. Bununla birlikte değişken içeren eden hesaplamalı grafı çalıştırmak için bütün değişkenlere bir ilk değer atamalıyız. Bu işlemi de tf.global_variables_initializer() komutu ile yaparız.

Aşağıdaki programda değişken bir matris oluşturulmakta ve elemanları a sabiti ile çarpılarak yazdırılmaktadır:

ÖRNEK:
TENSORFLOW’DA DEĞİŞKEN MATRİS PROGRAMI

                         
import tensorflow as tf
g = tf.Graph()
with g.as_default() as g:
MAT = tf.Variable(   [[5., 10.],
[15., 20.],
[25., 30.]], dtype=tf.float32)
a = tf.constant(3., dtype=tf.float32)

# MATRISI BIR SABITLE CARPMA
MAT = MAT * a
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(MAT)
print(SONUC)
                        
                      

PROGRAMININ ÇIKTISI:

                         
[[ 15.  30.]
[ 45.  60.]
[ 75.  90.]]
>>>
                        
                      

İKİ KEZ ÜST ÜSTE ÇALIŞTIRMA

                       
import tensorflow as tf
g = tf.Graph()
with g.as_default() as g:
MAT = tf.Variable(   [[5., 10.],
[15., 20.],
[25., 30.]], dtype=tf.float32)
a = tf.constant(3., dtype=tf.float32)

# MATRISi BİR SABITLE CARPMA
MAT = MAT * a
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(MAT)
print(SONUC)
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(MAT)
print(SONUC)
                        
                      

PROGRAMININ ÇIKTISI:

                       
[[ 15.  30.]
[ 45.  60.]
[ 75.  90.]]
[[ 15.  30.]
[ 45.  60.]
[ 75.  90.]]
                      
                    

Burada görüldüğü gibi iki kez üst üste çalıştırma matrisin değerlerini değiştirmemektedir. Matrisin değerlerini güncellemek ya da bir değişkene yeni değer atamak için assign işlemi kullanılır. Aşağıdaki örneklerde bunun örneklerini görebiliriz;

ÖRNEK:
ÇARPIM İFADESİNİN TEKRARLANMASI

                       
import tensorflow as tf
g = tf.Graph()
with g.as_default() as g:
MAT = tf.Variable(   [[5., 10.],
[15., 20.],
[25., 30.]], dtype=tf.float32)
a = tf.constant(3., dtype=tf.float32)

# MATRISI BIR SABITLE CARPMA
MAT = MAT * a
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(MAT)
print(SONUC)
MAT = MAT * a
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(MAT)
print(SONUC)
                      
                    

PROGRAMININ ÇIKTISI:

                       
[ 15.  30.]
[ 45.  60.]
[ 75.  90.]]
[[  45.   90.]
[ 135.  180.]
[ 225.  270.]]
                      
                    

ÖRNEK:
DEĞİŞKEN MATRİSİN ELEMANLARINI GÜNCELLEME: ASSIGN İŞLEMİ

                       
import tensorflow as tf
g = tf.Graph()
with g.as_default() as g:
MAT = tf.Variable(   [[5., 10.],
[15., 20.],
[25., 30.]], dtype=tf.float32)
a = tf.constant(3., dtype=tf.float32)

GUNCEL_MAT = tf.assign(MAT ,MAT*a)
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(GUNCEL_MAT)
print(SONUC)
                      
                    

PROGRAMININ ÇIKTISI:

                       
============== RESTART: /Users/macuser/Documents/DEEP1.py ===============
[[ 15.  30.]
[ 45.  60.]
[ 75.  90.]]
>>>
                      
                    

İKİ KEZ ÇALIŞTIRMA

                       
import tensorflow as tf
g = tf.Graph()
with g.as_default() as g:
MAT = tf.Variable(   [[5., 10.],
[15., 20.],
[25., 30.]], dtype=tf.float32)
a = tf.constant(3., dtype=tf.float32)
GUNCEL_MAT = tf.assign(MAT ,MAT*a)
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
SONUC = sess.run(GUNCEL_MAT)
SONUC = sess.run(GUNCEL_MAT)
print(SONUC)
                      
                    

PROGRAMININ ÇIKTISI:

                       
[[  45.   90.]
[ 135.  180.]
[ 225.  270.]]
>>> 
=============== RESTART: /Users/macuser/Documents/DEEP1.py ===============
[[  45.   90.]
[ 135.  180.]
[ 225.  270.]]
                      
                    

YER TUTUCU DEĞİŞKENLER (PLACEHOLDER VARIABLES)

TensorFlow yazılımında önemli bir kavram da yer tutucu değişkenlerdir. Bunlar çalışma zamanında aktif bölümde hesaplamalı grafın numerik değerlerle beslenmesini sağlar.

Aşağıdaki örnekte, matris çarpımı gerçekleştiren bir hesaplamalı graf (computational graph) tanımlanmaktadır. Önce 3x2’lik bir matris bir yer tutucu (placeholder) değişken içinde tutulmaktadır. Aktif kısımda yer tutucu değişkenin ilk değerlerinin atanmasından sonra bir sözlük8feed_dict) ve bir NumPy dizisi kullanılarak matris çarpımı işlemi tamamlanmaktadır.

ÖRNEK:
MATRİS ÇARPIMINI YERTUTUCU (PLACEHOLDER) DEĞİŞKEN İLE GERÇEKLEŞTİRME

                       
import tensorflow as tf
import numpy as np

g = tf.Graph()
with g.as_default() as g:
MAT = tf.placeholder(dtype=tf.float32 ,shape=(3, 2))
CIKTI= tf.matmul(MAT, tf.transpose(MAT))
 
with tf.Session(graph=g) as sess:
sess.run(tf.global_variables_initializer())
NUMPY_DIZI = np.array([[5., 7.],
[13., -5.],

[2., 6.]])

feed_dict= {MAT: NUMPY_DIZI}
print(sess.run(CIKTI, feed_dict=feed_dict))
                      
                    

PROGRAMININ ÇIKTISI:

                       
[[  74.   30.   52.]
[  30.  194.   -4.]
[  52.   -4.   40.]]
                      
                    

Bu örnekte A matrisi ile A’nın transpozesi (evriği) çarpılmakta ve çarpım matrisi elde edilmektedir.

A=

A'

A*A’=

TENSORFLOW İLE K-MEANS ALGORİTMASI

Bu algoritmayı makine öğrenmesi bölümünde anlatmıştık. Basitçe tekrarlamak gerekirse bu algoritma elinizdeki bir veriyi, verinin sahip olduğu bazı özelliklere(attribute/feature) dayanarak k sayıda kümeye ya da gruba ayırma işlemini gerçekleştirir. Burada k, uygulamaya göre kullanıcının seçtiği küme sayısıdır ve k bir tamsayıdır. Algoritmanın esası her kümeye isabet eden verilerle o kümenin merkezi (centroid) arasındaki mesafelerin en aza indirilmesine (minimize edilmesi) dayanır. Böylece k-Means algoritması veriyi k adet kümeye ayıracaktır.

Aşağıda TensorFlow’da oluşturulmuş k-Means algoritmasının tam bir listesi yer almaktadır:

K-MEANS ALGORİTMASI

                       
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

sess = tf.InteractiveSession()
# parameters to tweak
num_VERI = 200
k =3

# VERI NOKTALARI (N, 2)
VERI = np.random.rand(num_VERI, 2)
NOKTALAR = tf.constant(VERI)

# RASGELE k ADET NOKTA SEC(k, 2)
MERKEZLER = tf.Variable(tf.random_shuffle(NOKTALAR)[:k, :])
#  MERKEZLER’DEN NOKTALARA UZAKLIKLARI HESAPLA NOKTALAR_e = tf.expand_dims(NOKTALAR, axis=0) # (1, N, 2) MERKEZLER_e = tf.expand_dims(MERKEZLER, axis=1) # (k, 1, 2)
UZAKLIKLAR = tf.reduce_sum((NOKTALAR_e - MERKEZLER_e) ** 2, axis=-1) # (k, N)
# HER NOKTANIN EN YAKIN MERKEZ İÇİN İNDİSİNİ BUL indices = tf.argmin(UZAKLIKLAR, axis=0) # (N,)
# k ADET KÜMEYİ OLUŞTUR
KUMELER = [tf.gather(NOKTALAR, tf.where(tf.equal(indices, i))) for i in range(k)]
# YENİ MERKEZLERİ HESAPLA
new_MERKEZLER = tf.concat([tf.reduce_mean(KUMELER[i], reduction_indices=[0]) for i in range(k)], axis=0)
# MERKEZLERI GUNCELLE assign = tf.assign(MERKEZLER, new_MERKEZLER)
sess.run(tf.global_variables_initializer())
for j in range(10):
KUMELER_val, MERKEZLER_val, _ = sess.run([KUMELER, MERKEZLER, assign])
fig = plt.figure()
for i in range(k):
        
if i==0:plt.scatter(KUMELER_val[i][:, 0, 0] ,KUMELER_val[i][:, 0, 1],color=”red”)
if i==1:plt.scatter(KUMELER_val[i][:, 0, 0] ,KUMELER_val[i][:, 0, 1],color=”blue”)
if i==2:plt.scatter(KUMELER_val[i][:, 0, 0] ,KUMELER_val[i][:, 0, 1],color=”green”)
plt.savefig(‘fig’ + str(j) + ‘.png’)
                      
                    

K-MEANS ALGORİTMASININ ÇIKTISI

                       
>> 
=============== RESTART: /Users/macuser/Documents/KMEANS.py ===============
>>>
                      
                    

Bu algoritma sadece kümeleme ile ilgili grafikler oluşturduğu için yazdıracağı bilgi yoktur. Program 200 adet veriyi k=3 adet kümeye ayrılmaktadır. Bu grafiklerin birinci ve onuncusu aşağıda verilmiştir:

Şekil D_12: k-Means algoritması. İlk grafik

Şekil D_12: k-Means algoritması. İlk grafik

Şekil D_13: k-Means algoritması - 10. grafik

Şekil D_13: k-Means algoritması—10. grafik

TENSORFLOW İLE LİNEER REGRESYON

Basit Lineer regresyon istatistiksel bir metottur ve iki değişken arasındaki bağıntıyı bulmayı hedefler. X ile göstereceğimiz bir değişken bağımsız (independent), açıklayıcı (explanatory) ya da belirleyici (predictor) değişken adını alır. y ile göstereceğimiz diğer değişken ise cevap (response), çıkış (outcome) ya da bağımlı (dependent) değişken adını alır. Makine öğrenmesi bölümünde bu konuyu ayrıntılı olarak anlattığımız için burada detaylara girmeyeceğiz. Konuyla ilgili Tensorflow kodu ve sonucu aşağıdadır;

TENSORFLOW’da LİNEER REGRESYON

                       
from __future__ import print_function
import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
rng = numpy.random

# PARAMETRELER
learning_rate = 0.015
training_EDs = 1200
display_step = 40
# EGITIM VERISI
EGIT_X = numpy.asarray([3.5,3.4,5.2,6.8,6.7,4.18,9.766,6.175,7.45,2.157,
7.035,10.688,5.299,7.888,5.67,9.199,3.09])
EGIT_Y = numpy.asarray([1.8,2.73,2.12,3.178,1.709,1.584,3.345,2.601,2.57,1.198,
2.942,3.389,1.72,2.899,2.55,2.87,1.299])
ORNEK_n = EGIT_X.shape[0]
# tf GRAF GİRİŞİ
X = tf.placeholder(“float”)
Y = tf.placeholder(“float”)
# MODEL AGIRLIKLARI
W = tf.Variable(rng.randn(), name=”weight”)
b = tf.Variable(rng.randn(), name=”bias”)
# LINEER MODEL OLUTUR
KESTIRIM = tf.add(tf.multiply(X, W), b)
# ORTALAMA KARESEL HATA
MALIYET = tf.reduce_sum(tf.pow(KESTIRIM-Y, 2))/(2*ORNEK_n)
# GRADIENT DESCENT
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(MALIYET)
# DEGISKENLERE ILK DEGER ATA
init = tf.global_variables_initializer()
# EGITIMI BASLAT
with tf.Session() as sess:
# ILK DEGER ATAMAYI BAŞLAT
sess.run(init)
# BUTUN EGITIM VERISINI UYDUR
for ED in range(training_EDs):
for (x, y) in zip(EGIT_X, EGIT_Y):
sess.run(optimizer, feed_dict={X: x, Y: y})
        
if (ED+1) % display_step == 0:
c = sess.run(MALIYET, feed_dict={X: EGIT_X, Y:EGIT_Y})
print(“ED:”, ‘%04d’ % (ED+1), “MALIYET=”, “{:.9f}”.format©, \
“W=”, sess.run(W), “b=”, sess.run(b))
print(“OPTIMIZASYON SONA ERDI”)
EGITIM_MALIYET = sess.run(MALIYET, feed_dict={X: EGIT_X, Y: EGIT_Y})
print(“Training MALIYET=”, EGITIM_MALIYET, “W=”, sess.run(W), “b=”, sess.run(b), ‘\n’)
# GRAFIKSEL GOSTERIM plt.plot(EGIT_X, EGIT_Y, ‘ro’, label=’ORIJINAL VERI’) plt.plot(EGIT_X, sess.run(W) * EGIT_X + sess.run(b), label=’UYDURULMUS DOGRU’)
plt.legend()
plt.show()

# TEST
test_X = numpy.asarray([6.85, 4.701, 8.89, 7.92, 5.69, 8.67, 3.12, 2.111])
test_Y = numpy.asarray([1.832, 2.269, 3.23, 2.832, 2.89, 3.26, 1.29, 1.009])
print(“TEST ORTALAMA KARELER MUKAYESESİ”)
testing_MALIYET = sess.run(
tf.reduce_sum(tf.pow(KESTIRIM - Y, 2)) / (2 * test_X.shape[0]),
feed_dict={X: test_X, Y: test_Y})  
print(“TEST MALIYET=”, testing_MALIYET)
print(“MUTLAK ORTALAMA KARELER FARKI:”, abs(
EGITIM_MALIYET - testing_MALIYET))
plt.plot(test_X, test_Y, ‘ro’, label=’TEST VERİSİ’)
plt.plot(EGIT_X, sess.run(W) * EGIT_X + sess.run(b), label=’UYDURULMUS DOGRU’)
plt.legend()
plt.show()
                      
                    

PROGRAMININ ÇIKTISI

                       
ED: 0040 MALIYET= 0.085715994 W= 0.22989 b= 0.961057
ED: 0080 MALIYET= 0.085714094 W= 0.230028 b= 0.960072
ED: 0120 MALIYET= 0.085712433 W= 0.230154 b= 0.959163
ED: 0160 MALIYET= 0.085710995 W= 0.230272 b= 0.95832
ED: 0200 MALIYET= 0.085709743 W= 0.230381 b= 0.957538
ED: 0240 MALIYET= 0.085708633 W= 0.230482 b= 0.956814
ED: 0280 MALIYET= 0.085707679 W= 0.230575 b= 0.956145
ED: 0320 MALIYET= 0.085706882 W= 0.230661 b= 0.955527
ED: 0360 MALIYET= 0.085706145 W= 0.230741 b= 0.954954
ED: 0400 MALIYET= 0.085705511 W= 0.230815 b= 0.954423
ED: 0440 MALIYET= 0.085704960 W= 0.230884 b= 0.953931
ED: 0480 MALIYET= 0.085704476 W= 0.230947 b= 0.953477
ED: 0520 MALIYET= 0.085704058 W= 0.231006 b= 0.953057
ED: 0560 MALIYET= 0.085703678 W= 0.23106 b= 0.952668
ED: 0600 MALIYET= 0.085703366 W= 0.23111 b= 0.952306
ED: 0640 MALIYET= 0.085703082 W= 0.231157 b= 0.951971
ED: 0680 MALIYET= 0.085702829 W= 0.2312 b= 0.951662
ED: 0720 MALIYET= 0.085702598 W= 0.23124 b= 0.951374
ED: 0760 MALIYET= 0.085702397 W= 0.231277 b= 0.951108
ED: 0800 MALIYET= 0.085702226 W= 0.231312 b= 0.95086
ED: 0840 MALIYET= 0.085702077 W= 0.231344 b= 0.950632
ED: 0880 MALIYET= 0.085701928 W= 0.231373 b= 0.950421
ED: 0920 MALIYET= 0.085701831 W= 0.2314 b= 0.950226
ED: 0960 MALIYET= 0.085701704 W= 0.231425 b= 0.950048
ED: 1000 MALIYET= 0.085701622 W= 0.231448 b= 0.949883
ED: 1040 MALIYET= 0.085701525 W= 0.23147 b= 0.949728
ED: 1080 MALIYET= 0.085701451 W= 0.23149 b= 0.949586
ED: 1120 MALIYET= 0.085701384 W= 0.231508 b= 0.949455
ED: 1160 MALIYET= 0.085701324 W= 0.231525 b= 0.949335
ED: 1200 MALIYET= 0.085701272 W= 0.231541 b= 0.949221
OPTIMIZASYON SONA ERDI
Training MALIYET= 0.0857013 W= 0.231541 b= 0.949221 
TEST ORTALAMA KARELER MUKAYESESİ
TEST MALIYET= 0.0881348
MUTLAK ORTALAMA KARELER FARKI: 0.00243354
                      
                    

Sonuçta çizilen ver ve regresyon grafiği de Şekil D_14’tedir.

Şekil D_14: Lineer Regresyon Grafiği

Şekil D_14: Lineer Regresyon Grafiği

SWIFT İLE YAPAY ZEKA YAZILIMLARI

Swift AI (Artificial Intelligence - Yapay Zekâ) paketi yüksek performanslı bir derin öğrenme kütüphanesidir ve tamamen Swift dili kullanılarak yazılmıştır. Şu anda sadece Apple platformlarında çalışmaktadır, ancak yakın süre içinde Linux desteği de gelecektir.

SWIFT AI PAKETİNİN SAHİP OLDUĞU ARAÇLAR

Swift AI paketi bütün yapay zekâ ve bilimsel uygulamalara ait ortak araçların bir koleksiyonunu içermektedir. Belli başlı araçlar aşağıda verilmiştir:

HTMLDirect-Neuralnet: Tam bağlantılı esnek bir yapay sinir ağı yazılımıdır; derin öğrenme desteği de vermektedir. Özellikle Apple donanımı için optimize edilmiştir ve ileri paralel programlama teknikleri kullanmaktadır.

Ayrıca Convolutional Neural Network, Recurrent Neural Network gibi araçlara da sahiptir. Bunun yanında Swift AI paketleri içinde Genetik Algoritma Kütüphanesi, Hızlı Lineer Cebir kütüphanesi ve Sinyal işleme kütüphanesi gibi kütüphaneler de bulunmaktadır.

GERÇEKLEŞTİRİLEN PROJELER

  • NeuralNet-MNIST—MNIST el yazısı veri tabanını NeuralNet ile eğitme projesidir. Yapay sinir ağı el yazılarını tanıyacak biçimde eğitilmektedir. MacOs ve iOS sürümleri mevcuttur.

GOOGLE CLOUD MACHINE LEARNING PLATFORMU

2016 yılında Google işletmelere kendi bulut platformunda makine öğrenmesi modelleri geliştirme imkânını sundu. TechRepublic’in gayet ayrıntılı rehberi bu mekanizmanın nasıl çalıştığını ve hangi amaçla oluşturulduğunu açıklamaktadır.

Google Bulut Makine Öğrenmesi Motoru Nedir?

İşletmelere kendi verilerini daha iyi anlamak ve bu verileri kullanarak tahminler yapmak amacıyla makine öğrenmesi modelleri oluşturma imkânı sağlayan bir araçtır.

Google Bulut Makine Öğrenmesi Motoru Neden Önemlidir?

Makine öğrenmesi modelleri son yıllarda önemli derecede ilgi çekmiş ve fayda sağlamıştır. Çünkü bu modellerle büyük miktarlarda veri, ileri bir hesaplama gücü ile işlenebilmektedir. Ayrıca, Internet of Things (IoT) ve diğer araçların yaygınlığı sonucu bu konuda büyük önem kazanmıştır.

Google Bulut Makine Öğrenme Motoru ne zaman kullanılabilir?

Eylül 2016 tarihinden itibaren kullanıma açılmıştır. Google Bulut Makine Öğrenme aracının deneme kullanımı herkes için ücretsizdir. Bunun için https://console.cloud.google.com/home/ adresine bakabilirsiniz. Ayrıca Special report: How to implement AI and machine learning (free PDF) (TechRepublic) linki de işletmelerde yapay zekâ(AI) uygulamaları konusunda faydalı olabilecek bir dokümandır.

Aşağıda Şekil GP_1, 2, 3 ve 4’te Google Bulut Makine Öğrenmesi sayfasının ekran görüntüleri mevcuttur:

Şekil GP_1: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_1: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_2: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_2: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_3: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_3: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_4: Google Bulut Makine Öğrenmesi ortamı

Şekil GP_4: Google Bulut Makine Öğrenmesi ortamı

Referanslar

  1. 1. Machine Learning with SVM and other Kernel Methods
    Yayınevi: EnterEconomyEdition
    Yazarlar: K.P.Soman,R.Loganathan,V.Ajay

  2. 2. Machine Learning for Hackers
    Yayınevi: O’reilly
    Yazarlar: Drew Conway,John Myles White

  3. 3. Machine Learning with R
    Yayınevi: PACKT
    Yazarlar: Brett Lantz

  4. 4. Automated Data Collection with R-A Practical Guide to Web Scraping and Text Mining
    Yayınevi: Wiley
    Yazarlar: Simon Munzert,Christian Rubba,Peter Meissner,Dominic Nyhuis

  5. 5. Large Scale and Big data
    Yayınevi: CRC Press
    Yazarlar: Sherif Sakr,Mohamed Medhat Gaber

  6. 6. Artificial Intelligence
    Yayınevi: Pearson
    Yazarlar: Stuart J.Russel,Peter Norvig

  7. 7. TensorFlow Machine Learning—Cookbook
    Yayınevi: Packt
    Yazarlar: Nick McClure

  8. 8. Big Data Analytics with R and Hadoop
    Yayınevi: Packt
    Yazarlar: Vignesh Prajapati

  9. 9. Social Media Mining with R
    Yayınevi: Packt
    Yazar: Nathan Danneman,Richard Heimann

  10. 10. Data Analysis,Classification,and Related Methods
    Yayınevi: Springer
    Yazar: H.A.L.Kiers,J.P.Rasson,P.J.F.Groenen,M.Schader

  11. 11. R Deep Learning Essentials
    Yayınevi: Packt
    Yazar: Joshua F.Wiley

  12. 12. Java deep Learning Essentials
    Yayınevi: Packt
    Yazar: Yusuke Sugomori

  13. 13. Deep Learning
    Yayınevi: O’Reilly
    Yazar: Josh Patterson,Adam Gibson

  14. 14. Deep Learning Made easy with R
    Yayınevi: AusCov
    Yazar: N.D.Lewis

  15. 15. Recommender Systems
    Yayınevi:Cambridge
    Yazar:Dietmar Jannah,Markus Zanker,Alexander Felfernig,Gerhard Friedrich

  16. 16. Innovative Computational Intelligence:A Rough Guide to 134 Clever Algorithms
    Yayınevi: Springer
    Yazar: Bo Xing,Wen Jing Gao

  17. 17. https://www.computerworld.com/article/2906336/emerging-technology/what-is-artificial-intelligence.html

  18. 18. https://www.toptal.com/machine-learning/machine-learning-theory-an-introductory-primer

  19. 19. https://www.analyticsvidhya.com/blog/2015/06/machine-learning-basics/

  20. 20. https://machinelearningmastery.com/machine-learning-in-python-step-by-step/

  21. 21. https://www.tensorflow.org/tutorials/

  22. 22. https://cs224d.stanford.edu/lectures/CS224d-Lecture7.pdf

  23. 23. https://tensorflow.rstudio.com/

  24. 24. https://www.edureka.co/blog/videos/deep-learning-tutorial/

  25. 25. http://cs.tsu.edu/ghemri/CS497/ClassNotes/ML/LazyLearningkNN.pdf

  26. 26. https://www-users.cs.umn.edu/~kumar001/dmbook/ch8.pdf

top-btn