怎么使用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

相关推荐

  • windows xbox控制台如何打开

    xbox控制台打开方法: 1、打开菜单,然后在目录中找到X开头的字母,即可找到Xbox控制台小帮手。 2、在搜索框中搜索xbox,即可找到“Xbox 控制台小帮手”进行打开。 3、打开Xbox后,在主界面中,点击“以后再说,我想使用Xbox主机小帮手应用”后即可进入登录界面。 4、这个时候,我们需要…

    2022年9月22日
    32200
  • word页码从第二页开始为1怎么设置

    word页码从第二页开始为1设置的方法: 1、首先点击名列前茅页的页尾。 2、然后选择任务选项栏中的“布局”。 3、随后点击“分隔符”选择分节符下方的“下一页”。 4、随后到要进行设置的第二页页尾并选中页码。 5、点击上方的“链接到前一节”将其取消。 6、随后回到名列前茅页的页码,选中并将其删除。 …

    2022年9月22日
    1.6K00
  • word图片不能全部显示怎么解决

    解决方法: 1、首先新建一个word文档,然后插入图片,此时会发现插入的图片仅显示一小部分。 2、然后将光标位置置于图片的末尾,并右击鼠标,进入“段落”选项。 3、然后需要切换到“缩进与间距”选项卡中。 4、在该选项卡中,将“行距”设置为“单倍行距”,点击保存并退出。 5、此时在进入word查看显示…

    2022年9月20日
    61100
  • windows vc运行库介绍及常见问题怎么解决

    vc运行库是干嘛的 答:vc运行库主要是用于软件的运行支持。 1、vc运行库是使用microsoft visual studio编写的一系列.dll文件合集。 2、因此vc运行库主要服务于一些同样使用类似语言编写的软件或游戏。 3、相信很多朋友都遇到过打开软件出现弹窗提示错误代码,无法启动的问题。 …

    2022年9月20日
    26900
  • 用于解析mac地址的协议是哪个

    用于解析mac地址的协议是“RARP”。RARP(反向地址转换协议)可以将MAC地址解析为IP地址,允许局域网的物理机器从网关服务器的ARP表或者缓存上请求其IP地址。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。 本教程操作环…

    2022年9月18日
    20800
  • windows bios设置u盘启动没有u盘选项如何解决

    解决方法: 1、启动盘制作完成之后,可以在开机的页面中按启动热键F8进入“bios”。 2、在这里可以找到usb高级设置的选项,将其状态改为启动,右侧类型改为“enabled”。 3、设置完成没有找到usb选项的话可以切换至boot,点击图中所指进入设置。 4、在这里你可以看到光标的位置,启动优选的…

    2022年9月22日
    26500
  • coreldraw如何编辑文字

    coreldraw编辑文字的方法 1、首先找到你要修改的cdr文件。 2、打开软件,点击文件,打开。 3、在软件的左侧找到文字工具。 4、鼠标放到需要修改的文字上面,进行修改。 5、再次点击上方菜单栏的文件,保存即可。 感谢各位的阅读,以上就是“coreldraw如何编辑文字”的内容了,经过本文的学…

    2022年9月26日
    27100
  • potplayer播放视频没有声音如何解决

    potplayer播放视频没有声音的详细教程解决方法: 1、打开potplayer安装程序,然后选择【简体中文】,点击【OK】。 2、然后就是点击【下一步】,点击【我接受】。 3、在组件界面中,在【关联】下面,勾选上【关联所有格式】,其它的就随便了,然后点击【下一步】。 4、然后选择好位置以后,点击…

    2022年9月1日
    85000
  • 路由器wps有哪些优缺点

    路由器wps是“Wi-Fi安全防护设置”的意思;wps是“Wi-Fi Protected Setup”的简称,是由“Wi-Fi”联盟所推出的全新“Wi-Fi”安全防护设定标准,用于简化“Wi-Fi”无线的安全设置和网络管理,支持个人识别码模式和按钮模式。 本教程操作环境:windows10系统、DE…

    2022年9月6日
    18400
  • SpringBoot怎么进行整合Druid数据源

    1.自定义方式 使用自定义方式整合Druid 1.添加依赖 在pom.xml添加相关依赖 <!–数据库相关–> <dependency> <groupId>org.springframework.boot</groupId> <artifac…

    2022年9月15日
    18900
联系我们
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部