最近邻算法可以说是最简单的分类算法,其思想是将被预测的项归类为和它最相近的项相同的类。我们通过简单的计算比较即将被预测的项与已有训练集中各项的距离(差距),选择其中差距最小的一项,该项的类别即为我们即将预测的类别。

  下表为我们即将使用的数据集,所有的点分为红色和蓝色两种,我们随机给出一个坐标位置,然后预测其应该属于的类别。

  

代码如下:

  1. import math
  2. """
  3. 此python程序用来实现最近邻算法
  4. """
  5.  
  6. def dot_distance(dot1, dot2):
  7. # 计算两点之间的距离
  8. return math.sqrt(pow(dot1.x - dot2.x, 2) + pow(dot1.y - dot2.y, 2))
  9.  
  10. def cal_nearest_neighbor(example, goal):
  11. """
  12.  
  13. :param example: 已有的样例集合
  14. :param goal: 待预测的目标
  15. :return: 距目标最近样例
  16. """
  17.  
  18. dis, aim = dot_distance(example[0], goal), example[0]
  19. example_len = len(example)
  20. for i in range(1, example_len):
  21. dis1, aim1 = dot_distance(example[i],goal), example[i]
  22. if dis > dis1:
  23. dis, aim = dis1, aim1
  24. return aim

  最近邻算法只依据一个数据点来判断其类别,显然如果是一个噪音与即将预测的项目距离很近的话,这就有很大的可能会预测错误。然后就有了最近邻算法的改进--k-近邻算法。

  k-近邻算法的思想与最近邻算法类似,不过,它是选择了k个与即将预测的项目最近的训练项目,然后让k个项目投票,以此判断其应该属于的类别。代码如下:

  1. import math
  2.  
  3. def dot_distance(dot1, dot2):
  4. # 计算两点之间的距离
  5. return math.sqrt(pow(dot1.x - dot2.x, 2) + pow(dot1.y - dot2.y, 2))
  6.  
  7. def predict(example, goal, k):
  8. """
  9.  
  10. :param example: 训练集
  11. :param goal: 待测点
  12. :param k: 投票的个数,一般为奇数
  13. :return: 最近的k个点
  14. """
  15. example_len = len(example)
  16. if example_len < k:
  17. k = example_len
  18. k_nearest_dots = []
  19. for i in range(k):
  20. k_nearest_dots.append((example[i], dot_distance(example[i], goal)))
  21. k_nearest_dots.sort(key=lambda item: item[1])
  22. for i in range(k, example_len):
  23. dis = dot_distance(example[i], goal)
  24. if dis < k_nearest_dots[k-1][1]:
  25. k_nearest_dots.pop()
  26. k_nearest_dots.append((example[i],dis))
  27. k_nearest_dots.sort(key=lambda item: item[1])
  28.  
  29. return k_nearest_dots

  k-近邻算法存在的问题是,当某一类的数据较大时,会对该类别的预测造成过大的影响。如一个小圆圈内都是一个类别,但是数据很少,然后一个同心圆中数据很多,这时我们预测一个在小圆圈内的数据,我们倾向于它应该是属于小圆圈同一个类别的,但是因为数据不足的原因,其可能会被预测为大圆圈类别。

  k-近邻算法的改进是,为不同的距离确定不同的权重。即为更小的距离,确定一个较大的权重。  

  以上两部分测试代码如下:

  1. import csv
  2. from NN import nearest_neighbor
  3. from NN import k_nearest_neighbor
  4.  
  5. class Data:
  6. def __init__(self):
  7. self.x = 0
  8. self.y = 0
  9. self.type = None
  10.  
  11. with open("test\\NN\\data.csv","r") as csv_file:
  12. reader = csv.reader(csv_file)
  13. rows = [row for row in reader]
  14. example = []
  15. for item in rows:
  16. data = Data()
  17. data.x = int(item[0])
  18. data.y = int(item[1])
  19. data.type = item[2]
  20. example.append(data)
  21. goal = Data()
  22. goal.x = 0
  23. goal.y = 3
  24. result = nearest_neighbor.cal_nearest_neighbor(example,goal)
  25. print(goal.x, " ", goal.y, " :", result.type)
  26.  
  27. goal.x = 3
  28. goal.y = 0
  29. result = nearest_neighbor.cal_nearest_neighbor(example,goal)
  30. print(goal.x, " ", goal.y, " :", result.type)
  31.  
  32. k_num = 3
  33. preset = k_nearest_neighbor.predict(example,goal,k_num)
  34. red = 0
  35. blue = 0
  36. for item in preset:
  37. if item[0].type == "red":
  38. red += 1
  39. elif item[0].type == "blue":
  40. blue += 1
  41. if red > blue:
  42. print("predict ", goal.x, " ", goal.y, " is red")
  43. else:
  44. print("predict ", goal.x, " ", goal.y, " is blue")

  训练集数据,保存为data.csv

  1. 0,1,red
    0,2,red
    1,2,red
    1,3,red
    1,4,red
    2,3,red
    2,4,red
    1,0,blue
    2,0,blue
    2,1,blue
    3,1,blue
    3,2,blue
    4,1,blue
    4,2,blue
 

k-近邻算法(KNN)的更多相关文章

  1. k近邻算法(KNN)

    k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...

  2. 机器学习(四) 分类算法--K近邻算法 KNN (上)

    一.K近邻算法基础 KNN------- K近邻算法--------K-Nearest Neighbors 思想极度简单 应用数学知识少 (近乎为零) 效果好(缺点?) 可以解释机器学习算法使用过程中 ...

  3. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  4. 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

    六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...

  5. k近邻算法(knn)的c语言实现

    最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...

  6. 《机器学习实战》---第二章 k近邻算法 kNN

    下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...

  7. 最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现

    k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是 ...

  8. 07.k近邻算法kNN

    1.将数据分为测试数据和预测数据 2.数据分为data和target,data是矩阵,target是向量 3.将每条data(向量)绘制在坐标系中,就得到了一系列的点 4.根据每条data的targe ...

  9. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  10. 机器学习(1)——K近邻算法

    KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...

随机推荐

  1. 一个前端小白,关于vue\react等框架下table的应用总结

    出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...

  2. 前端开发 - JavaScript

    本节内容 一.如何编写 二.变量 三.数据类型 四.其他 五.语句与异常 六.函数 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScri ...

  3. 关于cxGrid的排序问题

    当然,这个 dcoAnsiSort也很重要,否者不按拼音排序 1.首先需要开启  Views的 OptionsCustomize.ColumnSorting 2.再设置每列的这个 Sorting 3. ...

  4. 设置UITableView分割线距左边的间距

    ``` [self.tableView setSeparatorInset:UIEdgeInsetsZero]; [self.tableView setLayoutMargins:UIEdgeInse ...

  5. 开源 PetaPoco 扩展~一个小型轻巧的ORM~

    PetaPoco http://www.toptensoftware.com/petapoco/ |PetaPoco is a tiny, fast, single-file micro-ORM fo ...

  6. 【转】PowerDesigner快捷键

    一般快捷键 快捷键 说明 F4 打开检查模型窗口,检查模型 F5 如果图窗口内的图改变过大小,恢复为原有大小即正常大小 F6 放大图窗口内的图 F7 缩小图窗口内的图 F8 在图窗口内中查看全部图内容 ...

  7. EMACS快捷键

    C = Control M = Meta = Alt | Esc Del = Backspace 基本快捷键(Basic) C-x C-f "find"文件, 即在缓冲区打开/新建 ...

  8. atomic write pipe

    阅读 skynet 代码 socket_server 部分,发现对 socket 的写操作流程是这样的: 1. 各个服务(各线程)将数据写到 sendctrl_fd,这是一个 pipe 的 写端 2. ...

  9. Git-工作区和暂存区的概念

      工作区(Working Directory):就是在电脑里能看到的目录,如testcase文件夹就是一个工作区. 版本库(Repository):工作区有一个隐藏目录.git,是Git的版本库. ...

  10. Dubbo实现原理之基于SPI思想实现Dubbo内核

    dubbo中SPI接口的定义如下: @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public ...