用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使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
django 修改server端口号的方法
May 14 Python
Python中 map()函数的用法详解
Jul 10 Python
python生成器与迭代器详解
Jan 01 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
Python开发网站目录扫描器的实现
Feb 21 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
使用python实现画AR模型时序图
Nov 20 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
Python selenium自动化测试模型图解
Apr 15 Python
详解Pycharm与anaconda安装配置指南
Aug 25 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php文件上传的简单实例
2013/10/19 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
python基础教程之基本内置数据类型介绍
2014/02/20 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
django实现前后台交互实例
2017/08/07 Python
python3 flask实现文件上传功能
2020/03/20 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
单位租车协议书
2015/01/29 职场文书
年度考核表个人总结
2015/03/06 职场文书
三国演义读书笔记
2015/06/25 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
车位出租协议书范本
2016/03/19 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书