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与Redis的连接教程
Apr 22 Python
Python base64编码解码实例
Jun 21 Python
Python实现针对中文排序的方法
May 09 Python
python 对key为时间的dict排序方法
Oct 17 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
提取视频中的音频 Python只需要三行代码!
May 10 Python
判断Python中的Nonetype类型
May 25 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
5道关于python基础 while循环练习题
Nov 27 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中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
JS之相等操作符详解
2016/09/13 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
Python解释执行原理分析
2014/08/22 Python
Python制作爬虫抓取美女图
2016/01/20 Python
python查看列的唯一值方法
2018/07/17 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
生产总经理岗位职责
2013/12/19 职场文书
饭店工作计划书
2014/01/10 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
关于读书的活动方案
2014/08/14 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
党性修养心得体会2016
2016/01/21 职场文书
详解OpenCV曝光融合
2022/04/29 Python