Este artículo describe el algoritmo KNN implementado en Java. Compártelo para su referencia, como sigue:
Todos deben estar familiarizados con los algoritmos KNN, y son uno de los diez algoritmos clásicos principales para la minería de datos.
La idea del algoritmo es agrupar y clasificar datos desconocidos para la agrupación que se ha clasificado en el conjunto de datos de capacitación. Entre ellos, la distancia se calcula en función del punto desconocido y el punto en sus datos de entrenamiento, se calcula el punto con la distancia más corta y la categoría donde se clasifica en ese punto.
Echemos un vistazo a la ingeniería del algoritmo:
1. Prepare datos y preprocese los datos
2. Seleccione la estructura de datos apropiada para almacenar datos de capacitación y probar tuplas
3. Establezca parámetros, como K
4. Mantenga una cola prioritaria del tamaño K, de grande a pequeño, basado en la distancia, para almacenar tuplas de entrenamiento de vecinos más cercanos. Seleccione aleatoriamente K tuples de la tupla de entrenamiento como la tupla vecina más cercana inicial, calcule la distancia entre la tupla de prueba y estas k tuplas, y almacene la etiqueta de la tupla de entrenamiento y la distancia en la cola de prioridad.
5. iterar a través del conjunto de tupla de entrenamiento, calcule la distancia entre la tupla de entrenamiento actual y la tupla de prueba, y divida la distancia resultante l a la distancia máxima Lmax en la cola prioritaria.
6. Haz una comparación. Si l> = lmax, la tupla se descarta y la siguiente tupla se atraviesa. Si l <lmax, elimine la tupla con la distancia más grande en la cola de prioridad y almacene la tupla de entrenamiento actual en la cola de prioridad.
7. Después de completar el recorrido, calcule la mayoría de las K tuplas en la cola de prioridad y úselas como la categoría de la tupla de prueba.
8. Después de probar el conjunto de la tupla de prueba, calcule la tasa de error, continúe estableciendo diferentes valores de K y se vuelva a entrenar, y finalmente obtenga el valor K con la tasa de error más pequeña.
Según el proceso de algoritmo, implementamos el lenguaje Java:
paquete knn;/** * coordenadas de los puntos x e y * @author administrador * */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.y =;} pública PointBean (intent IT) súper(); this.x = x; this.y = y;} public PointBean () {super ();}@overridePublic string toString () {return "PointBean [x =" + x + ", y =" + y + "]";}}Algoritmo KNN
paquete knn; import java.util.arrayList;/** * Métodos de implementación KNN * @author administrador * */public class knnmain {public doble getPointLength (ArrayList <PointBean> List, PointBean BB) {int b_x = bb.getx (); int b_y = bb.gety (); doble 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 ()); // Encuentre la distancia mínima para (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 ()*(b_y -list.get (i) .gety ()))) temp = (b_x -list.get (i) .getx ())*(b_x -list.get (i) .gety ()); }} return math.sqrt (temp); } /** * Get the length and find the smallest one for classification* @param list1 * @param list2 * @param list3 * @param bb */ public void getContent(ArrayList<PointBean> list1,ArrayList<PointBean> list2, ArrayList<PointBean> list3,PointBean bb){ double A=getPointLength(list1,bb); doble b = getPointLength (list2, bb); doble c = getPointLength (list3, bb); // Haga una comparación if (a> b) {if (b> c) {system.out.println ("este punto:"+bb.getx ()+","+bb.gety ()+""+"pertenece a c"); } else {system.out.println ("este punto:"+bb.getx ()+","+bb.gety ()+""+"pertenece a b"); }} else {if (a> c) {system.out.println ("este punto:"+bb.getx ()+","+bb.gety ()+""+"pertenece a c"); } else {if (a> c) {system.out.println ("este punto:"+bb.getx ()+","+bb.gety ()+""+"pertenece a c"); } else {system.out.println ("este punto:"+bb.getx ()+","+bb.gety ()+""+"pertenece a A"); }}}}Función principal
paquete knn; import java.util.ArrayList;/ * * función principal KNN */public class testJava {static arrayList <PointBean> lista; static ArrayList <PointBean> listB; static ArrayList <PointBean> listC; static 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> (); // escribir datos setDate (); getTestResult (); } /*** Obtenga el resultado* /private static void getTestResult () {// crea un objeto knnmain km = new knnmain (); for (int i = 0; i <listd.size (); i ++) {km.getContent (listA, listb, listc, listd.get (i)); }} /*** Escribir datos* /private static void setDate () {// A's Coordinate Point int a_x [] = {1,1,2,2,1}; int a_y [] = {0,1,1,0,2}; // B's Coordinate Point int b_x [] = {2,3,3,3,4}; int b_y [] = {4,4,3,2,3}; // Co de coordenadas de C int c_x [] = {4,5,5,6,6}; int c_y [] = {1,2,0,2,1}; // Probar datos // bo de coordenadas de B int d_x [] = {3,3,3,0,5}; int d_y [] = {0,1,5,0,1}; // Pointbean BA; para (int i = 0; i <5; i ++) {ba = new PointBean (a_x [i], a_y [i]); Lista.Add (BA); } // PointBean BB; para (int i = 0; i <5; i ++) {bb = new PointBean (b_x [i], b_y [i]); listb.add (bb); } // PointBean BC; for (int i = 0; i <5; i ++) {bc = new PointBean (c_x [i], c_y [i]); listC.Add (BC); } // PointBean BD; para (int i = 0; i <5; i ++) {bd = new PointBean (d_x [i], d_y [i]); listd.add (bd); }}}Resultados de la prueba:
Este punto: 3, 1 pertenece a un
Este punto: 3, 5 pertenece a B
Este punto: 0, 0 pertenece a un
Este punto: 5, 1 pertenece a C
En este punto, el simple algoritmo KNN ha implementado la División de Puntos Desconocidos, lo que ayudará a todos a comprender el algoritmo KNN. Algunos algoritmos que mejoran KNN se publicarán más tarde. ¡Aprender y avanzar juntos!
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.