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实现在控制台输入密码不显示的方法
Jul 02 Python
CentOS下使用yum安装python-pip失败的完美解决方法
Aug 16 Python
python实现外卖信息管理系统
Jan 11 Python
Python实现端口检测的方法
Jul 24 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
浅谈Python基础—判断和循环
Mar 22 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
Django框架实现的分页demo示例
May 25 Python
Python中常见的数制转换有哪些
May 27 Python
Python实现画图软件功能方法详解
Jul 28 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 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/02 无线电
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
python 经典数字滤波实例
2019/12/16 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
2014年小学植树节活动方案
2014/03/02 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers