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在命令行下使用google翻译(带语音)
Jan 16 Python
深入解析Python中的变量和赋值运算符
Oct 12 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
python3中int(整型)的使用教程
Mar 23 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
Selenium的使用详解
Oct 19 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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
php读取xml实例代码
2010/01/28 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
php向js函数传参的几种方法
2014/08/10 PHP
php 问卷调查结果统计
2015/10/08 PHP
javascript iframe编程相关代码
2009/12/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
django-初始配置(纯手写)详解
2019/07/30 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
Python 读取位于包中的数据文件
2020/08/07 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
电子商务自荐书范文
2014/01/04 职场文书
高一英语教学反思
2014/01/22 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
英语系毕业生求职信
2014/07/13 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
项目转让协议书
2014/10/27 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏