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打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
python函数与方法的区别总结
Jun 23 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
python 实现音频叠加的示例
Oct 29 Python
Python如何急速下载第三方库详解
Nov 02 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
Python实现拼音转换
Jun 07 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
一个高ai的分页函数和一个url函数
2006/10/09 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
详解vue 组件注册
2020/11/20 Vue.js
python复制与引用用法分析
2015/04/08 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
python 二维数组90度旋转的方法
2019/01/28 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
人事科岗位职责范本
2014/03/02 职场文书
房产委托公证书样本
2014/04/04 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
买房子个人收入证明
2014/10/12 职场文书
项目经理岗位职责
2015/01/31 职场文书
Pandas数据类型之category的用法
2021/06/28 Python
Python+Tkinter打造签名设计工具
2022/04/01 Python