用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实现爬虫下载漫画示例
Feb 16 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
Python with语句和过程抽取思想
Dec 23 Python
TensorFlow tensor的拼接实例
Jan 19 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 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
我的论坛源代码(六)
2006/10/09 PHP
swfupload 多文件上传实现代码
2008/08/27 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
php数字运算验证码的实现代码
2015/07/30 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
PHP自定义多进制的方法
2016/11/03 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
JS添加或删除HTML dom元素的方法实例分析
2019/03/05 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
python多进程操作实例
2014/11/21 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
python 简单的调用有道翻译
2020/11/25 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
软件测试面试题
2014/01/05 面试题
金融专业个人求职信
2013/09/22 职场文书
购房意向书
2014/08/30 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
个人借条范本
2015/05/25 职场文书
PL350与SW11的比较
2021/04/22 无线电