用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 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
python实现删除文件与目录的方法
Nov 10 Python
Python中正则表达式详解
May 17 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
使用python实现http及ftp服务进行数据传输的方法
Oct 26 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 Python
python自动从arxiv下载paper的示例代码
Dec 05 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_SELF的安全问题
2009/09/05 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php自动加载方式集合
2016/04/04 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
Js中sort()方法的用法
2006/11/04 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
五步轻松实现zTree的使用
2017/11/01 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
解决pandas使用read_csv()读取文件遇到的问题
2018/06/15 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
妇产科护士自我鉴定
2013/10/15 职场文书
青年文明号事迹材料
2014/01/18 职场文书
个人合作协议书范本
2014/04/18 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
学生检讨书范文
2015/01/27 职场文书
春节慰问信范文
2015/02/15 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
超市主管竞聘书
2015/09/15 职场文书
PyTorch中permute的使用方法
2022/04/26 Python