用python实现k近邻算法的示例代码


Posted in Python onSeptember 06, 2018

K近邻算法(或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具。

什么是kNN

kNN算法的模型就是整个训练数据集。当需要对一个未知数据实例进行预测时,kNN算法会在训练数据集中搜寻k个最相似实例。对k个最相似实例的属性进行归纳,将其作为对未知实例的预测。

相似性度量依赖于数据类型。对于实数,可以使用欧式距离来计算。其他类型的数据,如分类数据或二进制数据,可以用汉明距离。

对于回归问题,会返回k个最相似实例属性的平均值。对于分类问题,会返回k个最相似实例属性出现最多的属性。

kNN如何工作

kNN属于基于实例算法簇的竞争学习和懒惰学习算法。

基于实例的算法运用数据实例(或数据行)对问题进行建模,进而做出预测决策。kNN算法算是基于实例方法的一种极端形式,因为其保留所有的训练集数据作为模型的一部分。

kNN是一个竞争学习算法,因为为了做出决策,模型内部元素(数据实例)需要互相竞争。 数据实例之间客观相似度的计算,促使每个数据实例都希望在竞争中“获胜”或者尽可能地与给定的未知数据实例相似,继而在预测中做出贡献。

懒惰学习是指直到需要预测时算法才建立模型。它很懒,因为它只在最后一刻才开始工作。优点是只包含了与未知数据相关的数据,称之为局部模型。缺点是,在大型训练数据集中会重复相同或相似的搜索过程,带来昂贵的计算开销。

最后,kNN的强大之处在于它对数据不进行任何假设,除了任意两个数据实例之间距离的一致计算。因此,它被称为成为无参数或者非线性的,因为它没有预设的函数模型。

用python写程序真的好舒服。

import numpy as np
def read_data(filename):
  '''读取文本数据,格式:特征1  特征2 …… 类别'''
  f=open(filename,'rt')
  row_list=f.readlines() #以每行作为列表
  f.close()
  data_array=[]
  labels_vector=[]
  while True:
    if not row_list:
      break
    row=row_list.pop(0).strip().split('\t') #去除换行号,分割制表符
    temp_data_row=[float(a) for a in row[:-1]] #将字符型转换为浮点型
    data_array.append(temp_data_row) #取特征值
    labels_vector.append(row[-1])  #取最后一个作为类别标签
  return np.array(data_array),np.array(labels_vector)

def classify(test_data,dataset,labels,k):
  '''分类'''
  diff_dis_array=test_data-dataset  #使用numpy的broadcasting
  dis_array=(np.add.reduce(diff_dis_array**2,axis=-1))**0.5  #求距离
  dis_array_index=np.argsort(dis_array)  #升序距离的索引
  class_count={}
  for i in range(k):
    temp_label=labels[dis_array_index[i]]
    class_count[temp_label]=class_count.get(temp_label,0)+1 #获取类别及其次数的字典
  sorted_class_count=sorted(class_count.items(), key=lambda item:item[1],reverse=True)  #字典的值按降序排列
  return sorted_class_count[0][0]  #返回元组列表的[0][0]

def normalize(dataset):
  '''数据归一化'''
  return (dataset-dataset.min(0))/(dataset.max(0)-dataset.min(0))

k=3 #近邻数
test_data=[0,0] #待分类数据
data,labels=read_data('testdata.txt')
print('数据集:\n',data)
print('标签集:\n',labels)
result=classify(test_data,normalize(data),labels,k)
print('分类结果:',result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用xmlrpc实例讲解
Dec 17 Python
python中安装模块包版本冲突问题的解决
May 02 Python
Python获取当前路径实现代码
May 08 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
python构造函数init实例方法解析
Jan 19 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Python中logging日志库实例详解
Feb 19 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
python K近邻算法的kd树实现
Sep 06 #Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 #Python
Python多线程编程之多线程加锁操作示例
Sep 06 #Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 #Python
Python json模块dumps、loads操作示例
Sep 06 #Python
Python 字符串换行的多种方式
Sep 06 #Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 #Python
You might like
php 各种应用乱码问题的解决方法
2010/05/09 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
JS实现简单打字测试
2020/06/24 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
小学教师国培感言
2014/02/08 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
测控技术自荐信
2014/06/05 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
圣诞晚会主持词
2015/07/01 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
部分武汉产收音机展览
2022/04/07 无线电
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技