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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
Python 功能和特点(新手必学)
Dec 30 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Python将多个list合并为1个list的方法
Jun 27 Python
对pandas中Series的map函数详解
Jul 25 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
Python异常模块traceback用法实例分析
Oct 22 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
Python-opencv 双线性插值实例
Jan 17 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
Jun 22 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为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
php join函数应用
2011/05/04 PHP
php读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php数组合并与拆分实例分析
2015/06/12 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
python 字符串格式化代码
2013/03/17 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
使用Python绘制图表大全总结
2017/02/11 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
python中实现栈的三种方法
2020/12/19 Python
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
会计专业导师推荐信
2014/03/08 职场文书
工地安全质量标语
2014/06/07 职场文书
初中班级口号
2014/06/09 职场文书
安全隐患整改报告
2014/11/06 职场文书
实习单位推荐信
2015/03/27 职场文书
如何用python反转图片,视频
2021/04/24 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python