`

K最近邻(KNN)算法原理和java实现

阅读更多

原理部分:

请参考:KNN演算法

 

 

代码实现:

 

KNN结点类,用来存储最近邻的k个元组相关的信息

/**
 * KNN结点类,用来存储最近邻的k个元组相关的信息
 */
public class KNNNode {
	private int index; 			// 元组标号
	private double distance; 	// 与测试元组的距离
	private String c; 			// 所属类别
	public KNNNode(int index, double distance, String c) {
		super();
		this.index = index;
		this.distance = distance;
		this.c = c;
	}
	
	
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	public double getDistance() {
		return distance;
	}
	public void setDistance(double distance) {
		this.distance = distance;
	}
	public String getC() {
		return c;
	}
	public void setC(String c) {
		this.c = c;
	}
}

 

 

KNN算法主体类

/**
 * KNN算法主体类
 */
public class KNN {
	/**
	 * 设置优先级队列的比较函数,距离越大,优先级越高
	 */
	private Comparator<KNNNode> comparator = new Comparator<KNNNode>() {
		public int compare(KNNNode o1, KNNNode o2) {
			if (o1.getDistance() >= o2.getDistance()) {
				return 1;
			} else {
				return 0;
			}
		}
	};
	/**
	 * 获取K个不同的随机数
	 * @param k 随机数的个数
	 * @param max 随机数最大的范围
	 * @return 生成的随机数数组
	 */
	public List<Integer> getRandKNum(int k, int max) {
		List<Integer> rand = new ArrayList<Integer>(k);
		for (int i = 0; i < k; i++) {
			int temp = (int) (Math.random() * max);
			if (!rand.contains(temp)) {
				rand.add(temp);
			} else {
				i--;
			}
		}
		return rand;
	}
	/**
	 * 计算测试元组与训练元组之前的距离
	 * @param d1 测试元组
	 * @param d2 训练元组
	 * @return 距离值
	 */
	public double calDistance(List<Double> d1, List<Double> d2) {
		double distance = 0.00;
		for (int i = 0; i < d1.size(); i++) {
			distance += (d1.get(i) - d2.get(i)) * (d1.get(i) - d2.get(i));
		}
		return distance;
	}
	/**
	 * 执行KNN算法,获取测试元组的类别
	 * @param datas 训练数据集
	 * @param testData 测试元组
	 * @param k 设定的K值
	 * @return 测试元组的类别
	 */
	public String knn(List<List<Double>> datas, List<Double> testData, int k) {
		PriorityQueue<KNNNode> pq = new PriorityQueue<KNNNode>(k, comparator);
		List<Integer> randNum = getRandKNum(k, datas.size());
		for (int i = 0; i < k; i++) {
			int index = randNum.get(i);
			List<Double> currData = datas.get(index);
			String c = currData.get(currData.size() - 1).toString();
			KNNNode node = new KNNNode(index, calDistance(testData, currData), c);
			pq.add(node);
		}
		for (int i = 0; i < datas.size(); i++) {
			List<Double> t = datas.get(i);
			double distance = calDistance(testData, t);
			KNNNode top = pq.peek();
			if (top.getDistance() > distance) {
				pq.remove();
				pq.add(new KNNNode(i, distance, t.get(t.size() - 1).toString()));
			}
		}
		
		return getMostClass(pq);
	}
	/**
	 * 获取所得到的k个最近邻元组的多数类
	 * @param pq 存储k个最近近邻元组的优先级队列
	 * @return 多数类的名称
	 */
	private String getMostClass(PriorityQueue<KNNNode> pq) {
		Map<String, Integer> classCount = new HashMap<String, Integer>();
		for (int i = 0; i < pq.size(); i++) {
			KNNNode node = pq.remove();
			String c = node.getC();
			if (classCount.containsKey(c)) {
				classCount.put(c, classCount.get(c) + 1);
			} else {
				classCount.put(c, 1);
			}
		}
		int maxIndex = -1;
		int maxCount = 0;
		Object[] classes = classCount.keySet().toArray();
		for (int i = 0; i < classes.length; i++) {
			if (classCount.get(classes[i]) > maxCount) {
				maxIndex = i;
				maxCount = classCount.get(classes[i]);
			}
		}
		return classes[maxIndex].toString();
	}
}

 

KNN算法测试类

/**
 * KNN算法测试类
 */
public class TestKNN {
	
	/**
	 * 从数据文件中读取数据
	 * @param datas 存储数据的集合对象
	 * @param path 数据文件的路径
	 */
	public void read(List<List<Double>> datas, String path){
		try {
			BufferedReader br = new BufferedReader(new FileReader(new File(path)));
			String data = br.readLine();
			List<Double> l = null;
			while (data != null) {
				String t[] = data.split(" ");
				l = new ArrayList<Double>();
				for (int i = 0; i < t.length; i++) {
					l.add(Double.parseDouble(t[i]));
				}
				datas.add(l);
				data = br.readLine();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 程序执行入口
	 * @param args
	 */
	public static void main(String[] args) {
		TestKNN t = new TestKNN();
		String datafile = new File("").getAbsolutePath() + File.separator + "datafile";
		String testfile = new File("").getAbsolutePath() + File.separator + "testfile";
		try {
			List<List<Double>> datas = new ArrayList<List<Double>>();
			List<List<Double>> testDatas = new ArrayList<List<Double>>();
			t.read(datas, datafile);
			t.read(testDatas, testfile);
			KNN knn = new KNN();
			for (int i = 0; i < testDatas.size(); i++) {
				List<Double> test = testDatas.get(i);
				System.out.print("测试元组: ");
				for (int j = 0; j < test.size(); j++) {
					System.out.print(test.get(j) + " ");
				}
				System.out.print("类别为: ");
				System.out.println(Math.round(Float.parseFloat((knn.knn(datas, test, 3)))));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

  • KNN.rar (9.4 KB)
  • 下载次数: 117
分享到:
评论

相关推荐

    KNN算法原理和java实现.doc

    KNN(K-Nearest Neighbors)算法是一种监督学习方法,常用于...总之,KNN算法是一种简单而有效的机器学习方法,其核心在于距离计算和最近邻的选取。在实际应用中,需要根据数据特性和任务需求进行适当的调整和优化。

    Java实现kNN算法

    总之,Java实现kNN算法涉及数据预处理、距离计算、最近邻搜索和预测等多个环节。在设计和优化算法时,需要考虑到性能、准确性和适用场景,确保算法在实际应用中的有效性。同时,理解kNN算法背后的理论基础,可以帮助...

    knn.rar_KNN java_KNN算法 java_knn算法_knn算法java实现

    它在分类和回归问题中都有应用,尤其在机器学习初学者中非常常见,因为其原理简单,易于理解和实现。 在KNN算法中,"K"是一个关键参数,代表了我们要考虑的最近邻居的数量。当一个新的数据点需要被分类或预测时,...

    KNN算法实现分类问题(JAVA)实现

    这个实验项目提供了一个基础的KNN分类器的实现,通过对数据的读取、距离计算、最近邻选择和类别投票,展示了KNN算法的完整流程。通过阅读和理解这段代码,开发者可以更好地掌握KNN算法的原理,并能在此基础上进行...

    KNN算法java实现

    总之,这个KNN算法的Java实现是一个很好的学习资源,可以帮助初学者理解算法的基本工作原理,并提供了一个实际应用的起点。通过阅读和分析这段代码,你可以深入理解数据挖掘中的分类算法,掌握如何在实际项目中应用...

    knn.zip_knn_knn算法_实现KNN算法java

    《KNN算法的Java实现详解》 KNN(K-Nearest Neighbors)算法,即K近邻算法,是机器学习领域中最基础且重要的算法之一。它基于实例的学习,通过寻找训练集中与新样本最接近的K个邻居,依据邻居的类别进行投票,从而...

    KNN算法在UCI数据集上的的java实现

    本项目是基于Java实现的KNN算法,并在UCI(University of California, Irvine)机器学习库的三个数据集上进行了验证和测试。以下是对KNN算法、UCI数据集以及Java实现的详细解析。 **KNN算法详解** KNN算法的基本...

    mnist手写体的识别采用KNN算法,Java实现

    标题中的“mnist手写体的识别采用KNN算法,Java实现”涉及到的是一个计算机视觉领域的经典问题,即使用机器学习方法对MNIST数据集的手写数字进行分类。MNIST数据集是包含手写数字图像的大型数据库,常用于训练各种...

    KNN算法原理及应用.pdf

    KNN算法原理及应用 KNN算法是数据挖掘分类技术中最简单的方法之一,也叫K最邻近分类算法。其基本思想是:已知一个样本空间里的部分样本分成几个类,然后,给定一个待分类的数据,通过计算找出与自己最接近的K个样本...

    用java实现knn算法

    在本项目中,我们将探讨如何使用Java...总之,通过Java实现KNN算法并与Access数据库集成,我们可以有效地对电影进行分类。通过不断地调整和优化,这个算法可以在其他领域或更多特征的数据集上展现出强大的预测能力。

    KNN算法的Java实现

    本篇文章将深入探讨KNN算法的基本原理、实现步骤以及如何用Java来编写KNN算法。 KNN算法的核心思想是基于实例的学习,即通过找到训练集中与新样本最接近的K个邻居,依据这些邻居的类别进行投票决定新样本的类别。...

    [免资源分]KNN算法的C、C++、java等实现源码

    标题中的“[免资源分]KNN算法的C、C++、java等实现源码”表明这是一个关于KNN(K-Nearest Neighbors,K最近邻)算法的编程实现集合,涵盖C、C++和Java这三种编程语言。KNN算法是一种基于实例的学习方法,属于监督...

    KNN算法及Java实现

    在本篇文档中,将会详细介绍KNN算法的原理、实现细节以及如何用Java语言实现它。 首先,KNN算法的核心思想是基于类比学习。当我们有一条待分类的测试元组时,KNN算法会在训练集中寻找与这条测试元组最相似的K个元组...

    KNN.rar_KNN java_KNN算法java_knn

    在压缩包文件“KNN”中,可能包含了Java实现KNN算法的源代码,初学者可以通过阅读和理解这些代码来深入学习KNN算法的工作原理和实现细节。同时,也可以通过运行代码,使用不同的数据集进行实验,进一步掌握KNN算法在...

    KNN算法java实现附测试数据及结果

    1. **KNN算法原理**: KNN算法基于“近朱者赤,近墨者黑”的思想,即一个样本最可能的类别是其最近邻点中最常见的类别。这里的“近”通常用欧氏距离、曼哈顿距离或余弦相似度等度量方式来衡量。K值代表最近邻的数量...

    KNN.rar_java k-nn_knn算法_weka k_weka knn

    在这个项目中,"KNN.doc"可能是文档形式的教程或代码注释,详细介绍了如何实现和使用Java编写的KNN算法以及在Weka上的应用。通过阅读这份文档,你可以进一步理解KNN的工作原理,以及如何在实际项目中应用和优化这个...

    knn.zip_K._java KNN_knn、KNN、邻近算法_knn算法

    本项目通过Java语言实现了一个简单的KNN算法,帮助初学者理解该算法的基本原理和编程实现。 1. **KNN算法简介** KNN算法基于实例学习,其核心思想是:对于一个未知类别的样本,我们将其分类到与其最近的K个已知...

    KNN--Java.zip_KNN java_Knn-java_java KNN_knn

    1. **KNN算法原理**:解释了KNN的基本概念,包括K值的选择、距离度量方法、邻居的选择策略(如使用最近邻或加权最近邻)、处理类别不平衡的方法等。 2. **数据预处理**:KNN算法对数据的质量要求较高,因此可能涉及...

    贝叶斯算法和KNN算法的文本分类器Java实现

    5. **K最近邻(KNN)算法**:KNN算法是一种基于实例的学习方法,它根据“近朱者赤,近墨者黑”的原理,利用距离度量来找出与目标文档最近的K个训练文档,并将目标文档的类别赋予距离最近的多数类别。 6. **Java实现...

    KNN算法实验报告.pdf

    **一、KNN算法原理** 1. **距离度量**:KNN算法通常使用欧氏距离、曼哈顿距离或余弦相似度等方法来衡量样本之间的相似性。在本实验中,使用了余弦相似度来计算样本之间的相似性。 2. **选择邻居**:对于待分类样本,...

Global site tag (gtag.js) - Google Analytics