k近邻算法是机器学习中原理最简单的算法之一,其思想为:给定测试样本,计算出距离其最近的k个训练样本,将这k个样本中出现类别最多的标记作为该测试样本的预测标记。
k近邻算法虽然原理简单,但是其泛华错误率却不超过贝叶斯最有分类器错误率的两倍。所以实际应用中,k近邻算法是一个“性价比”很高的分类工具。
基于欧式距离,用Python3.5实现kNN算法:

主程序:

from numpy import*
import operatordef myED(testdata,traindata):""" 计算欧式距离,要求测试样本和训练样本以array([ [],[],...[] ])的形式组织,每行表示一个样本,一列表示一个属性"""size_train=traindata.shape[0] # 训练样本量大小size_test=testdata.shape[0] # 测试样本大小XX=traindata**2sumXX=XX.sum(axis=1) # 行平方和YY=testdata**2sumYY=YY.sum(axis=1) # 行平方和Xpw2_plus_Ypw2=tile(mat(sumXX).T,[1,size_test])+\tile(mat(sumYY),[size_train,1])EDsq=Xpw2_plus_Ypw2-2*(mat(traindata)*mat(testdata).T) # 欧式距离平方distances=array(EDsq)**0.5 #欧式距离return distancesdef mykNN(testdata,traindata,labels,k):""" kNN算法主函数,labels组织成列表形式 """size_test=testdata.shape[0]D=myED(testdata,traindata)Dsortindex=D.argsort(axis=0) # 距离排序,提取序号nearest_k=Dsortindex[0:k,:] # 提取最近k个距离的样本序号label_nearest_k=array(labels)[nearest_k] # 提取最近k个距离样本的标签    label_test=[]if k==1:label_test=label_nearest_kelse:for smp in range(size_test):classcount={}labelset=set(label_nearest_k[:,smp]) # k个近邻样本的标签集合for label in labelset:classcount[label]=list(label_nearest_k[:,smp]).count(label)# 遍历k个近邻样本的标签,并计数,并以字典保存标签和计数结果sortedclasscount=sorted(classcount.items(),\key=operator.itemgetter(1),reverse=True) # 按照计数结果排序label_test.append(sortedclasscount[0][0]) # 提取出现最多的标签return label_test,D

示例:

# 以下示例数据摘自周志华《机器学习》P202表9.1
labels=[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]
traindata=array([[0.6970,0.4600],[0.7740,0.3760],[0.6340,0.2640],\
[0.6080,0.3180],[0.5560,0.2150],[0.4030,0.2370],[0.4810,0.1490],\
[0.4370,0.2110],[0.6660,0.0910],[0.2430,0.2670],[0.2450,0.0570],\
[0.3430,0.0990],[0.6390,0.1610],[0.6570,0.1980],[0.3600,0.3700],\
[0.5930,0.0420],[0.7190,0.1030]])
testdata=array([[0.3590,0.1880],[0.3390,0.2410],[0.2820,0.2570],\
[0.7480,0.2320],[0.7140,0.3460],[0.4830,0.3120],[0.4780,0.4370],\
[0.5250,0.3690],[0.7510,0.4890],[0.5320,0.4720],[0.4730,0.3760],\
[0.7250,0.4450],[0.4460,0.4590]])
k=5label_test,distances=mykNN(testdata,traindata,labels,k)
print('\n')
print(label_test)

示例结果:

>>[1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

k近邻(kNN)算法的Python实现(基于欧氏距离)相关推荐

  1. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  2. Python+OpenCV:理解k近邻(kNN)算法(k-Nearest Neighbour (kNN) algorithm)

    Python+OpenCV:理解k近邻(kNN)算法(k-Nearest Neighbour (kNN) algorithm) 理论 kNN is one of the simplest classi ...

  3. 机器学习——K近邻分类算法及python代码实现

    <机器学习:公式推导与代码实践>鲁伟著读书笔记. K近邻(K-nearest neighbor,K-NN)算法是一种经典的监督学习的分类方法.K近邻算法是依据新样本与k个与其相邻最近的样本 ...

  4. k近邻算法_K近邻(knn)算法是如何完成分类的?

    摘要:K近邻算法是机器学习中的一个非常基础的算法.本文通过自生成数据,通过绘图的方式演示KNN算法的思路,让你不看数学公式就看了解什么是KNN算法. 关键词:KNN算法 1 生成一个二分类的数据集 本 ...

  5. 机器学习算法(7)——K近邻(KNN)、K-means、模糊c-均值聚类、DBSCAN与层次与谱聚类算法

    1.K-近邻算法(KNN)概述 (有监督算法,分类算法) 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类.但是怎么可能 ...

  6. ML之kNN:k最近邻kNN算法的简介、应用、经典案例之详细攻略

    ML之kNN:k最近邻kNN算法的简介.应用.经典案例之详细攻略 目录 kNN算法的简介 1.kNN思路过程 1.1.k的意义 1.2.kNN求最近距离案例解释原理-通过实际案例,探究kNN思路过程 ...

  7. 【Python-ML】SKlearn库K近邻(KNN) 使用

    # -*- coding: utf-8 -*- ''' Created on 2018年1月15日 @author: Jason.F @summary: Scikit-Learn库K近邻分类算法 '' ...

  8. 机器学习之kNN算法(纯python实现)

    前面文章分别简单介绍了线性回归,逻辑回归,贝叶斯分类,并且用python简单实现.这篇文章介绍更简单的 knn, k-近邻算法(kNN,k-NearestNeighbor). k-近邻算法(kNN,k ...

  9. 机器学习100天(三十):030 K近邻分类算法-K值的选择

    机器学习100天,今天讲的是:K近邻分类算法-K值的选择. <机器学习100天>完整目录:目录 上一节我们讲了 K 折交叉验证的理论,下面我们将 K 折交叉验证算法应用到 K 近邻分类算法 ...

  10. 机器学习基础 KNN(K近邻)算法及sklearn的基本使用(附带一些基础概念)

    文章目录 一. K-近邻算法简介 1. 什么是K-近邻算法 1.1 K-近邻算法(KNN)概念 1.2 电影类型分析 1.3 KNN算法流程总结 2. 小结 二.K近邻算法api初步使用 1. Sci ...

最新文章

  1. NAR:rrnDB-16S拷贝数校正数据库
  2. android 数组赋值字符串_c++数组使用
  3. 区块链系列教程之:比特币中的网络和区块链
  4. JS疑惑-2(作用域)
  5. [css] 相邻兄弟选择器、后代选择器和子选择器三者有什么区别?
  6. SharePoint学习札记[2] — MOSS2007体系结构概述
  7. 2020快手移动游戏行业玩家数据价值报告
  8. Oracle 中国研发中心裁员已成定局,云时代下一个是谁?
  9. Spring技术原理之Spring IOC
  10. python---之super()继承,解决钻石继承难题
  11. nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题...
  12. Sql Server 存储过程分页大全(2005,2000)
  13. 人类最早计算机阿西莫夫,“人类先知”阿西莫夫50年前的2014年6大预言
  14. appcan mysql_AppCan 双击返回按钮退出应用 | 学步园
  15. 基于MATLAB的三重积分与曲线积分
  16. 卷积神经网络CNN简图
  17. Android6.0以上系统搜索不到 蓝牙BLE 设备问题
  18. 记一次授权的APK渗透测试
  19. CRFEntityExtractor文档
  20. 谷歌研究员Francois Chollet:有良知的AI研究人员不应该在Facebook工作

热门文章

  1. 我心中接地气的大数据【前言】
  2. angular写的移动端模板《二》
  3. .net c#识别图片二维码 图片处理(Img和BitMap)
  4. 十三水牌型 图片_十三水三分天下是什么 十三水三分天下牌型详解
  5. 解决 Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8
  6. Google Earth Engine APPS(GEE)——使用 AREA2 和 CODED 估算森林砍伐和退化面积(第 1 部分:运行 CODED)
  7. k8s java供应链项目篇
  8. 如何在 CentOS 7 上使用 RoundCube 管理邮箱
  9. 怎样的工作量评估更合理?
  10. 视频格式怎么改为mp4?用视频转换器轻松解决