K最近邻分类器

转自: http://www.cnblogs.com/qwertWZ/p/4582096.html


本章介绍了《机器学习实战》这本书中的第一个机器学习算法:k-近邻算法,它非常有效而且易于掌握。首先,我们将探讨k-近邻算法的基本理论,以及如何使用距离测量的方法分类物品;其次我们将使用Python从文本文件中导入并解析数据;再次,本文讨论了当存在许多数据来源时,如何避免计算距离时可能碰到的一些常见错误;最后,利用实际的例子讲解如何使用k-近邻算法改进约会网站和手写数字识别系统。

回到顶部

1. k-近邻算法概述

简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。

k-近邻算法

优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型

k-近邻算法(kNN)的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

现在我们回到前面电影分类的例子,使用k-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,图1显示了6部电影的打斗和接吻镜头数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用kNN来解决这个问题。

机器学习实战.pdf - Adobe Acrobat Pro

 

图1 使用打斗和接吻镜头数分类电影

首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,图1中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。

表1 每部电影的打斗镜头数、接吻镜头数以及电影评估类型

电影名称 打斗镜头 接吻镜头 电影类型
California Man 3 104 爱情片
He’s Not Really into Dudes 2 100 爱情片
Beautiful Woman 1 81 爱情片
Kevin Longblade 101 10 动作片
Robo Slayer 3000 99 5 动作片
Amped II 98 2 动作片
? 18 90 未知

计算未知电影与样本集中其他电影的距离,我们可以比较其相似度:

表2 已知电影与未知电影的距离

电影名称 与未知电影的距离
California Man 20.5
He’s Not Really into Dudes 18.7
Beautiful Woman 19.2
Kevin Longblade 115.3
Robo Slayer 3000 117.4
Amped II 118.9

现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到k个距离最近的电影。假定k=3,则三个最靠近的电影依次是He’s Not Really into Dudes、Beautiful Woman和California Man。k-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

k-近邻算法的一般流程

收集数据:可以使用任何方法。 
准备数据:距离计算所需要的数值,最好是结构化的数据格式。 
分析数据:可以使用任何方法。 
测试算法:计算错误率。 
使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类。

1.1 准备:使用Python导入数据

创建名为kNN.py的Python模块,在kNN.py文件中增加下面的代码:

1
2
3
4
5
6
7
from numpy import *
import operator
 
def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

这个函数创建了我们将要使用的样例数据集。

在Python shell中输入下列命令测试上面的函数:

1
2
>>> import kNN
>>> group, labels = kNN.createDataSet()

1.2 实施kNN算法

k-近邻算法的伪代码

对未知类型属性的数据集中的每个点依次执行以下操作:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离增序排序;
(3) 选取与当前点距离最近的k个点;
(4) 决定这k个点所属类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。

函数实现如下:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程安全问题1

1.问题的产生 原因:多个线程操作同一个共享数据。 原理:多个线程在访问共享数据时,由于CPU的随机性,一个线程还没有执行完,执行权被其他线程抢走了,这个时候就有可能出现线程安全问题。 解决方式&#xff…

Java父类强制转换子类原则

转载自 Java父类强制转换子类原则最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了。 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序&am…

生产者和消费者案例

1.案例描述 这里以吃饭为例,假设有一个桌子,用来存汉堡包,然后有厨师和消费者,厨师往桌子上放汉堡包,消费者从桌子上取走汉堡包。当两者在一个时间段同时进行多次自己的操作时,很明显这就是多线程编程的生…

用Python开始机器学习(4:KNN分类算法)

转自: http://blog.csdn.net/lsldd/article/details/41357931 1、KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法。 他的…

Mybatis传递多个参数的4种方式

转载自 Mybatis传递多个参数的4种方式(干货)现在大多项目都是使用Mybatis了,但也有些公司使用Hibernate。使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数。面对各种复杂的业务场景,传递参数也是一…

多线程安全问题2

1.volatile关键字 <1>作用&#xff1a;强制线程每次在使用的时候,都会看一下共享区域最新的值[用于提供线程安全] <2>与synchronized的区别和联系&#xff1a; 把代码块声明为 synchronized&#xff0c;有两个重要后果&#xff0c;通常是指该代码具有 原子性&…

Maven Optional Exclusions使用区别

转载自 Maven Optional & Exclusions使用区别 Optional和Exclusions都是用来排除jar包依赖使用的&#xff0c;两者在使用上却是相反。 Optional定义后&#xff0c;该依赖只能在本项目中传递&#xff0c;不会传递到引用该项目的父项目中&#xff0c;父项目需要主动引用该依赖…

为什么jdk的CLASSPATH环境变量需要设置rt.jar 和 tools.jar

How Classes are Found 中有说明&#xff1a;&#xff08;java启动类文件在 rt.jar中&#xff0c; 而 工具类文件在 tools.jar 中&#xff09; How the Java Launcher Finds Classes The Java launcher, java, initiates the Java virtual machine. The virtual machine searc…

线程池的实现

1.创建线程池 API提供了一个工具类叫Executors&#xff0c;可以用它的方法生成不同特点的线程池&#xff0c;返回一个ExecutorService对象。 <1>Executors.newCachedThreadPool() 【池子中默认是空的&#xff0c;最多可以容纳int类型的最大值】 <3>Executors.new…

JSON Web Token (JWT),服务端信息传输安全解决方案

转载自 JSON Web Token (JWT)&#xff0c;服务端信息传输安全解决方案JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519)&#xff0c;它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式。这些信息可以被验证和信任&#xff0c;因为它是数字签名的。JWTs可…

thinking-in-java(18) java io

【0】README&#xff1a;本篇文章是以 thinking in java 为基础梳理的&#xff1b; 【18.1.1 目录列表器】 // 传入正则表达式以过滤文件名如 (.*src)* public class DirList {public static void main(String[] args) {File path new File(".");String[] list; i…

并发工具类【线程安全相关的类】

1.Hashtable和ConcurrentHashMap Hashtable&#xff1a;哈希表结构&#xff08;数组链表&#xff09;&#xff0c;线程安全的(同步代码块&#xff0c;效率低) ConcurrentHashMap&#xff1a; jdk7:采用Segment数组[不会扩容] HashEntry[二次哈希计算存入的位置,可扩容]&#…

JSON Web Token (JWT)生成Token及解密实战

转载自 JSON Web Token (JWT)生成Token及解密实战昨天讲解了JWT的介绍、应用场景、优点及注意事项等&#xff0c;今天来个JWT具体的使用实践吧。从JWT官网支持的类库来看&#xff0c;jjwt是Java支持的算法中最全的&#xff0c;推荐使用&#xff0c;网址如下。https://github.co…

java中两个map的融合(两个map有相同字段)

试想这样一个场景&#xff1a; 数据库表中 有 城市信息表 city_tbl&#xff1b; 有院士信息表 ys_tbl &#xff0c;其中院士有城市id字段&#xff08;id&#xff09;&#xff1b; 但是不是所有城市都有院士&#xff1b; 我们想要得到 城市的详细信息&#xff0c;包括院士个数…

网络编程实现

1.网络编程三要素 1.IP地址&#xff1a;网络中设备的唯一标识IPv4: 由4个字节组成&#xff0c;点分十进制表示法IPv6: 由16个字节组成&#xff0c;冒分十六进制表示法"127.0.0.1"本地主机网络地址【用于测试】相关命令&#xff1a;ipconfig: 查看本机在当前网络环境…

通用唯一标识码UUID的介绍及使用

转载自 通用唯一标识码UUID的介绍及使用。什么是UUID&#xff1f; UUID全称&#xff1a;Universally Unique Identifier&#xff0c;即通用唯一识别码。 UUID是由一组32位数的16进制数字所构成&#xff0c;是故UUID理论上的总数为16^32 2^128&#xff0c;约等于3.4 x 10^38。也…

IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法

【1】README 毕业前写了一篇 英文paper&#xff0c; 接受后&#xff0c;需要提交到 IEEE PDF Express 做格式检测&#xff1b;&#xff1b;latex源码中引用了 Visio生成的算法流程图&#xff0c;PDF文件&#xff1b; 谁料&#xff0c;哥子提交上去后&#xff0c;报如下错误&…

类加载器的创建

1.什么是类加载器 <1>概念&#xff1a;类加载器是用来加载类的工具(从硬盘加载到JVM内存) <2>类加载器的加载时机【类在使用时才被加载&#xff0c;不使用不加载】 a.创建类的对象时 b.通过类名调用静态方法时 c.通过反射加载类 <3>3.类加载器的分类 a.启动…

Java 必看的 Spring 知识汇总

转载自 Java 必看的 Spring 知识汇总Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性的角度而言&#xff0c;绝大部分Java应用…

Java 截取反斜杠--java使用split拆分特殊字符

orgn link : http://blog.csdn.net/scy411082514/article/details/7987852 Java 截取反斜杠 replaceAll和split &#xff08;“\”&#xff09; 问题解决办法 2009年07月15日 星期三 上午 11:26 xxx.split("\\") 显然得不到想要的结果 正确方法 xxx.split(&qu…