用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以环状形式组合排列图片并输出的方法
Mar 17 Python
python根据日期返回星期几的方法
Jul 06 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
python3射线法判断点是否在多边形内
Jun 28 Python
python中while和for的区别总结
Jun 28 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
python 自动刷新网页的两种方法
Apr 20 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 Python
Python 统计序列中元素的出现频度
Apr 26 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小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
详解php命令注入攻击
2019/04/06 PHP
Javascript MD4
2006/12/20 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
python3音乐播放器简单实现代码
2020/04/20 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
python cs架构实现简单文件传输
2020/03/20 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
canvas 下载二维码和图片加水印的方法
2018/03/21 HTML / CSS
铭立家具面试题
2012/12/06 面试题
个人求职信范文分享
2014/01/06 职场文书
促销活动总结范文
2014/04/30 职场文书
如何写早恋检讨书
2014/09/10 职场文书
北京故宫的导游词
2015/01/31 职场文书
回复函格式及范文
2015/07/14 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
golang json数组拼接的实例
2021/04/28 Golang