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支持断点续传的多线程下载示例
Jan 16 Python
python复制文件的方法实例详解
May 22 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
Python实现购物车程序
Apr 16 Python
Python基于Socket实现简单聊天室
Feb 17 Python
Python列表去重复项的N种方法(实例代码)
May 12 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
python垃圾回收机制原理分析
Apr 13 Python
python解析照片拍摄时间进行图片整理
Jul 23 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获取数组中键值最大数组项的索引值
2015/03/17 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
javascript 的Document属性和方法集合
2010/01/25 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
树莓派实现移动拍照
2019/06/22 Python
Python 读取串口数据,动态绘图的示例
2019/07/02 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
python异步Web框架sanic的实现
2020/04/27 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
python如何随机生成高强度密码
2020/08/19 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
大学信息公开实施方案
2014/03/09 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
设备售后服务承诺书
2014/05/30 职场文书
个人总结与自我评价
2014/09/18 职场文书
春节慰问信范文
2015/02/15 职场文书
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL