This example performs K-Nearest Neighbor analysis on Fisher's iris data. Three observations are withheld from the full data set and then classified by the iris type.
import com.imsl.stat.*;
public class ClusterKNNEx1 {
public static void main(String argv[]) {
double[][] x = {
{5.100, 3.500, 1.400, 0.200}, {4.900, 3.000, 1.400, 0.200},
{4.700, 3.200, 1.300, 0.200}, {4.600, 3.100, 1.500, 0.200},
{5.000, 3.600, 1.400, 0.200}, {5.400, 3.900, 1.700, 0.400},
{4.600, 3.400, 1.400, 0.300}, {5.000, 3.400, 1.500, 0.200},
{4.400, 2.900, 1.400, 0.200}, {4.900, 3.100, 1.500, 0.100},
{5.400, 3.700, 1.500, 0.200}, {4.800, 3.400, 1.600, 0.200},
{4.800, 3.000, 1.400, 0.100}, {4.300, 3.000, 1.100, 0.100},
{5.800, 4.000, 1.200, 0.200}, {5.700, 4.400, 1.500, 0.400},
// removed data. added to argument values for method classify
// { 5.400, 3.900, 1.300, 0.400},
{5.100, 3.500, 1.400, 0.300}, {5.700, 3.800, 1.700, 0.300},
{5.100, 3.800, 1.500, 0.300}, {5.400, 3.400, 1.700, 0.200},
{5.100, 3.700, 1.500, 0.400}, {4.600, 3.600, 1.000, 0.200},
{5.100, 3.300, 1.700, 0.500}, {4.800, 3.400, 1.900, 0.200},
{5.000, 3.000, 1.600, 0.200}, {5.000, 3.400, 1.600, 0.400},
{5.200, 3.500, 1.500, 0.200}, {5.200, 3.400, 1.400, 0.200},
{4.700, 3.200, 1.600, 0.200}, {4.800, 3.100, 1.600, 0.200},
{5.400, 3.400, 1.500, 0.400}, {5.200, 4.100, 1.500, 0.100},
{5.500, 4.200, 1.400, 0.200}, {4.900, 3.100, 1.500, 0.200},
{5.000, 3.200, 1.200, 0.200}, {5.500, 3.500, 1.300, 0.200},
{4.900, 3.600, 1.400, 0.100}, {4.400, 3.000, 1.300, 0.200},
{5.100, 3.400, 1.500, 0.200}, {5.000, 3.500, 1.300, 0.300},
{4.500, 2.300, 1.300, 0.300}, {4.400, 3.200, 1.300, 0.200},
{5.000, 3.500, 1.600, 0.600}, {5.100, 3.800, 1.900, 0.400},
{4.800, 3.000, 1.400, 0.300}, {5.100, 3.800, 1.600, 0.200},
{4.600, 3.200, 1.400, 0.200}, {5.300, 3.700, 1.500, 0.200},
{5.000, 3.300, 1.400, 0.200}, {7.000, 3.200, 4.700, 1.400},
{6.400, 3.200, 4.500, 1.500}, {6.900, 3.100, 4.900, 1.500},
{5.500, 2.300, 4.000, 1.300}, {6.500, 2.800, 4.600, 1.500},
{5.700, 2.800, 4.500, 1.300}, {6.300, 3.300, 4.700, 1.600},
{4.900, 2.400, 3.300, 1.000}, {6.600, 2.900, 4.600, 1.300},
{5.200, 2.700, 3.900, 1.400}, {5.000, 2.000, 3.500, 1.000},
{5.900, 3.000, 4.200, 1.500}, {6.000, 2.200, 4.000, 1.000},
{6.100, 2.900, 4.700, 1.400}, {5.600, 2.900, 3.600, 1.300},
{6.700, 3.100, 4.400, 1.400}, {5.600, 3.000, 4.500, 1.500},
{5.800, 2.700, 4.100, 1.000}, {6.200, 2.200, 4.500, 1.500},
{5.600, 2.500, 3.900, 1.100}, {5.900, 3.200, 4.800, 1.800},
{6.100, 2.800, 4.000, 1.300}, {6.300, 2.500, 4.900, 1.500},
{6.100, 2.800, 4.700, 1.200}, {6.400, 2.900, 4.300, 1.300},
{6.600, 3.000, 4.400, 1.400}, {6.800, 2.800, 4.800, 1.400},
{6.700, 3.000, 5.000, 1.700}, {6.000, 2.900, 4.500, 1.500},
// removed data. added to argument values for method classify
//{ 5.700, 2.600, 3.500, 1.000},
{5.500, 2.400, 3.800, 1.100}, {5.500, 2.400, 3.700, 1.000},
{5.800, 2.700, 3.900, 1.200}, {6.000, 2.700, 5.100, 1.600},
{5.400, 3.000, 4.500, 1.500}, {6.000, 3.400, 4.500, 1.600},
{6.700, 3.100, 4.700, 1.500}, {6.300, 2.300, 4.400, 1.300},
{5.600, 3.000, 4.100, 1.300}, {5.500, 2.500, 4.000, 1.300},
{5.500, 2.600, 4.400, 1.200}, {6.100, 3.000, 4.600, 1.400},
{5.800, 2.600, 4.000, 1.200}, {5.000, 2.300, 3.300, 1.000},
{5.600, 2.700, 4.200, 1.300}, {5.700, 3.000, 4.200, 1.200},
{5.700, 2.900, 4.200, 1.300}, {6.200, 2.900, 4.300, 1.300},
{5.100, 2.500, 3.000, 1.100}, {5.700, 2.800, 4.100, 1.300},
{6.300, 3.300, 6.000, 2.500}, {5.800, 2.700, 5.100, 1.900},
{7.100, 3.000, 5.900, 2.100}, {6.300, 2.900, 5.600, 1.800},
{6.500, 3.000, 5.800, 2.200}, {7.600, 3.000, 6.600, 2.100},
{4.900, 2.500, 4.500, 1.700}, {7.300, 2.900, 6.300, 1.800},
{6.700, 2.500, 5.800, 1.800}, {7.200, 3.600, 6.100, 2.500},
{6.500, 3.200, 5.100, 2.000}, {6.400, 2.700, 5.300, 1.900},
{6.800, 3.000, 5.500, 2.100}, {5.700, 2.500, 5.000, 2.000},
{5.800, 2.800, 5.100, 2.400}, {6.400, 3.200, 5.300, 2.300},
{6.500, 3.000, 5.500, 1.800}, {7.700, 3.800, 6.700, 2.200},
{7.700, 2.600, 6.900, 2.300}, {6.000, 2.200, 5.000, 1.500},
{6.900, 3.200, 5.700, 2.300}, {5.600, 2.800, 4.900, 2.000},
{7.700, 2.800, 6.700, 2.000}, {6.300, 2.700, 4.900, 1.800},
{6.700, 3.300, 5.700, 2.100}, {7.200, 3.200, 6.000, 1.800},
{6.200, 2.800, 4.800, 1.800}, {6.100, 3.000, 4.900, 1.800},
{6.400, 2.800, 5.600, 2.100}, {7.200, 3.000, 5.800, 1.600},
{7.400, 2.800, 6.100, 1.900}, {7.900, 3.800, 6.400, 2.000},
{6.400, 2.800, 5.600, 2.200}, {6.300, 2.800, 5.100, 1.500},
{6.100, 2.600, 5.600, 1.400}, {7.700, 3.000, 6.100, 2.300},
{6.300, 3.400, 5.600, 2.400}, {6.400, 3.100, 5.500, 1.800},
{6.000, 3.000, 4.800, 1.800}, {6.900, 3.100, 5.400, 2.100},
{6.700, 3.100, 5.600, 2.400}, {6.900, 3.100, 5.100, 2.300},
{5.800, 2.700, 5.100, 1.900},
// removed data. added to argument values for method classify
//{ 6.800, 3.200, 5.900, 2.300},
{6.700, 3.300, 5.700, 2.500}, {6.700, 3.000, 5.200, 2.300},
{6.300, 2.500, 5.000, 1.900}, {6.500, 3.000, 5.200, 2.000},
{6.200, 3.400, 5.400, 2.300}, {5.900, 3.000, 5.100, 1.800}};
int[] y = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3};
ClusterKNN k = new ClusterKNN(x, y);
// the removed observations
double[][] values = {{5.400, 3.900, 1.300, 0.400},
{5.700, 2.600, 3.500, 1.000},
{6.800, 3.200, 5.900, 2.300}};
int[] classes = k.classify(values, 5);
for (int i = 0; i < classes.length; i++) {
System.out.println("Observation #" + (i + 1) + " is iris type " +
classes[i]);
}
}
}
Observation #1 is iris type 1 Observation #2 is iris type 2 Observation #3 is iris type 3Link to Java source.