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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
python奇偶行分开存储实现代码
Mar 19 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
python实现微信防撤回神器
Apr 29 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
python中time包实例详解
Feb 02 Python
python如何实现递归转非递归
Feb 25 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
香妃
2021/03/03 冲泡冲煮
PHP基于数组实现的分页函数实例
2014/08/20 PHP
提高php编程效率技巧
2015/08/13 PHP
php实现的生成排列算法示例
2019/07/25 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
Vue filter介绍及详细使用
2018/04/04 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python定时关机小脚本
2018/06/20 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
python实现KNN分类算法
2019/10/16 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python hmac模块使用实例解析
2019/12/24 Python
Python中实现输入一个整数的案例
2020/05/03 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
小学科学教学计划
2015/01/21 职场文书
共青团员自我评价
2015/03/10 职场文书
行政上诉状范文
2015/05/23 职场文书
运动会广播稿20字
2015/08/19 职场文书
高中生物教学反思
2016/02/20 职场文书
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS