تصف هذه المقالة خوارزمية KNN التي تم تنفيذها في Java. شاركه للرجوع إليه ، على النحو التالي:
يجب أن يكون الجميع على دراية بخوارزميات KNN ، وهي واحدة من أفضل عشر خوارزميات كلاسيكية لاستخراج البيانات.
تتمثل فكرة الخوارزمية في تجميع وتصنيف بيانات غير معروفة للتجميع التي تم تصنيفها في مجموعة بيانات التدريب. من بينها ، يتم حساب المسافة استنادًا إلى النقطة غير المعروفة والنقطة في بيانات التدريب الخاصة بها ، يتم حساب النقطة ذات أقصر مسافة ، والفئة التي يتم تصنيفها في تلك النقطة.
دعونا نلقي نظرة على هندسة الخوارزمية:
1. إعداد البيانات والمعالجة المسبقة للبيانات
2. حدد بنية البيانات المناسبة لتخزين بيانات التدريب واختبار tuples
3. تعيين المعلمات ، مثل K
4. الحفاظ على قائمة انتظار ذات أولوية بحجم K ، من كبير إلى صغير ، بناءً على المسافة ، لتخزين أقرب جوار تدريب. حدد بشكل عشوائي k tuples من tuple التدريب باعتباره أقرب جوار أولي ، وحساب المسافة بين اختبار tuple و tuples k ، وتخزين ملصق tuple التدريبي والمسافة في قائمة انتظار الأولوية.
5. التكرار من خلال مجموعة Tuple التدريبية ، وحساب المسافة بين Tuple التدريب الحالي واختبار tuple ، وقسم المسافة الناتجة L إلى الحد الأقصى LMAX في قائمة انتظار الأولوية.
6. قم بإجراء مقارنة. إذا كان l> = lmax ، يتم تجاهل tuple ويتم اجتياز tuple التالي. إذا كان l <lmax ، فقم بحذف tuple مع أكبر مسافة في قائمة انتظار الأولوية وتخزين tuple التدريب الحالي في قائمة انتظار الأولوية.
7. بعد اكتمال اجتياز ، احسب غالبية tuples k في قائمة انتظار الأولوية واستخدامها كفئة للاختبار.
8. بعد اختبار مجموعة tuple الاختبار ، قم بحساب معدل الخطأ ، واستمر في تعيين قيم K مختلفة وإعادة تدريب ، وأخيراً الحصول على قيمة K مع أصغر معدل خطأ.
وفقًا لعملية الخوارزمية ، ننفذ لغة جافا:
حزمة knn ؛/** * إحداثيات من النقاط x و y * Author Administrator * */public class pointbean {int x ؛ int y ؛ public int getx () {return x ؛} public void setx (int x) {this.x = x ؛} public int gety () {return y ؛} public void sety (int y) { ممتاز()؛ this.x = x ؛ this.y = y ؛} Public PointBean () {super () ؛}@outridepublic string toString () {return "pointbean [x =" + x + "، y =" + y + "] ؛}}خوارزمية KNN
حزمة knn ؛ استيراد java.util.arraylist ؛/** * أساليب تطبيق knn * Author Administrator * */public class Knnmain {public double getPointLength (ArrayList <PointBean> list ، pointbean bb) {int b_x = bb.getx () ؛ int b_y = bb.gety () ؛ double temp = (b_x -list.get (0) .getx ())*(b_x -list.get (0) .getx ())+ (b_y -list.get (0) .gety ())*(b_y -list.get (0) .gety ()) ؛ // ابحث عن المسافة الدنيا لـ (int i = 1 ؛ i <list.size () ؛ i ++) {if (temp <(b_x -list.get (i) .getx ())*(b_x -list.get (i) .getx ())+(b_y -list.get (i) .gety () -list.get (i) .getx ())*(b_x -list.get (i) .gety ()) ؛ }} return math.sqrt (temp) ؛ } / ** * احصل على الطول وابحث عن أصغر للتصنيف * param list1 * param list2 * param list3 * param bb * / public void getContent (ArrayList <PointBean> list1 ، arraylist <PointBean> list2 ، arraylist <PointBean> list3 ، pointbean bb) double b = getPointLength (list2 ، bb) ؛ Double C = GetPointLength (List3 ، BB) ؛ // قم بإجراء مقارنة إذا (a> b) {if (b> c) {system.out.println ("هذه النقطة:"+bb.getx ()+"،"+bb.gety ()+"+" ينتمي إلى c ") ؛ } آخر {system.out.println ("هذه النقطة:"+bb.getx ()+"،"+bb.gety ()+""+"ينتمي إلى B") ؛ }} else {if (a> c) {system.out.println ("هذه النقطة:"+bb.getx ()+"،"+bb.gety ()+"+" ينتمي إلى c ") ؛ } آخر {if (a> c) {system.out.println ("هذه النقطة:"+bb.getx ()+"،"+bb.gety ()+"+" ينتمي إلى c ") ؛ } آخر {system.out.println ("هذه النقطة:"+bb.getx ()+"،"+bb.gety ()+"+" ينتمي إلى ") ؛ }}}}الوظيفة الرئيسية
حزمة knn ؛ استيراد java.util.arraylist ؛/ * * الوظيفة الرئيسية knn */الفئة العامة testjava {static arraylist <PointBean> lista ؛ arraylist ثابت <PointBean> listb ؛ arraylist ثابت <PointBean> listc ؛ arraylist ثابت <PointBean> listd ؛ public static void main (string [] args) {// chuangjia arraylist lista = new ArrayList <PointBean> () ؛ listb = new ArrayList <PointBean> () ؛ listc = new ArrayList <PointBean> () ؛ listd = new ArrayList <PointBean> () ؛ // كتابة بيانات البيانات () ؛ getTestResult () ؛ } /*** احصل على النتيجة* /private static void getTestResult () {// إنشاء كائن knnmain km = new knnmain () ؛ لـ (int i = 0 ؛ i <listd.size () ؛ i ++) {km.getContent (lista ، listb ، listc ، listd.get (i)) ؛ }} /*** اكتب بيانات* /private static void setDate () {// a tostance point int a_x [] = {1،1،2،1،1} ؛ int a_y [] = {0،1،1،0،2} ؛ // B's Coversite Point int B_x [] = {2،3،3،3،4} ؛ int b_y [] = {4،4،3،2،3} ؛ // C's Coversite Point int C_x [] = {4،5،5،6،6} ؛ int c_y [] = {1،2،0،2،1} ؛ // اختبار البيانات // نقطة الإحداثيات B int d_x [] = {3،3،3،0،5} ؛ int d_y [] = {0،1،5،0،1} ؛ // pointbean ba ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {ba = new pointbean (a_x [i] ، a_y [i]) ؛ Lista.add (BA) ؛ } // pointbean bb ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {bb = new pointbean (b_x [i] ، b_y [i]) ؛ listb.add (bb) ؛ } // pointbean bc ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {bc = new pointbean (c_x [i] ، c_y [i]) ؛ ListC.Add (BC) ؛ } // pointbean bd ؛ لـ (int i = 0 ؛ i <5 ؛ i ++) {bd = new pointbean (d_x [i] ، d_y [i]) ؛ listd.add (BD) ؛ }}}نتائج الاختبار:
هذه النقطة: 3 ، 1 تنتمي إلى أ
هذه النقطة: 3 ، 5 تنتمي إلى ب
هذه النقطة: 0 ، 0 تنتمي إلى
هذه النقطة: 5 ، 1 تنتمي إلى ج
في هذه المرحلة ، نفذت خوارزمية KNN البسيطة تقسيم النقاط غير المعروفة ، والتي ستساعد الجميع على فهم خوارزمية KNN. سيتم نشر بعض الخوارزميات التي تحسن KNN لاحقًا. تعلم وجعل التقدم معا!
لمزيد من المعلومات حول خوارزميات Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "بنية بيانات Java وبرنامج تعليمي الخوارزمية" ، "ملخص" Tips Java ".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.