1.3.11

KNN Algoritması C# Kodları

KNN algoritması ile iki vektörün arasındaki benzerlik oranını bulan fonksiyon aşağıdadır.

Burada  KNN algoritması ile ilgili bilgi ve formül vardır. Aşağıdaki kodlar formülün koda dökülmüş halidir. C# ile yazılmışlardır.

Aşağıdaki fonksiyon iki vektörü karşılaştırır, siz bu fonksiyonu bir for döngüsü içinde kullanarak birden fazla vektörü de karşılaştırabilirsiniz, elde edeceğiniz benzerlik oranlarından en yükseği size en benzer iki vektörün hangisi olacağını verecektir.

Umarım faydalı olur..

 
   class KNN
    {
 
        public float knnBenzerlikHes(float[] gelenMailVectoru, float[] q)
        {
            float benzerlikOranı = 0;
            float toplamUst = 0, toplamAlt1 = 0, toplamAlt2 = 0;
 
            for (int i = 0; i < gelenMailVectoru.Length; i++)
            {
                toplamUst += float.Parse(gelenMailVectoru[i].ToString()) * float.Parse(q[i].ToString());
 
                toplamAlt1 += float.Parse(gelenMailVectoru[i].ToString()) * float.Parse(gelenMailVectoru[i].ToString());
 
                toplamAlt2 += float.Parse(q[i].ToString()) * float.Parse(q[i].ToString());
            }
 
            benzerlikOranı = toplamUst / (float)(Math.Sqrt(toplamAlt1) * Math.Sqrt(toplamAlt2));
 
            return benzerlikOranı; //0 ile 1 arasında bir değer döner. 1'e ne kadar yakınsa benzerlik o kadar fazladır.
 
 
        }
 
    }

10 yorum:

  1. Bir veri setim var, yukarıdaki kodları nasıl kullanacağım diyorsanız kısaca açıklayayım, veri setinizdeki her bir satır ile sınıflandırmak istediğiniz verinizi yukarıdaki fonksiyonu kullanarak sınıflandırıyorsunuz, bit ağırlıklandırma yöntemi kullandıysanız benzerlik oranı değeri 0 ile 1 arasında bir değer dönder, diğer yöntemleri kullandıysanız daha farklı değerler döner. Veri setinizdeki her bir kayıt için ya da başka bir değişle satır için yukarıdaki fonksiyonu çalıştırıyorsunuz ve benzerlik değerlerini elde ediyorsunuz, bu benzerlik değerinin büyük olduğu kayıtlar benzer kayıtlardır. Örneğin k değerini 3 olarak belirlemişseniz gelen değerlerden en büyük 3 tanesini alırsınız, bunların sınıflarına bakarsınız, örneğin iki tane B sınıfı bir tane A sınıfı gelmiş olsun, siz buradan hareketle gelen veriniz(sınıflandırmak istediğiniz veri) A sınıfıdır dersiniz. Ya da k=1 seçersiniz, elde ettiğiniz benzerlik oranlarından en yüksek değerli benzerlik oranı hangi kayda aitse sınıflandırmak istediğiniz veri o sınıfa aittir. Umarım açıklayıcı olmuştur. K-nn mantığı çok çok basit olan bir algoritmadır, çok basit matematiksel işlemleri kullanır. Farklı k değerleri ile algoritmanızın-uygulamanızın nasıl performans sergilediğini ölçebilirsiniz. Sınıfını bildiğiniz verileri sınıflandırma algoritmanıza sokarak algoritmanın başarı oranını ölçebilirsiniz. Gerçekten sonuçları görmek ve analiz etmek zevklidir, tavsiye ederim. Umarım faydalı olmuştur.

    YanıtlaSil
    Yanıtlar
    1. Bu yorum yazar tarafından silindi.

      Sil
    2. Merhaba, veri setimizde float veri tipi dışında değerler varsa nasıl uyarlama yapabiliriz bu algoritmayı? Benim veri setimde mantarlara ait renk(integer) ve en boy oranı(double) var.

      Sil
  2. gelenMailVectoru dediğiniz tam olarak nedir ?

    YanıtlaSil
  3. sınıflandıracağımız veridir.

    uygulamamızda biz maillleri sınıflandırdığımız için ismini kodda gelenMailVectoru koyduk.

    YanıtlaSil
  4. Merhabalar ! Ben şunu sormak istedim : Bu algoritma bir öğrenme algoritması mı yoksa karşılaştırma yani tespit etme algoritması mı ?

    YanıtlaSil
    Yanıtlar
    1. Kavram karmaşası yaşamamak için bildiğim kadarıyla şu şekilde izah etmeye çalışayım:

      Bildiğiniz gibi bir eğitimli (eğitim veri seti) olan algoritmalar var bir de eğitimsiz (eğitim veri seti sokmaksızın) çalıştırılıp veriyi sınıflayan ya da bir başka değişle sınıfını tespit eden algoritmalar var.

      K-nn'de gelen verinin sınıflandırılması için önceden algoritmanın eğitilmesi lazım.

      Yanı sizin ifadelerinizde öğrenme algoritması kavramına denk geliyor. Ben bu kavramı kullanmıyorum genel olarak ama problem değil. K-nn de yine hangi sınıfa ait olduğunu tespit ediyoruz en nihayetinde, bunu da daha önceki veriler ile karşılaştırarak yapıyoruz.

      Bunun zıttı olan, yani eğitim kümesi olmadan sınıflandırma yapan algoritmalara bir örnek verecek olursak K-kümeleme algoritmasını verebiliriz. Burada verdiğimiz veriyi k adet kümeye ayırıyor, bunu da uzaysal olarak orta noktalarının tüm olasılıklarını hesaplayıp en uzak orta noktaların etrafında kümelenen verileri sınıflandırarak yapıyor. Bunda önceden verilmiş bir eğitim seti yok, bu da sizin ikinci bahsettiğiniz gruba giriyor ki buna genel olarak eğitimsiz- eğitim seti olmayan algoritmalar diyoruz.

      Kavram karmaşası olmaması için biraz uzun anlattım. Sizin terimlerinizle kısaca öğrenme de diyebiliriz. Benim bildiğim bu şekilde, yanlışım varsa okuyan arkadaşlardan düzeltmelerini istirham ederim.

      Allah'a emanet olun.

      Sil
  5. merhabalar , anlamamız için örnek bir veri dizisiyle bu projeyi gönderir misiniz bana rıca etsem ?

    YanıtlaSil
  6. veriyi nasıl floata çevireceğiz
    .xls formatında bir veri setini nasıl fonnksiyona veririz.

    YanıtlaSil
  7. Ornek veri seti ile kodlari tekrar paylasnaniz mumkun mu ?

    YanıtlaSil

Related Posts Plugin for WordPress, Blogger...