用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 制作图片转pdf工具
Jan 30 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
matplotlib设置legend图例代码示例
Dec 19 Python
Python使用googletrans报错的解决方法
Sep 25 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
如何用Python徒手写线性回归
Jan 25 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
php实现微信支付之现金红包
2018/05/30 PHP
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
vue-devtools的安装步骤
2018/04/23 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python素数检测的方法
2015/05/11 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
2014年学生会工作总结
2014/11/07 职场文书
追悼会答谢词范文
2015/09/29 职场文书
护理自荐信
2019/05/14 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android