用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实现逆波兰计算表达式实例详解
May 06 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
Python实现的爬虫功能代码
Jun 24 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
Python用for循环实现九九乘法表
May 31 Python
python简易远程控制单线程版
Jun 20 Python
python实现泊松图像融合
Jul 26 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
Python编程源码报错解决方法总结经验分享
Oct 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
mysq GBKl乱码
2006/11/28 PHP
用php解析html的实现代码
2011/08/08 PHP
PHP Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
PHP中phar包的使用教程
2017/06/14 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
js如何打印object对象
2015/10/16 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
在Django框架中编写Context处理器的方法
2015/07/20 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
Python中的id()函数指的什么
2017/10/17 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
安全负责人任命书
2014/06/06 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
写给医生的感谢信
2015/01/22 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
Python中with上下文管理协议的作用及用法
2022/03/18 Python