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使用PyV8执行javascript代码示例分享
Dec 04 Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python中os.path用法分析
Jan 15 Python
Python中set与frozenset方法和区别详解
May 23 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
python 杀死自身进程的实现方法
Jul 01 Python
Python项目跨域问题解决方案
Jun 22 Python
Django数据统计功能count()的使用
Nov 30 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 Python
python实现手机推送 代码也就10行左右
Apr 12 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之第二天
2006/10/09 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
javascript 特殊字符串
2009/02/25 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python MySQLdb使用教程详解
2018/03/20 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
Flask框架信号用法实例分析
2018/07/24 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
Python列表对象实现原理详解
2019/07/01 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
如何理解Python中包的引入
2020/05/29 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书