用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脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
Python实现的概率分布运算操作示例
Aug 14 Python
python批量爬取下载抖音视频
Jun 17 Python
利用python求积分的实例
Jul 03 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
实例代码讲解Python 线程池
Aug 24 Python
基于python爬取梨视频实现过程解析
Nov 09 Python
Python Matplotlib绘制条形图的全过程
Oct 24 Python
python装饰器代码解析
Mar 23 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 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下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
js 分栏效果实现代码
2009/08/29 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
python编码最佳实践之总结
2016/02/14 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
python中的文件打开与关闭操作命令介绍
2018/04/26 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
求职信怎么写
2014/05/23 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
课外访万家心得体会
2014/09/03 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
vscode内网访问服务器的方法
2022/06/28 Servers