python算法的基本原理_kNN算法基本原理与Python代码实践

kNN是一种常见的监督学习方法。工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可以使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。[1]

kNN的伪代码如下:[2]

对未知类别属性的数据集中的每个点依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离;

(2)按照距离递增次序排序;

(3)选取与当前点距离最小的k个点;

(4)确定前k个点所在类别的出现频率;

(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

以下通过图来进一步解释:

假定要对紫色的点进行分类,现有红绿蓝三个类别。此处以k为7举例,即找出到紫色距离最近的7个点。

分别找出到紫色距离最近的7个点后,我们将这七个点分别称为1、2、3、4、5、6、7号小球。其中红色的有1、3两个小球,绿色有2、4、5、6四个小球,蓝色有7这一个小球。

显然,绿色小球的个数最多,则紫色小球应当归为绿色小球一类。

以下给出利用kNN进行分类任务的最基本的代码。

KNN.py文件内定义了kNN算法的主体部分

from numpy import *

import operator

def createDataSet():

group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0.0, 0.1]])

labels = ['A', 'A', 'B', 'B']

return group, labels

def kNN_Classify(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]

diffMat = tile(inX, (dataSetSize, 1)) - dataSet

#关于tile函数的用法

#>>> b=[1,3,5]

#>>> tile(b,[2,3])

#array([[1, 3, 5, 1, 3, 5, 1, 3, 5],

# [1, 3, 5, 1, 3, 5, 1, 3, 5]])

sqDiffMat = diffMat ** 2

sqDistances = sum(sqDiffMat, axis = 1)

distances = sqDistances ** 0.5# 算距离

sortedDistIndicies = argsort(distances)

#关于argsort函数的用法

#argsort函数返回的是数组值从小到大的索引值

#>>> x = np.array([3, 1, 2])

#>>> np.argsort(x)

#array([1, 2, 0])

classCount = {} # 定义一个字典

# 选择k个最近邻

for i in range(k):

voteLabel = labels[sortedDistIndicies[i]]

# 计算k个最近邻中各类别出现的次数

classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

# 返回出现次数最多的类别标签

maxCount = 0

for key, value in classCount.items():

if value > maxCount:

maxCount = value

maxIndex = key

return maxIndex

KNN_TEST.py文件中有两个样例测试。

#!/usr/bin/python

# coding=utf-8

import KNN

from numpy import *

# 生成数据集和类别标签

dataSet, labels = KNN.createDataSet()

# 定义一个未知类别的数据

testX = array([1.2, 1.0])

k = 3

# 调用分类函数对未知数据分类

outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)

print("Your input is:", testX, "and classified to class: ", outputLabel)

testX = array([0.1, 0.3])

outputLabel = KNN.kNN_Classify(testX, dataSet, labels, 3)

print("Your input is:", testX, "and classified to class: ", outputLabel)

代码输出:

画图解释一下输出结果:

参考文献:

[1]机器学习,周志华,清华大学出版社2016.

[2]机器学习实战,Peter Harrington,人民邮电出版社.

2019-03-06

01:52:08

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

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

相关文章

python中zip的使用_浅谈Python中的zip()与*zip()函数详解

前言1.实验环境: Python 3.6;2.示例代码地址:下载示例;3.本文中元素是指列表、元组、字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表)。zip(*iterables)函数详解zip()函数的定义从参数中的多个迭代器取元素组合成一个新的迭代…

奥的斯电梯tt服务器使用表_奥的斯电梯服务器TT使用说明1

目录一、TT介绍............................................................................................................... 3二、OTIS TT插头各针脚说明................................................................................................. 4三、T…

python安装提示缺少dll_解决Python安装时报缺少DLL问题【两种解决方法】

准备开始学习Python,但是刚准备环境搭建时就遇到了下面的错误:仔细的看了看,说是缺少DLL。对于这个问题的解决办法:方法一:1. 在安装包上点右键以管理员身份运行2. C:\Users\用户名\AppData\Local\Temp 文件夹上右键-&…

影像科dsa为什么必须买维修保险_了解什么是DSA,看这篇就够了

相对于超声、CT、磁共振等,DSA可能对大部分人而言都是比较陌生的,目前国内DSA市场基本都是进口品牌主导,国内能生产这种医疗设备的屈指可数,也就是说,目前我们在医院看到的DSA设备基本都来自"GPST"等进口厂商…

python tkinter下载器_下载小说还要去找网站?Python使用tkinter打造一个小说下载器...

前言今天教大家用户Python GUI编程——tkinter 打造一个小说下载器,想看什么小说,就下载什么小说先看下效果图Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。作为 python 特定的GU…

python while循环if_20170403Python控制流if、while、for语句学习

控制流if、while、for语句学习if elif else语句if语句是一种最常见的控制流语句类型。它用于判断一个条件,如果为True,则执行紧跟其后的代码块。一条if语句可以跟上一个或多个elif块以及一个“滴水不漏”的else块(如果所有条件都为False)。if ... :Print…

审计日志_Oracle审计日志过大?如何清理及关闭审计机制?

概述oracle 11g推出了审计功能,但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,默认情况下,系统为了节省资源,减少I/0操作,其审计功能是关闭的。这段时间发现审计占了比较多空间&…

windows7 python 指定源组播 10049_Python3组播通信编程实现教程(发送者+接收者)

一、说明1.1 标准组播解释通信分为单播、多播(即组播)、广播三种方式单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式广播指发送者发送之后,IP数据包被路由器发给与其连…

servlet如何使用session把用户的手机号修改_SpringBoot源码学习系列之嵌入式Servlet容器...

1、前言简单介绍SpringBoot的自动配置就是SpringBoot的精髓所在;对于SpringBoot项目是不需要配置Tomcat、jetty等等Servlet容器,直接启动application类既可,SpringBoot为什么能做到这么简捷?原因就是使用了内嵌的Servlet容器&…

mybatisplus新增返回主键_第17期:索引设计(主键设计)

表的主键指的针对一张表中的一列或者多列,其结果必须能标识表中每行记录的唯一性。InnoDB 表是索引组织表,主键既是数据也是索引。主键的设计原则1. 对空间占用要小上一篇我们介绍过 InnoDB 主键的存储方式,主键占用空间越小,每个…

mysql 集群与主从_Mysql集群和主从

1、Mysql cluster: share-nothing,分布式节点架构的存储方案,以便于提供容错性和高性能。需要用到mysql cluster安装包,在集群中的每一个机器上安装。有三个关键概念:Sql节点(多个),数据节点(多个),管理节点(一个)&…

python四则运算_四则运算 python

java转换json需要导入的jar包,org/apache/commons/lang/exception/NestableRuntimeException缺少相应jar包都会有异常,根据异常找jar包导入...... 这里我说下lang包,因为这个包我找了好半天: 我用的是: commons-lang…

mysql 字段排重_MySQL 根据单个、多个字段排重

情景是这样的 首先我们业务需要 在一张流水表中需要进行流水的记录 这个记录是从别的平台拉过来的数据 但是他们数据无唯一约束 即流水这样就很有可能出现单条数据重复的问题所以这种情况 用join的话 效率可能不是很大 所以就写了以下sql注意 排重后还需保留一个唯一有效的记录…

python开发框架 代码生成_我的第一个python web开发框架(31)——定制ORM(七)...

几个复杂的ORM方式都已介绍完了,剩下一些常用的删除、获取记录数量、统计合计数、获取最大值、获取最小值等方法我就不一一详细介绍了,直接给出代码大家自行查看。1 #!/usr/bin/env python2 #codingutf-834 from common importdb_helper567 classLogicBa…

mysql里边字符函数_mysql函数(一.字符函数)

一.字符函数1.LENGTH(str)字符长度函数:一个汉字为三个字符(1)查看某字符串的长度(比如名字)select LENGTH(sunchuangye); 结果:11(2)根据字符长度进行倒序(比如名字)select id,userName FROM t_user ORDER BY LENGTH(userName) DESC;2.CONCAT(str1,s…

redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案

点击上方“码农沉思录” 发现更多精彩我先说下结果。我现在还不敢放线上去测,这是本地测的数据,我4g内存的电脑本地开redis,一次都没写完过全部数据,都是写一半后不是redis挂就是测试程序挂。可以肯定的是总记录数是以千万为单位…

linux mysql提示1045_linux mysql ERROR 1045

介绍了一下安装MySQL后登陆MySQL时会遇到ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 这个错误,当时不知道真正的原因,搜索了一些网上的资料,测试验证了如何解决这个问题,但是一直不知道具体…

mysql原生库_Mysql数据库的一些简单原生sql语句

原生sql语句查询:select * from 表名 :查找表内所有数据, * 代表所有where 具体条件 :where作位查询sql语句条件,例 select * from 表名 where 字段名指定值order by 升降序:与desc和asc使用,通常以int类型字段进行升…

有向图生成树是如何画的_漫画:什么是最小生成树?

作者 | 小灰来源 | 程序员小灰————— 第二天 —————————————————首先看看第一个例子,有下面这样一个带权图:它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小&a…

python经济_python生成器——懒到欠揍,但很经济

生成器的特点是工作到一半,就会停下来看别人干活直至有人踢它屁股,这时它才继续往下干活。实现这一功能的精髓要用到yield。生成器是一种特殊的迭代器,因此我们先来了解一下什么是迭代器。我们都知道著名的斐波那契数列:1、1、2、…