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 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
Python实现单词拼写检查
Apr 25 Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
TensorFlow tensor的拼接实例
Jan 19 Python
Python reduce函数作用及实例解析
May 08 Python
Python为何不支持switch语句原理详解
Oct 21 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 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分页代码详解
2008/03/27 PHP
php批量更改数据库表前缀实现方法
2013/10/26 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
JS获取各种浏览器窗口大小的方法
2014/01/14 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
python多进程操作实例
2014/11/21 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
哈弗商学院毕业生求职信
2014/02/26 职场文书
创意婚礼策划方案
2014/05/18 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
暑期培训班策划方案
2014/08/26 职场文书
会议主持人开场白台词
2015/05/28 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS