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


Posted in Python onJune 25, 2018

本文实例讲述了Python机器学习k-近邻算法。分享给大家供大家参考,具体如下:

工作原理

存在一份训练样本集,并且每个样本都有属于自己的标签,即我们知道每个样本集中所属于的类别。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后提取样本集中与之最相近的k个样本。观察并统计这k个样本的标签,选择数量最大的标签作为这个新数据的标签。

用以下这幅图可以很好的解释kNN算法:

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

不同形状的点,为不同标签的点。其中绿色点为未知标签的数据点。现在要对绿色点进行预测。由图不难得出:

  • 如果k=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。
  • 如果k=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。

kNN算法实施

伪代码

对未知属性的数据集中的每个点执行以下操作

1. 计算已知类型类别数据集中的点与当前点之间的距离
2. 按照距离递增次序排序
3. 选取与当前点距离最小的k个点
4. 确定前k个点所在类别的出现频率
5. 返回前k个点出现频率最高的类别作为当前点的预测分类

欧式距离(计算两点之间的距离公式)

计算点x与点y之间欧式距离

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

python代码实现

# -*- coding:utf-8 -*-
#! python2
import numpy as np
import operator
# 训练集
data_set = np.array([[1., 1.1],
           [1.0, 1.0],
           [0., 0.],
           [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
def classify_knn(in_vector, training_data, training_label, k):
  """
  :param in_vector: 待分类向量
  :param training_data: 训练集向量
  :param training_label: 训练集标签
  :param k: 选择最近邻居的数目
  :return: 分类器对 in_vector 分类的类别
  """
  data_size = training_data.shape[0] # .shape[0] 返回二维数组的行数
  diff_mat = np.tile(in_vector, (data_size, 1)) - data_set # np.tile(array, (3, 2)) 对 array 进行 3×2 扩展为二维数组
  sq_diff_mat = diff_mat ** 2
  sq_distances = sq_diff_mat.sum(axis=1) # .sum(axis=1) 矩阵以列求和
  # distances = sq_distances ** 0.5 # 主要是通过比较求最近点,所以没有必要求平方根
  distances_sorted_index = sq_distances.argsort() # .argsort() 对array进行排序 返回排序后对应的索引
  class_count_dict = {} # 用于统计类别的个数
  for i in range(k):
    label = training_label[distances_sorted_index[i]]
    try:
      class_count_dict[label] += 1
    except KeyError:
      class_count_dict[label] = 1
  class_count_dict = sorted(class_count_dict.iteritems(), key=operator.itemgetter(1), reverse=True) # 根据字典的value值对字典进行逆序排序
  return class_count_dict[0][0]
if __name__ == '__main__':
  vector = [0, 0] # 待分类数据集
  print classify_knn(in_vector=vector, training_data=data_set, training_label=labels, k=3)

运行结果:B

算法评价

  • 优点:精度高、对异常值不敏感、无数据输入假定
  • 缺点:计算复杂度高、空间复杂度高
  • 使用数据范围:数据型和标称型
  • 适用:kNN方法通常用于一个更复杂分类算法的一部分。例如,我们可以用它的估计值做为一个对象的特征。有时候,一个简单的kNN算法在良好选择的特征上会有很出色的表现。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
对python append 与浅拷贝的实例讲解
May 04 Python
python实现京东秒杀功能
Jul 30 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
Python常用配置文件ini、json、yaml读写总结
Jul 09 Python
Python实现滑雪小游戏
Sep 25 Python
python解决字符串倒序输出的问题
Jun 25 #Python
Python决策树之基于信息增益的特征选择示例
Jun 25 #Python
python实现逆序输出一个数字的示例讲解
Jun 25 #Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 #Python
python逆序打印各位数字的方法
Jun 25 #Python
python爬虫的数据库连接问题【推荐】
Jun 25 #Python
python让列表倒序输出的实例
Jun 25 #Python
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
php隐藏实际地址的文件下载方法
2015/04/18 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
如何一键升级Python所有包
2020/11/05 Python
python中str内置函数用法总结
2020/12/27 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
一年级班主任感言
2014/03/08 职场文书
三严三实对照检查材料
2014/09/22 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
出差报告格式模板
2014/11/06 职场文书
财务部岗位职责范本
2015/04/14 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
Java中的随机数Random
2022/03/17 Java/Android
TS 类型收窄教程示例详解
2022/09/23 Javascript
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers