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有证书的加密解密实现方法
Nov 19 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
python与字符编码问题
May 24 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
python字符串查找函数的用法详解
Jul 08 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
django使用xadmin的全局配置详解
Nov 15 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 Python
python安装cx_Oracle和wxPython的方法
Sep 14 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自定义函数截取汉字长度
2014/05/15 PHP
php的dl函数用法实例
2014/11/06 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python监控进程脚本
2018/04/12 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
办公室主任职责范本
2014/03/07 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
优秀团支部申报材料
2014/12/26 职场文书
开平碉楼导游词
2015/02/06 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书