Merhaba;
Bu yazımızda sınıflandırma tekniğinde kullanılmakta olan En Yakın Komşu(KNN / k nearest neighbors) algoritmasından bahsedeceğiz. Anlatımın açık olması adına sınıf niteliği belli olmayan değerlere örnek, sınıf niteliği belli olan değerlerden bahsederken eleman diyeceğim.
Knn algoritması; (sınıf niteliği belli olan) elemanların meydana getirdiği uzaya yeni bir örnek (sınıf niteliği belli olmayan) eklendiğinde bu örneğin kendisine en yakın olan sınıfa dahil edilmesi gerektiğini kararlaştıran bir algoritmadır. Kendisine en yakın olan sınıfı belirlemek için bir k değişkeni kullanmaktadır. Belirlenen bu k değişkeni örneğe en yakın olan k adet (sınıf nitelikleri belli olan) elemanların sayısını temsil etmektedir. Örnek ile, elemanlar arasındaki mesafe hesaplanırken yaygın olarak aşağıdaki 3 uzaklık fonksiyonu kullanılmaktadır.
Öklid fonksiyonu ilk okul veya liseden beri aşina olduğumuz bir fonksiyon. Aslında gözünüzü korkmasın hepsi tek bir ana fonksiyondan türetilmektedir. Minkowski fonksiyonundaki q=1 değeri için manhattan uzaklığı; q=2 değeri için öklid uzaklık formulünü elde ediyoruz. Bu sebeple minkowski genel formulunu kullanarak uygulamamızı yapacağız. Böylece kişi diğer uzaklık ölçümleri için sadece q değerini değiştirecektir.
Algoritmayı birkaç madde ile özetlersek;
Bu yazımızda sınıflandırma tekniğinde kullanılmakta olan En Yakın Komşu(KNN / k nearest neighbors) algoritmasından bahsedeceğiz. Anlatımın açık olması adına sınıf niteliği belli olmayan değerlere örnek, sınıf niteliği belli olan değerlerden bahsederken eleman diyeceğim.
Knn algoritması; (sınıf niteliği belli olan) elemanların meydana getirdiği uzaya yeni bir örnek (sınıf niteliği belli olmayan) eklendiğinde bu örneğin kendisine en yakın olan sınıfa dahil edilmesi gerektiğini kararlaştıran bir algoritmadır. Kendisine en yakın olan sınıfı belirlemek için bir k değişkeni kullanmaktadır. Belirlenen bu k değişkeni örneğe en yakın olan k adet (sınıf nitelikleri belli olan) elemanların sayısını temsil etmektedir. Örnek ile, elemanlar arasındaki mesafe hesaplanırken yaygın olarak aşağıdaki 3 uzaklık fonksiyonu kullanılmaktadır.
Öklid fonksiyonu ilk okul veya liseden beri aşina olduğumuz bir fonksiyon. Aslında gözünüzü korkmasın hepsi tek bir ana fonksiyondan türetilmektedir. Minkowski fonksiyonundaki q=1 değeri için manhattan uzaklığı; q=2 değeri için öklid uzaklık formulünü elde ediyoruz. Bu sebeple minkowski genel formulunu kullanarak uygulamamızı yapacağız. Böylece kişi diğer uzaklık ölçümleri için sadece q değerini değiştirecektir.
Algoritmayı birkaç madde ile özetlersek;
- Sınıf nitelikleri belli olan elemanlardan oluşan bir uzaya yeni bir örnek ekle.
- K sayısını belirle.
- Yeni gelen örnek ile elemanlar arasındaki uzaklığı hesapla.(Uzaklık fonksiyonlardan birini kullanarak)
- En yakın olan k tane elemanın sınıf niteliğine bak.
- En yakın olan k tane elemanlardan sınıf değeri sayıca fazla olan sınıfa örneği dahil et.
#!python3 #50859 (Sınıf sınırımız) # Grafik için gerekli kütüphaneler. Axes3D 3 boyutlu bir grafik için. from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D class knn(): # başlangıç fonksiyonumuz ve değişkenlerimiz. inp değişkenimiz sınıf niteliği # belli olmayan örneğimizdir. Siz isterseniz bu değeri dışardan da alabilirsiniz. # __init__ metodundaki dataset veri setimizi, k en yakın k komşuyu, nfrom veri # setini okumaya başlanacağı satır ve nto ise kaçıncı satıra kadar okuyacağını # belirtir. Son iki parametre çok büyük veri setlerini çözümlerken pc'ler yeter # siz kaldığından isteğe bağlı olarak sadece veri setinin belli bir kısmını # seçmek için ekledim. Ki bu örneğimizde öyle bir örnek. def __init__(self, dataset, k, nfrom, nto): self.b, self.g, self.r, self.class_attr = [], [], [], [] self.inp = [264,124,183] self.k = k # Veri setimizi nfrom satırından nto satırına kadar okuyoruz. # Ayrıca veri setindeki her sutunu bir listeye atıyoruz. (r,g,b,class_attr) with open(dataset, "r") as f: for i in f.readlines()[nfrom:nto]: self.r.append(int(i.split()[0])) self.g.append(int(i.split()[1])) self.b.append(int(i.split()[2])) self.class_attr.append(i.split()[3]) # Uzaklık hesaplamamızı yaptığımız metodumuz. dist parametresine göre # ilgili hesaplanma yapılmaktadır. Default oklid uzaklığı kullanılmaktadır. # Burda dikkat edilmesi gerekilen en önemli nokta; uzaklık değeri hesaplandıktan # sonra hangi uzaklığın başta hangi index numarasına sahip olduğunu bilmeyiz. # Çünkü bu indis numarasını kullanarak ilgili uzaklığın sınıf değerine ulaşacağız. # Bu sebeple uzaklığı ve uzaklığın indis değerini demet şeklinde # dist listemize ekliyoruz.Çünkü uzaklığı küçükten büyüğe sıraladığımızda # uzaklığa ait gerçek sınıf değerine ulaşamamaktayız. # # öklid = 2, manhattan=1 def distance(self, dist=1): self.dist = [] # for döngüsündeki karışık gibi gelen üs alma, mutlak değer gibi işlemler # minkowski formulunun karşılığından ibarettir. for i in range(len(self.class_attr)): self.dist.append((pow((pow(( abs(int(self.b[i]) - int(self.inp[0])) + abs(int(self.g[i]) - int(self.inp[1])) + abs(int(self.r[i]) - int(self.inp[2]))), dist)), 1/dist), i)) return self.dist # uzaklık hesaplanması yapıldıktan sonra örneğimize en yakın olan k tane # elemanı buluyoruz ve bu elemanların sınıf değerlerini class_values # listemizde tutuyoruz. Ve döngünün sununda class_values listesindeki 1(cilt) # 2(cilt değil) sayılarını hesaplayıp, örneğin hangi sınıfa ait olduğunu # buluyoruz. def findClass(self): self.class_values = [] self.result = "" for i in sorted(self.dist)[:self.k]: self.class_values.append(self.class_attr[i[1]]) self.first = self.class_values.count("1") self.secnd = self.class_values.count("2") print("Birinci Sınıf:", self.first) print("İkinci Sınıf:", self.secnd) if self.first > self.secnd: self.result = "1. Sınıf(Kırmızı)" else: self.result = "2. Sınıf(Yeşil)" print("SONUÇ: "+self.result) #GORSELLEŞTİRME # Algoritmanın daha somut bir şekilde anlaşılması adına 3 boyutlu uzayda # grafiğini oluşturdur. Kırmızı noktalar cilt, yeşil noktalar cilt olmayan # ve mavi nokta ise sınıf değerin belli olmayan örneğimiz. def grafik(self): fig = plt.figure() ax = fig.add_subplot(111, projection='3d') for bi, gj, rk, class_attr in zip(self.b, self.g, self.r, self.class_attr): if class_attr == "1": ax.scatter(bi,gj,rk, c='r', marker='.') else: ax.scatter(bi,gj,rk, c='g', marker='.') ax.scatter(int(self.inp[0]), int(self.inp[1]), int(self.inp[2]), c='b') ax.set_xlabel('X Ekseni') ax.set_ylabel('Y Ekseni') ax.set_zlabel('Z Ekseni') fig.text(0, 0, "Kırmızı(1)[Cilt] : "+str(self.first)+ " -- Yeşil(2)[Cilt Değil] : "+str(self.secnd)+ " -- {{SONUÇ : "+self.result+"}}") plt.legend() plt.show() # Sınıfımızdan nesne türetip gerekli metodlarımızı çağırıyoruz. En yakın 17 komşuya bakıyoruz. Ola ki eşit çıkma durumu olduğundan k değerinin tek seçilmesinde yarar vardır. Ve sonuç. ins = knn("ten_dataset.txt", 17, 50300, 51000) ins.distance(1) ins.findClass() ins.grafik()Uygulamamızın 3 boyutlu uzaydaki görünümü aşağıdaki gibidir. Mavi nokta örneğimiz(sınıfı belli olmayan), kırmızı noktalar cilt(sima) sınıfını, yeşil noktalar ise cilt olmayan sınıfı temsil etmektedir. Grafikte açık bir şekilde göreceğiniz üzere; Örneğimiz, uygulamamız tarafından kendisine en yakın olan sınıfa dahil edilmiştir. Uygulamada kullandığımız kodlara şurdan erişebilirsiniz. Sağlıcakla kalınız.
Kod bolumunu cok kapalı anlatmıssınız.Anlamakta zorluk cekıyorum
YanıtlayınSilMerhabalar. Vermiş olduğunuz kodları Python (IDLE) 3.6.1 sürümünde çalıştırdığımda "multiple statements found while compiling a single statement" şeklinde bir hata mesajı dönüyor.
YanıtlayınSilBenzer şekilde Visual Studio üzerinden yeni Python projesi oluşturup projenin içine knn isimli bir class ekleyip bu kodu yapıştırdığımda "Your project needs a Python script as the startup file to perform this operation." şeklinde bir hata alıyorum.
Açıkçası, nerede eksik ya da yanlış bir şey yaptığımı anlamış değilim. Yardımcı olabilirseniz sevinirim. Teşekkürler.
başarılı bir anlatım olmuş teşekkürler.
YanıtlayınSilBu yorum yazar tarafından kaldırıldı.
YanıtlayınSilThanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative. I can't wait to read lots of your posts.ExcelR AI Training in Bangalore
YanıtlayınSilThanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post with people..
YanıtlayınSilPMP Certification
PMP Certification in Malaysia
360DigiTMG PMP Course in Malaysia
I quite like reading an article that can make people think. Also, thanks for allowing for me to comment!
YanıtlayınSildata science course in malaysia
I am impressed by the information that you have on this blog. It shows how well you understand this subject.
YanıtlayınSildata analytics course
big data analytics malaysia
big data course
I need to communicate my deference of your composing aptitude and capacity to make perusers read from the earliest starting point as far as possible. I might want to peruse more up to date presents and on share my musings with you.https://360digitmg.com/course/project-management-professional-pmp
YanıtlayınSilinformative article...!
YanıtlayınSildata science course in noida
cool stuff you have and you keep redesign all of us
YanıtlayınSilHRDF training
I was looking at a portion of your posts on this site and I consider this site is really enlightening! Keep setting up..
YanıtlayınSildata analytics course malaysia
I'm glad to see the extensive unpretentious component here!.
YanıtlayınSilwhat is hrdf claimable
Thanks for your post. I’ve been thinking about writing a very comparable post over the last couple of weeks, I’ll probably keep it short and sweet and link to this instead if thats cool. Thanks.
YanıtlayınSildigital marketing courses in hyderabad with placements
"
YanıtlayınSilViably, the article is actually the best point on this library related issue. I fit in with your choices and will enthusiastically foresee your next updates.
"
https://360digitmg.com/hrdf-training
Here at this site actually the particular material assortment with the goal that everyone can appreciate a great deal.
YanıtlayınSilbig data course
Thank you for sharing the info with example best Gynaecologist in Hyderabad
YanıtlayınSilThrough this post, I realize that your great information in playing with all the pieces was exceptionally useful. I advise this is the primary spot where I discover issues I've been scanning for. You have a smart yet alluring method of composing.
YanıtlayınSilhttps://360digitmg.com/course/certification-program-on-digital-marketing
This Blog is very useful and informative.
YanıtlayınSildigital marketing courses
If you don"t mind proceed with this extraordinary work and I anticipate a greater amount of your magnificent blog entries
YanıtlayınSilDigital Marketing Training Institutes in Hyderabad
This post is extremely easy to peruse and acknowledge without forgetting about any subtleties. Incredible work!
YanıtlayınSildata scientist training
As always your articles do inspire me. Every single detail you have posted was great.
YanıtlayınSildigital marketing course
Thank you for always speaking up in team meetings and providing a unique perspective.
YanıtlayınSilhttps://360digitmg.com/course/certification-program-on-big-data-with-hadoop-spark
This post is very simple to read and appreciate without leaving any details out. Great work!
YanıtlayınSildata scientist course delhi
This is my first time visit here. From the tremendous measures of comments on your articles.I deduce I am not only one having all the fulfillment legitimately here!
YanıtlayınSildata science in malaysia
Nice article. I liked very much. All the information given by you are really helpful for my research. keep on posting your views.
YanıtlayınSildigital marketing courses in aurangabad
Wow, amazing post! Really engaging, thank you.
YanıtlayınSilmachine learning course in aurangabad