用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之传说中的函数编写条规
Oct 11 Python
跟老齐学Python之模块的加载
Oct 24 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python切片工具pillow用法示例
Mar 30 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python如何实现邮件功能
May 27 Python
python matlab库简单用法讲解
Dec 31 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
Python 中的Sympy详细使用
Aug 07 Python
python函数的两种嵌套方法使用
Apr 02 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_pdo 预处理语句详解
2016/11/21 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
js表单登陆验证示例
2016/10/19 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
Python中functools模块的常用函数解析
2016/06/30 Python
利用Python实现图书超期提醒
2016/08/02 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
python实现在线翻译功能
2020/03/03 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
C#公司笔试题
2014/03/28 面试题
销售演讲稿范文
2014/01/08 职场文书
信息员培训方案
2014/06/12 职场文书
供用电专业求职信
2014/07/07 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
离婚起诉书范本
2015/05/18 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python