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.
¿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); } } |
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