Java---简单易懂的KNN算法

一,简单介绍

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

 

打印如图

下载:源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
KNN算法是一种基本的分类与回归方法,其核心思想是通过计算不同样本之间的距离,找到离测试样本最近的K个训练样本,然后根据这K个训练样本的分类情况来决定测试样本的类别。在Java中,实现KNN算法需要考虑以下几个步骤: 1. 数据处理:将原始数据处理为可用于计算距离的形式,例如将数据转化为向量或矩阵形式。 2. 计算距离:常见的距离度量包括欧氏距离、曼哈顿距离等,可以通过Java中的数学库进行计算。 3. 找到最近的K个邻居:可以使用Java中的排序算法或数据结构来实现。 4. 决策分类:根据K个邻居的类别进行分类决策。 以下是一个简单Java实现示例: ```java public class KNN { private double[][] data; // 训练数据 private int[] labels; // 训练数据标签 public KNN(double[][] data, int[] labels) { this.data = data; this.labels = labels; } public int classify(double[] sample, int k) { // 计算距离并排序 double[] distances = new double[data.length]; for (int i = 0; i < data.length; i++) { distances[i] = distance(sample, data[i]); } int[] sortedIdx = argsort(distances); // 统计前k个邻居的类别 int[] kLabels = new int[k]; for (int i = 0; i < k; i++) { kLabels[i] = labels[sortedIdx[i]]; } // 统计类别出现次数并返回出现次数最多的类别 int[] counts = new int[k]; for (int i = 0; i < k; i++) { counts[i] = 0; for (int j = 0; j < k; j++) { if (kLabels[j] == kLabels[i]) { counts[i]++; } } } int maxIdx = 0; for (int i = 1; i < k; i++) { if (counts[i] > counts[maxIdx]) { maxIdx = i; } } return kLabels[maxIdx]; } private double distance(double[] a, double[] b) { double dist = 0.0; for (int i = 0; i < a.length; i++) { dist += Math.pow(a[i] - b[i], 2); } return Math.sqrt(dist); } private int[] argsort(double[] a) { Integer[] idx = new Integer[a.length]; for (int i = 0; i < a.length; i++) { idx[i] = i; } Arrays.sort(idx, (i1, i2) -> Double.compare(a[i1], a[i2])); int[] sortedIdx = new int[a.length]; for (int i = 0; i < a.length; i++) { sortedIdx[i] = idx[i]; } return sortedIdx; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值