`

机器学习-K-近邻算法

阅读更多

K-近邻算法(KNN)

 

概念:采用测量不同的特征值之间的距离方法进行分类,找出最近的K个邻居

 

1.K-近邻算法的流程

收集数据

准备数据

分析数据

训练算法

测试算法

使用算法

 

2.实际使用

K值的选择,如果选择较小的K值,整体模型变得复杂,容易发生过拟合;且K值的增大就意味着整体的模型变得简单

 

下面使用java实现KNN

从文本中获取数据:

10,20-A
12,18-A
8,26-A
1,1-B
0,1-B
11,22-A
7,20-A
40,20-C
35,18-C
50,26-C
2,2-B
45,19-C
3,1-B
3,4-B
38,22-C

package com.sosop.knn;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Data {
	public static Map<String, List<int[]>> getData() {
		Map<String, List<int[]>> map = new HashMap<String, List<int[]>>();
		try(BufferedReader reader = 
				new BufferedReader(new InputStreamReader
						(new FileInputStream("/home/sosop/mytest/KNN-data")))) {
			String line;
			while((line = reader.readLine()) != null) {
				String[] data = line.split("-");
				String[] strCoot = data[0].split(",");
				int[] coordinate = {Integer.valueOf(strCoot[0]), Integer.valueOf(strCoot[0])};
				if(map.get(data[1]) == null) {
					List<int[]> list = new ArrayList<int[]>();
					list.add(coordinate);
					map.put(data[1], list);
				} else {
					map.get(data[1]).add(coordinate);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return map;
	}
}

 

package com.sosop.knn;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class KNN {
	// 计算距离并排序
	public static Map<Double, List<String>> distanceSort(int[] point) {
		Map<Double, List<String>> sortMap = new TreeMap<Double, List<String>>();
		for (Entry<String, List<int[]>> entry : Data.getData().entrySet()) {
			List<int[]> list = entry.getValue();
			for (int[] data : list) {
				double d = Math.sqrt(Math.pow((data[0] - point[0]), 2)
						+ Math.pow((data[1] - point[1]), 2));
				if (sortMap.get(d) == null) {
					List<String> arrList = new ArrayList<String>();
					arrList.add(entry.getKey());
					sortMap.put(d, arrList);
				} else {
					sortMap.get(d).add(entry.getKey());
				}
			}
		}
		return sortMap;
	}

	// 找出K个距离最近的点,分析类别最多的,最后分类
	public static String classify(int k, int point[]) {
		String category = null;
		String[] labels = new String[k];
		int index = 0;
		for (Entry<Double, List<String>> entry : distanceSort(point).entrySet()) {
			for (String label : entry.getValue()) {
				labels[index] = label;
				index++;
				if (index == k)
					break;
			}
			if (index == k)
				break;
		}

		Map<String, Integer> statistic = new HashMap<String, Integer>();

		//int max = 0;
		// 找出类别
		for (String label : labels) {
			if (statistic.get(label) == null) {
				statistic.put(label, 1);
			} else {
				statistic.put(label, statistic.get(label) + 1);
			}
			//if(max < statistic.get(label)) max = statistic.get(label);
		}

		Map<String, Integer> sorted = new TreeMap<String, Integer>(
				new ValueComparator<String, Integer>(statistic));
		sorted.putAll(statistic);
		for (String label : sorted.keySet()) {
			category = label;
			break;
		}
		return category;
	}
	
	
	 public static void main(String[] args) { 
		 int[] point = {33,20};
		 System.out.println(classify(3, point));
	 }
	 

}

// 定义按值倒序排序
class ValueComparator<T, E extends Number> implements Comparator<T> {

	Map<T, E> map;

	public ValueComparator(Map<T, E> map) {
		this.map = map;
	}

	@Override
	public int compare(T o1, T o2) {
		if (map.get(o1).doubleValue() > map.get(o2).doubleValue()) {
			return 1;
		} else if (map.get(o1).doubleValue() < map.get(o2).doubleValue()) {
			return -1;
		} else {
			return 0;
		}
	}

}

 

 

分享到:
评论

相关推荐

    机器学习-最近邻-k-近邻算法-python实现

    机器学习_最近邻_k-近邻算法_python实现

    机器学习实战 - k近邻算法(KNN算法)总结

    机器学习实战 - k近邻算法(KNN算法)总结 适合机器学习实战入门新手 K-近邻算法,又称为 KNN 算法,是数据挖掘技术中原理最简单的算法。 KNN 的工作原理:给定一个已知类别标签的数据训练集,输入没有标签的新数据...

    机器学习实战-k-近邻算法改进约会网站的配对效果

    在本实践项目中,我们将深入探讨如何利用机器学习中的k-近邻算法(K-Nearest Neighbors,简称KNN)来改进约会网站的配对效果。KNN是一种非参数监督学习方法,常用于分类和回归任务。在这个案例中,我们将关注其在...

    机器学习算法--k 近邻法.pdf

    在机器学习领域,它是被广泛研究和应用的十大算法之一。kNN算法的原理简单直观,主要通过测量不同特征值之间的距离进行分类。该算法在执行过程中不需要事先训练模型,能够有效处理数值型和标称型数据。 k近邻法的...

    《机器学习实战》-Ch2-k-近邻算法-源代码

    《机器学习实战》是机器学习领域的一本经典教材,它以实践为导向,深入浅出地讲解了各种机器学习算法。Ch2章节主要聚焦在k-近邻(k-Nearest Neighbors, KNN)算法上,这是一种基础且重要的监督学习算法,广泛应用于...

    K-NN(K近邻算法)实现手写字符的识别(C语言)

    **K-NN(K近邻算法)是一种简单而强大的非参数机器学习算法,主要用于分类和回归任务。在手写字符识别领域,K-NN被广泛应用于自动识别数字,如OCR(光学字符识别)系统。本项目是用C语言实现的K-NN算法,通过Visual ...

    K近邻算法-讲解

    ### K近邻算法详解 ...综上所述,K近邻算法作为一种简单有效的机器学习方法,在多种应用场景下都有广泛的应用。通过合理的参数设置和技术优化,可以在一定程度上解决其存在的问题,使其更好地服务于实际需求。

    0817-极智开发-解读机器学习算法之k-近邻算法及示例代码

    0817_极智开发_解读机器学习算法之k-近邻算法及示例代码

    机器学习-基于KNN的K近邻算法.zip

    机器学习 机器学习_基于KNN的K近邻算法

    Python——机器学习实战——k-近邻算法

    K-近邻算法的基本概念** KNN算法的核心思想是:对于给定的新样本,找到训练集中与之最近的k个样本,根据这k个样本的类别进行投票,以多数票决定新样本的类别。这里的“近”通常用欧氏距离、曼哈顿距离或余弦相似度...

    机器学习实战 - KNN(K近邻)算法PDF知识点详解 + 代码实现

    **K-近邻(KNN)算法**是机器学习领域中一种基础且直观的分类算法。它的核心思想是根据输入样本最接近的K个训练样本的类别来预测新样本的类别。KNN算法最早由Cover和Hart在1968年提出,是一种基于实例的学习方法,...

    机器学习K-近邻算法

    k-近邻算法的Python实现

    K - 近邻算法.zip

    《K-近邻算法在Python3中的实现及应用》 K-近邻(K-Nearest Neighbors,简称KNN)算法是机器学习领域中最基础的算法之一,它属于监督学习方法,尤其适用于分类问题。KNN算法的核心思想是:通过寻找训练数据集中与待...

    机器学习算法KNN(K近邻)应用-实现对是否患糖尿病的预测源码+PDF文档

    机器学习算法KNN(K近邻)应用—实现对是否患糖尿病的预测源码+PDF文档机器学习算法KNN(K近邻)应用—实现对是否患糖尿病的预测源码+PDF文档机器学习算法KNN(K近邻)应用—实现对是否患糖尿病的预测源码+PDF文档...

    机器学习之k-近邻算法.zip

    《机器学习之k-近邻算法》 k-近邻(K-Nearest Neighbors,简称KNN)算法是监督学习领域中一个基础且重要的算法,尤其在分类问题上表现突出。KNN属于懒惰学习(Lazy Learning)类型,因为它并不进行模型训练,而是将...

    机器学习实战之02-k近邻算法全部源代码+测试数据+详细注释

    在这个资源包中,你将找到《机器学习实战》这本书第二章关于k近邻算法的全部源代码,涵盖了从基础到进阶的应用,以及用于测试的完整数据集,并且每段代码都配有详细的注释。 首先,让我们深入了解k近邻算法的核心...

    机器学习算法KNN(K近邻)应用实例-性别的二分类预测源码+使用说明

    机器学习算法KNN(K近邻)应用实例—性别的二分类预测源码+使用说明机器学习算法KNN(K近邻)应用实例—性别的二分类预测源码+使用说明机器学习算法KNN(K近邻)应用实例—性别的二分类预测源码+使用说明机器学习...

    Python机器学习k-近邻算法(K Nearest Neighbor)实例详解

    K-近邻算法(K Nearest Neighbor,KNN)是一种基本分类与回归方法。在机器学习领域,KNN算法的核心思想是通过测量不同特征值之间的距离来进行分类。基于输入样本与样本集中已知类别的样本之间的距离,将其归类于最近...

Global site tag (gtag.js) - Google Analytics