一,简单介绍
KNN算法---就是获取临近点,范围内,哪一种点最多(例如:红点:6,黑点:2,未知点肯定是红点),就是属于最多一方
定义样本,拥有四个样本,已知A区两点分别(2,5)和(1,4),
B区(8,1)和(9,2),
求灰点(4,3)属于哪一区?
代码
定义实体类
/**
* 定义数据和数据类型
* @author peng
*
*/
private static class Shuju{
int x;
int y;
String type;
public Shuju(int x, int y, String type) {
super();
this.x = x;
this.y = y;
this.type = type;
}
}
knn分类函数
/**
* KNN分类函数
* @param inputshuju 需要输入的测试数据
* @param dataset 样本数据
* @param k 相近的几个函数比较
*/
private static Shuju knnclassify(Shuju inputshuju,Shuju[] dataset, int k) {
Shuju se = inputshuju;
HashMap<Double, Integer> map = new HashMap<>();
//1,定义(X1-X2)^2+(Y1-Y2)^2的并求和
//2,求距离
double[] distance = new double[dataset.length];
double[] sum = new double[dataset.length];
for(int i=0 ;i<dataset.length ; i++) {
sum[i] = Math.pow((inputshuju.x - dataset[i].x),2) + Math.pow((inputshuju.y - dataset[i].y),2);
//获取两点的距离
distance[i] = Math.pow(sum[i], 0.5);
map.put(distance[i], i);
}
//3,排序
Arrays.sort(distance);
//根据diatance获取value值,在根据key获取数据类型
String[] arr = new String[k];
for(int i=0 ;i<k ; i++) {
int j = map.get(distance[i]);
arr[i] = dataset[j].type;
}
//获取出现次数最多的类型
String type = getmaxcounString(arr);
se.type = type;
return se;
}
获取分类最多的类型
/**
* 获取出现最多的类型
*/
private static String getmaxcounString(String[] array) {
//第一个值为出现的字符串,第二个值为出现的次数
HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++)
{ //判断是否包含指定的key值,如果包含就+1
if(map.containsKey(array[i]))
{
int temp = map.get(array[i]);
map.put(array[i],temp+1);
}
else
{
map.put(array[i],1);
}
}
//得到value为maxCount的key,也就是数组中出现次数最多的数字
Collection<Integer> count = map.values();
int maxCount = Collections.max(count);
//根据value获取key
String maxnumstring = "";
for (Entry<String, Integer> entry:map.entrySet())
{
if (maxCount==entry.getValue())
{
maxnumstring = entry.getKey();
}
}
System.out.println("出现次数最多的数字为"+maxnumstring);
System.out.println("改次数一共出现了"+maxCount+"次");
return maxnumstring;
}
调取
public static void main(String[] args) {
//定义样本,拥有四个样本,已知A区两点分别(2,5)和(1,4),
//B区(8,1)和(9,2),
//灰点(4,3)
Shuju[] shu = new Shuju[4];
shu[0] = new Shuju(8, 1, "B");
shu[1] = new Shuju(9, 2, "B");
shu[2] = new Shuju(2, 5, "A");
shu[3] = new Shuju(1, 4, "A");
//测试数据,假定测试类型为X
Shuju su = new Shuju(4, 3, "X");
Shuju result = knnclassify(su, shu, 3);
System.out.println("灰点的类型:"+result.type);
}
打印如图
下载:源码