K近邻(K-Nearest Neighor,KNN)学习是一种常用的监督学习方法,它的思想非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的K个训练样本,然后基于这K个邻居的信息进行预测。KNN是一种基本的机器学习算法。KNN既可以用作分类,也可以用作回归。KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别。而KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值。

一般通过交叉验证选择最优的K值。对于距离的度量方式,最常见的是欧氏距离:

KNN的主要优点有:
1) 理论成熟,思想简单,既可以用来做分类也可以用来做回归
2) 可用于非线性分类
3) 训练时间复杂度比支持向量机之类的算法低,仅为O(n)
4) 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
5) 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合
6)该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分
    
KNN的主要缺点有:
1)计算量大,尤其是特征数非常多的时候
2)样本不平衡的时候,对稀有类别的预测准确率低
3)使用懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢
4)相比决策树模型,KNN模型可解释性不强

# K近邻
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 随机生成数据
x, y = make_classification(n_clusters_per_class=1, n_samples=500, n_redundant=0, n_features=2, random_state=14)
# 数据划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2)# 画出原始数据
plt.scatter(x[:, 0], x[:, 1], c=y)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Orical Data')
plt.show()# 参数n_neighbor的选择
n_neighbors = [3, 5, 7, 9, 11]# 平均值
accuracy_list = []
# 方差
accuracy_std = []# 找到最优参数
for n in n_neighbors:knn = KNeighborsClassifier(n_neighbors=n)scores = cross_val_score(knn, x_train, y_train, cv=5)accuracy_list.append(scores.mean())accuracy_std.append(scores.std())# 可视化
plt.grid()
plt.plot(n_neighbors, accuracy_list)
plt.scatter(n_neighbors, accuracy_list, c='r')
plt.errorbar(n_neighbors, accuracy_list, accuracy_std, c='g')
plt.xlabel('n')
plt.ylabel('accuracy')
plt.show()# 由上图可以看出n_neighbor最优值为3
knn = KNeighborsClassifier(n_neighbors=3).fit(x_train, y_train)
y_pred = knn.predict(x_test)print('tesing accuracy:', accuracy_score(y_pred, y_test))# 画出训练集样本点
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)# 画出测试集样本点
for i in range(len(x_test)):if y_pred[i] == 0:plt.scatter(x_test[i, 0], x_test[i, 1], c='r')  # 标签为0的样本点else:plt.scatter(x_test[i, 0], x_test[i, 1], c='g')  # 标签为1的样本点plt.show()



机器学习:K近邻(KNN)相关推荐

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

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

  2. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  3. 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 ...

  4. 【机器学习经典算法】K近邻(KNN):核心与总结

    文章目录 1. 初识K近邻 2. 相知 2.1 K近邻三要素 2.2 KD树 2.2.1 kd树的构建 2.2.2 kd树的搜索 3. 总结 1. 初识K近邻 K-近邻(K-Nearest Neigh ...

  5. 深入理解机器学习——k近邻(kNN,k-Nearest Neighbor)算法:基础知识

    分类目录:<深入理解机器学习>总目录 k近邻(k-Nearest Neighbor,kNN)算法是一种常用的有监督学习算法,可以完成分类与回归的任务,其工作机制非常简单:给定测试样本,基于 ...

  6. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  7. 【Python机器学习】多项式回归、K近邻KNN回归的讲解及实战(图文解释 附源码)

    需要源码请点赞关注收藏后评论区留言私信~~~ 多项式回归 非线性回归是用一条曲线或者曲面去逼近原始样本在空间中的分布,它"贴近"原始分布的能力一般较线性回归更强. 多项式是由称为不 ...

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

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

  9. 机器学习--K近邻算法(KNN)(2)

    一.简介 K-Nearest-Neighbor 算法是一种常用的监督学习算法,它没有显式的训练过程,是'懒惰学习'的显著代表,此类学习算法仅在训练阶段将训练集保存起来,训练时间开销为0,待收到测试样本 ...

  10. 机器学习——K近邻算法(KNN)及其python实现

    参考视频与文献: https://www.bilibili.com/video/BV1HX4y137TN/?spm_id_from=333.788&vd_source=77c874a500ef ...

最新文章

  1. 高精度运算(C++实现)
  2. 让“云”无处不在-Citrix Xenserver之一 环境搭建
  3. LeetCode——1721.交换链表中的节点
  4. 河南科技大学计算机信息安全技术考试,关于申报2020年信息安全等级保护项目的通知...
  5. 智能会议系统(15)--- linphone-android 业务流程
  6. Siddhi : Siddhi maven 仓库
  7. java 栈的变量_深入Java核心:JVM中的栈和局部变量
  8. 转:Python 主进程被杀死时,如何保证子进程同时退出而不变为孤儿进程
  9. java list判断是否存在字符串_java怎么判断字符串是否存在于list集合中?
  10. 【产品必备软件合集】
  11. OPENCV+VS+QT,导入生成别人的.pro文件时提示opencv文件找不到,C1083:无法打开包括文件 opencv2/opencv.hpp
  12. RecSys2020推荐系统论文Recommending the Video to Watch Next: An Offline and Online Evaluation at YOUTV.de
  13. 2022.3.14 阿里笔试
  14. 锁定计算机后qq能远程吗,如何通过QQ进行远程控制(利用QQ远程协助在不同网络下远程控制电脑)...
  15. “阅读推广 + ”模式下高校图书馆空间再造藏书体系建设
  16. 手机上照片大小怎么改?如何用手机修改图片尺寸?
  17. 网络推广平台有哪些优势?
  18. Linux 修改只读文件
  19. 安装ros kinetic系统
  20. 关于QT跨平台和编译器的理解

热门文章

  1. 用python制作微信机器人程序编写_Python制作微信聊天机器人
  2. RedisTemplate设置redis的key时出现\xac\xed\x00\x05t\x00\x0f前缀
  3. redis的保存key,value出现\xac\xed\x00\x05t\x00\x0b的解决
  4. ITiM3.0 RoadMap
  5. 正弦稳态电路的相关概念
  6. 2345浏览器写CSDN博客错误
  7. Docker之网络模式和数据卷
  8. 小孔成像模型中四个坐标系的转换:世界 相机光心 图像毫米 像素
  9. Mac使用技巧:快捷键也可清理Safari浏览数据!
  10. 树莓派4B从USB-SSD启动ubuntu踩坑指北