Categorías
Machine learning

Utilice el clasificador K-Neighbors (KNN) en Java

Caso de estudio

Imagen, tienes un blog que contiene muchos artículos interesantes. Coloca anuncios en la parte superior de cada artículo y espera obtener algunos ingresos. Después de un tiempo y de su informe, verá que algunas publicaciones generan ingresos y otras no. Asumir que si un artículo genera ingresos o no depende de la cantidad de imágenes y párrafos de texto que contiene.

Dado el conjunto de datos:

podemos trazarlos en la figura siguiente.

knn

¿Cómo funciona el algoritmo K-Neighbors Neighbours (KNN)?

Cuando se escribe un artículo nuevo, no tenemos sus datos del informe. Si queremos saber si el nuevo artículo puede generar ingresos, podemos 1) calcular las distancias entre el nuevo artículo y cada uno de los 6 artículos existentes, 2) ordenar las distancias en orden descendente, 3) obtener el voto mayoritario de k. Esta es la idea básica de KNN.

Ahora supongamos que un nuevo artículo, que contiene 13 imágenes y 1 párrafo, puede generar ingresos o no. Al visualizar este punto en la figura, podemos adivinar que generará ganancias. Pero lo haremos en Java.

Solución Java

Weka también proporciona kNN como una clase «IBk». IBk implementa kNN. Utiliza distancias normalizadas para todos los atributos, de modo que los atributos en diferentes escalas tengan el mismo impacto en la función de distancia. Puede devolver más de k vecinos si hay vínculos en la distancia. Los vecinos se votan para formar la clasificación final.

Primero prepare sus datos creando un archivo txt «ads.txt»:

@relation ads

@attribute pictures numeric
@attribute paragraphs numeric
@attribute profit {Y, N}

@data
10,2,Y
12,3,Y
9,2,Y
0,10,N
1,9,N
3,11,N

Código Java:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
 
import weka.classifiers.Classifier;
import weka.classifiers.lazy.IBk;
import weka.core.Instance;
import weka.core.Instances;
 
public class KNN {
	public static BufferedReader readDataFile(String filename) {
		BufferedReader inputReader = null;
 
		try {
			inputReader = new BufferedReader(new FileReader(filename));
		} catch (FileNotFoundException ex) {
			System.err.println("File not found: " + filename);
		}
 
		return inputReader;
	}
 
	public static void main(String[] args) throws Exception {
		BufferedReader datafile = readDataFile("ads.txt");
 
		Instances data = new Instances(datafile);
		data.setClassIndex(data.numAttributes() - 1);
 
		//do not use first and second
		Instance first = data.instance(0);
		Instance second = data.instance(1);
		data.delete(0);
		data.delete(1);
 
		Classifier ibk = new IBk();		
		ibk.buildClassifier(data);
 
		double class1 = ibk.classifyInstance(first);
		double class2 = ibk.classifyInstance(second);
 
		System.out.println("first: " + class1 + "nsecond: " + class2);
	}
}
  Agrupación en clústeres de K-medias en Java

Producción:

first: 0.0
second: 1.0

Referencias:
1. http://weka.sourceforge.net/doc.dev/weka/classifiers/lazy/IBk.html
2. http://www.cc.uah.es/drg/courses/datamining/IntroWeka.pdf

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *