用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+os根据文件名自动生成文本
Mar 21 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
python的一些加密方法及python 加密模块
Jul 11 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
python双向链表原理与实现方法详解
Dec 03 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
python 实现IP子网计算
Feb 18 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
Python绘制分类图的方法
Apr 20 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
Zerg剧情介绍
2020/03/14 星际争霸
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
php将数据库导出成excel的方法
2010/05/07 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
js 操作符实例代码
2009/10/24 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
python生成随机图形验证码详解
2017/11/08 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
python 怎样进行内存管理
2020/11/10 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
七一党建活动方案
2014/01/28 职场文书
教师网络培训感言
2014/03/09 职场文书
父母对孩子说的话
2014/04/12 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
初一数学教学反思
2016/02/17 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
《LOL》“克隆大作战”久违归来 幻灵战队皮肤上线
2022/04/03 其他游戏