kNN是一种常见的监督学习方法。工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可以使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。[1]

kNN的伪代码如下:[2]

对未知类别属性的数据集中的每个点依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离;

(2)按照距离递增次序排序;

(3)选取与当前点距离最小的k个点;

(4)确定前k个点所在类别的出现频率;

(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

以下通过图来进一步解释:

假定要对紫色的点进行分类,现有红绿蓝三个类别。此处以k为7举例,即找出到紫色距离最近的7个点。

分别找出到紫色距离最近的7个点后,我们将这七个点分别称为1、2、3、4、5、6、7号小球。其中红色的有1、3两个小球,绿色有2、4、5、6四个小球,蓝色有7这一个小球。

显然,绿色小球的个数最多,则紫色小球应当归为绿色小球一类。

以下给出利用kNN进行分类任务的最基本的代码。

KNN.py文件内定义了kNN算法的主体部分

from numpy import *

import operator

def createDataSet():

group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0.0, 0.1]])

labels = ['A', 'A', 'B', 'B']

return group, labels

def kNN_Classify(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]

diffMat = tile(inX, (dataSetSize, 1)) - dataSet

#关于tile函数的用法

#>>> b=[1,3,5]

#>>> tile(b,[2,3])

#array([[1, 3, 5, 1, 3, 5, 1, 3, 5],

# [1, 3, 5, 1, 3, 5, 1, 3, 5]])

sqDiffMat = diffMat ** 2

sqDistances = sum(sqDiffMat, axis = 1)

distances = sqDistances ** 0.5# 算距离

sortedDistIndicies = argsort(distances)

#关于argsort函数的用法

#argsort函数返回的是数组值从小到大的索引值

#>>> x = np.array([3, 1, 2])

#>>> np.argsort(x)

#array([1, 2, 0])

classCount = {} # 定义一个字典

# 选择k个最近邻

for i in range(k):

voteLabel = labels[sortedDistIndicies[i]]

# 计算k个最近邻中各类别出现的次数

classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

# 返回出现次数最多的类别标签

maxCount = 0

for key, value in classCount.items():

if value > maxCount:

maxCount = value

maxIndex = key

return maxIndex

KNN_TEST.py文件中有两个样例测试。

#!/usr/bin/python

# coding=utf-8

import KNN

from numpy import *

# 生成数据集和类别标签

dataSet, labels = KNN.createDataSet()

# 定义一个未知类别的数据

testX = array([1.2, 1.0])

k = 3

# 调用分类函数对未知数据分类

outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)

print("Your input is:", testX, "and classified to class: ", outputLabel)

testX = array([0.1, 0.3])

outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)

print("Your input is:", testX, "and classified to class: ", outputLabel)

代码输出:

画图解释一下输出结果:

参考文献:

[1]机器学习,周志华,清华大学出版社2016.

[2]机器学习实战,Peter Harrington,人民邮电出版社.

2019-03-06

01:52:08

python算法的基本原理_kNN算法基本原理与Python代码实践相关推荐

  1. python pandas 讲解ppt_Python中pandas的分析——包括代码实践,相关,解析,含,实战

    该文章代码均在jupyter Notebook中运行,且已安装re包 # 先读取数据 import pandas as pd f = open(r'C:\Users\qingfeng\Desktop\ ...

  2. 路由器距离向量算法计算举例_路由器基本原理是什么 路由器基本发展情况介绍【图文】...

    PLC路由器原理和ARR 路由器基本原理 要实现网络中通信节点彼此之间的通信,首先必须给每个节点分配一个唯一的IP地址.路由器应该至少有两个网络端口,分别连接LAN或者WAN子网上,每个端口必须具有一 ...

  3. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  4. 深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...

  5. 限流的基本原理及算法实现

    一.限流的基本原理 它的目的是确保系统高效.稳定地运行,确保请求能够快速处理的同时,保障系统不被流量压垮. 限流通常是利用某种算法实现限流器,来达到限制流量的目的.通常,限流器中会有一个定时器,它主要 ...

  6. knn算法python代码_KNN 算法原理及代码实现

    在本文中,我们将讨论一种广泛使用的分类技术,称为K最近邻(KNN).我们的重点主要集中在算法如何工作以及输入参数如何影响预测结果. 内容包括: 何时使用KNN算法? KNN算法原理 如何选择K值 KN ...

  7. python自带的对称算法_一种基于对称算法和专用加载模块的Python程序模块加密方法...

    一种基于对称算法和专用加载模块的Python程序模块加密方法 [专利说明]一种基于对称算法和专用加载模块的Python程序模块加密方法 技术领域 [0001]本发明涉及一种网络安全技术,具体涉及一种P ...

  8. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  9. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

最新文章

  1. DL之perceptron:利用perceptron感知机对股票实现预测
  2. 修改归档模式的存档终点 archive log list
  3. (转)性能分析之-- JAVA Thread Dump 分析综述
  4. 大型软件公司.net面试题!
  5. [原创] Android SDK 安装全记录
  6. P6178-[模板]Matrix-Tree 定理
  7. java引用传递_理解Java中的引用传递和值传递
  8. 还记得吗?可我摸了摸的太空堡垒
  9. KVM安装(RHEL_6.4x64)
  10. 数据结构(C语言)-数组
  11. OBS 录制的视频声音越来越大
  12. matlab版本下载地址
  13. 2023厦门大学计算机考研信息汇总
  14. 短视频“音频化”,音乐“视频化”
  15. 详解myeclipse和maven的clean和build
  16. 基于web服务的文件共享平台pydio搭建教程
  17. youtube-dl下载视频出现SSL证书的问题解决办法
  18. 十二个“一”的特征与剑三中十二门派风格相对应
  19. 2015湘潭邀请赛 Yada Number
  20. Win7下安装Docker(虚拟机win7)

热门文章

  1. WebService初入
  2. Git 教程学习--第三篇
  3. CVTE前端笔试编程题
  4. Ubuntu 安装调整工具移动 Launcher 启动器位置
  5. Android Studio中获取SHA1或MD5的方法
  6. 最近学gvim,mark低先
  7. 装修相片(第50天拍,全部,25号更新)
  8. 计算机网络——基本介绍
  9. CentOS 7 安装并启动Nginx
  10. java 按钮 颜色_改变按钮颜色的java事件,个人成果!