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中异常捕获方法详解
Mar 03 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
python中模块查找的原理与方法详解
Aug 11 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
Python Json数据文件操作原理解析
May 09 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Jun 11 Python
Python中的pprint模块
Nov 27 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连接MYSQL数据库实例代码
2016/01/20 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
tp5修改(实现即点即改)
2019/10/18 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
js实现文件上传表单域美化特效
2015/11/02 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
Python实现发送QQ邮件的封装
2017/07/14 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
Django开发的简易留言板案例详解
2018/12/04 Python
在Python中构建增广矩阵的实现方法
2019/07/01 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
满月酒答谢词
2014/01/14 职场文书
开工仪式主持词
2014/03/20 职场文书
交通事故调解协议书
2015/05/20 职场文书
工作经历证明范本
2015/06/15 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
MySQL大小写敏感的注意事项
2021/05/24 MySQL
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL