用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编写提取日志中的中文的脚本的方法
Apr 30 Python
对Python中type打开文件的方式介绍
Apr 28 Python
解决python3 网络请求路径包含中文的问题
May 10 Python
python实现彩色图转换成灰度图
Jan 15 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
python时间日期操作方法实例小结
Feb 06 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
Python如何绘制日历图和热力图
Aug 07 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 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
如何过滤高亮显示非法字符
2006/10/09 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php把session写入数据库示例
2014/02/26 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
js倒计时显示实例
2016/12/11 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
Python网站验证码识别
2016/01/25 Python
python基础之入门必看操作
2017/07/26 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python实现矩阵打印
2019/03/02 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
建筑文秘专业个人求职信范文
2013/12/28 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP