怎么使用Python处理KNN分类算法

KNN分类算法的介绍

KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优异的分类算法。

他的核心思想就是,要确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。简单的说就是让最相似的K个样本来投票决定。

这里所说的距离,一般最常用的就是多维空间的欧式距离。这里的维度指特征维度,即样本有几个特征就属于几维。

KNN示意图如下所示。(图片来源:百度百科)

怎么使用Python处理KNN分类算法

上图中要确定测试样本绿色属于蓝色还是红色。

显然,当K=3时,将以1:2的投票结果分类于红色;而K=5时,将以3:2的投票结果分类于蓝色。

KNN算法简单有效,但没有优化的暴力法效率容易达到瓶颈。如样本个数为N,特征维度为D的时候,该算法时间复杂度呈O(DN)增长。

所以通常KNN的实现会把训练数据构建成K-D Tree(K-dimensional tree),构建过程很快,甚至不用计算D维欧氏距离,而搜索速度高达O(D*log(N))。

不过当D维度过高,会产生所谓的”维度灾难“,最终效率会降低到与暴力法一样。

因此通常D>20以后,较好使用更高效率的Ball-Tree,其时间复杂度为O(D*log(N))。

人们经过长期的实践发现KNN算法虽然简单,但能处理大规模的数据分类,尤其适用于样本分类边界不规则的情况。最重要的是该算法是很多高级机器学习算法的基础。

当然,KNN算法也存在一切问题。比如如果训练数据大部分都属于某一类,投票算法就有很大问题了。这时候就需要考虑设计每个投票者票的权重了。

测试数据

测试数据的格式仍然和前面使用的身高体重数据一致。不过数据稍微增加了一些

1.5 40 thin1.5 50 fat1.5 60 fat1.6 40 thin1.6 50 thin1.6 60 fat1.6 70 fat1.7 50 thin1.7 60 thin1.7 70 fat1.7 80 fat1.8 60 thin1.8 70 thin1.8 80 fat1.8 90 fat1.9 80 thin1.9 90 fat

Python代码实现

scikit-learn提供了优异的KNN算法支持。

import numpy as npfrom sklearn import neighborsfrom sklearn.metrics import precision_recall_curvefrom sklearn.metrics import classification_reportfrom sklearn.cross_validation import train_test_splitimport matplotlib.pyplot as plt ''' 数据读入 '''data = []labels = []with open("data\1.txt") as ifile: for line in ifile:  tokens = line.strip().split(' ')  data.append([float(tk) for tk in tokens[:-1]])  labels.append(tokens[-1])x = np.array(data)labels = np.array(labels)y = np.zeros(labels.shape) ''' 标签转换为0/1 '''y[labels=='fat']=1 ''' 拆分训练数据与测试数据 '''x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2) ''' 创建网格以方便绘制 '''h = .01x_min, x_max = x[:, 0].min() - 0.1, x[:, 0].max() + 0.1y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),   np.arange(y_min, y_max, h)) ''' 训练KNN分类器 '''clf = neighbors.KNeighborsClassifier(algorithm='kd_tree')clf.fit(x_train, y_train) '''测试结果的打印'''answer = clf.predict(x)print(x)print(answer)print(y)print(np.mean( answer == y)) '''准确率与召回率'''precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))answer = clf.predict_proba(x)[:,1]print(classification_report(y, answer, target_names = ['thin', 'fat'])) ''' 将整个测试空间的分类结果用不同颜色区分开'''answer = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]z = answer.reshape(xx.shape)plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8) ''' 绘制训练样本 '''plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)plt.xlabel(u'身高')plt.ylabel(u'体重')plt.show()

结果分析

输出结果:
[ 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1.]
[ 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 0. 1. 1. 0. 1.]
准确率=0.94, score=0.94
precision recall f1-score support
thin 0.89 1.00 0.94 8
fat 1.00 0.89 0.94 9
avg / total 0.95 0.94 0.94 17

怎么使用Python处理KNN分类算法

KNN分类器在众多分类算法中属于最简单的之一,需要注意的地方不多。有这几点要说明:

1、KNeighborsClassifier可以设置3种算法:‘brute’,‘kd_tree’,‘ball_tree’。如果不知道用哪个好,设置‘auto’让KNeighborsClassifier自己根据输入去决定。

2、注意统计准确率时,分类器的score返回的是计算正确的比例,而不是R2。R2一般应用于回归问题。

3、本例先根据样本中身高体重的最大最小值,生成了一个密集网格(步长h=0.01),然后将网格中的每一个点都当成测试样本去测试,最后使用contourf函数,使用不同的颜色标注出了胖、廋两类。

容易看到,本例的分类边界,属于相对复杂,但却又与距离呈现明显规则的锯齿形。

这种边界线性函数是难以处理的。而KNN算法处理此类边界问题具有天生的优势。我们在后续的系列中会看到,这个数据集达到准确率=0.94算是很优异的结果了。

到此,相信大家对“怎么使用Python处理KNN分类算法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文章标题:怎么使用Python处理KNN分类算法,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/23529

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月8日 上午1:29
下一篇 2022年9月8日 上午1:31

相关推荐

  • mathtype下载了用不了如何解决

    mathtype下载了用不了解决方法 1、首先确保我们下载的mathtype是可以使用的,如果不能确定,建议在本站重新下一个。 2、下载安装完成之后,如果还是用不了,打开word点击“文件” 3、选择左下角“选项” 4、进入“信任中心”,点击“信任中心设置” 5、将office的“startup”文…

    2022年9月15日
    44700
  • 如何分析APK安全及自动化审计

    一、 闲聊 说到移动安全,可能大家比较陌生,因为这方面的研究是在最近几年才逐渐火起来的。那么什么是移动安全呢?首先,我们知道,移动安全无非就是ios平台和安卓平台上的一些安全性的问题,包括平台系统系统本身的一些问题和应用层面上的问题。当然在客户端和服务端在进行交互的时候还需要涉及一些通信协议,主要是…

    2022年9月10日
    79600
  • 猫鼠服务器是什么公司

    猫鼠(Cats and Mouse)服务器可能是您要询问的一种服务器类型,或者是一个特定服务器名称的误解,但在知识库中并无明确的记录表示猫鼠服务器代表着一个具体的公司。如果您是在询问一个公司或品牌名为“猫鼠”的服务器供应商,可能需要提供更多信息或者具体的上下文才能得出准确答案。如果您实际上指的是一个…

    2024年4月25日
    2000
  • laravel是否内置了vue

    laravel没有内置vue;laravel是使用PHP语言编写的网页程序开发框架,而vue是一个用于创建用户界面的开源JavaScript框架,可以在laravel中部署vue,但是laravel中并不存在内置vue。 本文操作环境:Windows10系统、Laravel9版、Dell G3电脑。…

    2022年9月1日
    66700
  • Javascript如何使用数据填充数组

    用数据填充数组 如果我们需要用一些数据来填充数组,或者需要一个具有相同值的数据,我们可以用fill()方法。 var plants = new Array(8).fill(‘8’);console.log(plants); // [‘8’, ‘8’, ‘8’,’8′, ‘8’, ‘8’,’8′, ‘…

    2022年8月30日
    50200
  • 网易服务器等级是什么

    网易服务器等级详解 在谈论网易服务器等级时,我们主要关注的是性能、稳定性、服务支持与安全等维度。1、 网易云提供的服务器种类繁多,以满足不同规模业务的需求。2、 它们的稳定性和高性能得到了业界的广泛认可。3、 网易云还提供专业的服务支持和严格的安全措施,确保客户数据的安全。在这些方面,网易云服务器的…

    2024年4月23日
    4400
  • MySQL约束与多表查询实例分析

    本篇内容主要讲解“MySQL约束与多表查询实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL约束与多表查询实例分析”吧! 1.约束 概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和…

    2022年9月18日
    92300
  • MySQL读写分离基本原理是什么

    一、读写分离工作原理 在一些大型网站业务场景中,单台数据库服务器所能提供的并发量已经无法满足业务需求,为了满足这种情况,一般而言是通过主从同步的方式来同步数据,在此基础上,通过读写分离来提升数据库的并发和负载能力。 一般而言,业务场景下对数据库的查询操作要远远高于增、删和改,并且读操作对数据库的影响…

    2022年9月13日
    58000
  • mysql如何关闭事务

    mysql关闭事务的步骤:1、使用“win+r”键打开“运行”窗口,输入cmd并回车,打开cmd命令窗口;2、在cmd窗口中,执行“mysql -u root -p”命令并输入密码来登录mysql服务,进入MySQL界面;3、在MySQL命令界面中,执行“start transaction;”或者“…

    2022年9月24日
    1.3K00
  • Windows wifi的ip地址指的是什么

    wifi的ip地址指的是路由器的管理员地址;wifi是一种高频无线电信号,相当于有线传输中的网线,ip地址是一种统一的地址格式,它为互联网上的每一个网络设备和每一台终端分配一个逻辑地址,根据路由器品牌型号的不同,其wifi的ip地址也会不同。 本教程操作环境:windows10系统、DELL G3电…

    2022年9月2日
    76600
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部