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 30 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
谈谈Python中的while循环语句
Mar 10 Python
python制作抖音代码舞
Apr 07 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
PyCharm 专业版安装图文教程
Feb 20 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 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中SESSION使用中的一点经验总结
2012/03/30 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
input的focus方法使用
2010/03/13 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
纯js写的分页表格数据为json串
2014/02/18 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
Python闭包函数定义与用法分析
2018/07/20 Python
浅析Django中关于session的使用
2019/12/30 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
开放系统互连参考模型
2016/06/29 面试题
报社实习生自荐信
2014/01/24 职场文书
审计主管岗位职责
2014/01/31 职场文书
学校后勤岗位职责
2014/02/19 职场文书
党组织公开承诺书
2014/03/29 职场文书
班训口号大全
2014/06/18 职场文书
优秀党员个人总结
2015/02/14 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
投诉信格式范文
2015/07/02 职场文书
暑假打工感想
2015/08/07 职场文书
浅谈Python中的正则表达式
2021/06/28 Python
springboot用户数据修改的详细实现
2022/04/06 Java/Android
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL