1、认识KNN算法

K-近邻算法,也叫做KNN算法(K-Nearest Neighbor,KNN),其定义为:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

并且拥有如下的特性:

  • 适用于分类问题,尤其是二分类问题,当然也可以用来预测回归问题
  • 算法的思想非常的简单易懂,应用的数学知识很少
  • 虽然它的算法简单,但是效果很好

2、算法所需要的数学基础

距离公式:

其中,欧式距离也被称为欧几里得距离,例如在二维平面上,两点之间的距离表示如图所示

在多维平面中,欧氏距离表示为

其他距离的衡量还有:余弦值距离(cos), 相关度 (correlation), 曼哈顿距离 (Manhattan distance)

3、KNN例子

如图所示,在图中有两块区域的点,绿色的点和红色的点,可以将这个图想象成是我们疫情期间的绿码和红码。

这时候出现了一个新的人,我们将他的位置看成是蓝色的点,那么这个人是绿码还是红码呢?

在K近邻算法中,K的意思就是图中我们画的以蓝点为圆心的圈圈中的点的个数,我们可以发现,当我们K值取1的时候,圈里面只有绿点(1个),当我们K值取3的时候,圈里面也只有绿点(3个),根据K近邻算法的算法思想,这个时候我们就可以认为该点(也就是蓝点)属于绿色的阵营里面。

4、KNN算法过程

由刚刚的例子我们也可以总结出来,KNN算法的算法过程如下所示:

1) 确定K的大小和距离计算方法

2) 从训练样本中得到K个与测试最相似的样本

  1. 计算测试数据与各个训练数据之间的距离
  2. 按照距离的递增关系进行排序
  3. 选取距离最小的K个点
  4. 确定前K个点所在类别的出现频率
  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类

3) 根据K个组相似样本的类别,通过少数服从多数的方式来确定测试样本的类别

5、K值的选取

K=1                                                                    K=5

    

K的选取

  • K太大的时候,导致分类的影响
  • K太小的时候,受个例的影响,波动比较大

如何选取K

  • 经验
  • 均方根误差

6、算法的缺点

  • 算法复杂度较高(需要比较所有已知实例与要分类的实例)
  • 当其样本分布不平衡时,比如其中一类样本过大(实例数量 过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例实际并没有接近目标样本

7、KNN算法的总结

优点:

  • 简单有效
  • 重新训练的代价低
  • 适合类域交叉样本——KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
  • 适合大样本自动分类——该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

缺点:

  • 惰性学习
  • 类别评分不是规格化
  • 输出可解释性不强
  • 对不均衡的样本不擅长
  • 计算量较大

8、代码实例

链接:https://pan.baidu.com/s/1Zq2w-fZivzaDfLDGs8DUxQ?pwd=5jfn 
提取码:5jfn 
--KNN算法的实例

画图picture.py(本文一开始的绿色和红色图)

import numpy as np
import matplotlib.pyplot as plt# 定义特征值
raw_data_x = [[3.3144558, 2.33542461],[3.75497175, 1.93856648],[1.38327539, 3.38724496],[3.09203999, 4.47090056],[2.58593831, 2.13055653],[7.41206251, 4.80305318],[5.912852, 3.72918089],[9.21547627, 2.8132231],[7.36039738, 3.35043406],[7.13698009, 0.40130301]]# 定义目标值
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]X_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)# 利用matplotlib绘制图像
plt.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1], color='g')
plt.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1], color='r')
plt.show()#加入预测点
x = np.array([2.093607318, 2.365731514])plt.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1], color='g')
plt.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1], color='r')
plt.scatter(x[0], x[1], color='b')
plt.show()

样本集为网盘中的Prostate_Cancer.py

训练test.py

import random
import csv#读取
with open('Prostate_Cancer.csv','r') as file:reader = csv.DictReader(file)datas=[row for row in reader]# print(datas)#分组
random.shuffle(datas)
n = len(datas)//3
test_set = datas[0:n]
train_set = datas[n:]#KNN
def distance(d1,d2):res = 0for key in ("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):res += (float(d1[key])-float(d2[key]))**2return res**0.5K=33def knn(data):
#1.距离res = [{"result":train['diagnosis_result'],"distance":distance(data,train)}for train in train_set]#2.排序-升序res = sorted(res,key=lambda item:item['distance'])#3.取前K个res2 = res[0:K]#4.加权平均result = {'B': 0,'M': 0}#总距离sum = 0for r in res2:sum +=r['distance']for r in res2:result[r['result']]+=1-r['distance']/sumprint(result)print(data['diagnosis_result'])if result['B']>result['M']:return 'B'else:return 'M'#测试阶段
correct=0
for test in test_set:result = test['diagnosis_result'] #真实结果result2 = knn(test)#测试集结果if result == result2:correct+=1print(f"检测正确的数目:{correct}") #正确的个数
print(f"一共检测的样本数目:{len(test_set)}")  #一共的个数# knn(test_set[0])
print("检测的正确率:{:.2f}%".format(100*correct/len(test_set)))

实验结果

此时取的K值是5,当我们将K值取的过于大或者过于小时,可以发现实验的检测结果变差了。

赠言

梦想是不会发光的,发光的是追梦的我们,翻过这座山,他们就会听到你的故事。不管故事的结局是什么,当某人询问你时,你可以慷慨的向他们描述来时路上的一路生花。你未来的样子都藏在了现在的努力里,那么不妨大胆一点,“少年者,思无邪,而大道就在脚下,走!”

机器学习-KNN算法相关推荐

  1. 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例

    ** 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例. 具体knn算法是怎样的我这里就不再详细论述.在这里我注意总结我使用knn算法进行一个分类的分析 ** 分析过程 1.前期准备 引入 ...

  2. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  3. 机器学习KNN算法实践:预测城市空气质量

    出品:Python数据之道 作者:叶庭云 整理:Lemon 机器学习KNN算法实践 预测城市空气质量 「Python数据之道」导读: 之前在公众号上分享过 "图解KNN算法" 的内 ...

  4. 机器学习 —— KNN算法简单入门

    机器学习 -- KNN算法简单入门 第1关:手动实现简单kNN算法 1 KNN算法简介 1.1 kNN 算法的算法流程 1.2 kNN 算法的优缺点 1.3 编程要求+参数解释 2. 代码实现 3. ...

  5. 机器学习——KNN算法

    机器学习--KNN算法 文章目录 机器学习--KNN算法 前言 一.KNN原理基础 二.sklearn的基本建模流程 三.KNN算法调优:选取最优的K值 四.KNN中距离的相关讨论 1. KNN使用的 ...

  6. 开根号的笔算算法图解_机器学习KNN算法之手写数字识别

    1.算法简介 手写数字识别是KNN算法一个特别经典的实例,其数据源获取方式有两种,一种是来自MNIST数据集,另一种是从UCI欧文大学机器学习存储库中下载,本文基于后者讲解该例. 基本思想就是利用KN ...

  7. 经典实战案例:用机器学习 KNN 算法实现手写数字识别 | 原力计划

    作者 | 奶糖猫 来源 | CSDN 博客,责编 | 夕颜 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 算法简介 手写数字识别是KNN算法一个特别经典的实例,其数 ...

  8. python手写字母识别_机器学习--kNN算法识别手写字母

    本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...

  9. 机器学习——K-NN算法

    目录 一.  KNN的原理 二.  K-NN算法的注意事项 1. 如何选取K值 2. K-NN算法的优点 3. K-NN算法的缺点 三.  算法的Python实现 (1)用原理实现K-NN (2)调用 ...

  10. 机器学习KNN算法原理和应用分析

    KNN原理解析 K邻近算法(KNN),是一种非常简单有效的机器学习算法.KNN是通过计算不同特征值距离作为分类依据,即计算一个待分类对象不同特征值与样本库中每一个样本上对应特征值的差值,将每个维度差值 ...

最新文章

  1. 阿里云参加ONS EU 2018,飞天洛神亮相网络顶会
  2. 财务自由,一年赚500万,依然做社畜是什么感觉?
  3. Jmeter中的变量(三)
  4. 【Android】自己定义控件——仿天猫Indicator
  5. matlab替换矩阵中元素的值,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
  6. pip安装tensorflow_Tensorflow源代码编译踩坑若干
  7. PDF控件Aspose.Pdf 18年新版18.1发布 | 附下载
  8. android 数独实训报告,数独实验报告范文
  9. MYSQL 只能回环口链接_loopback回环口详解
  10. 效率工具 Snipaste、坚果云、印象笔记
  11. Matlab中int2str函数使用
  12. 如何提高仓库操作管理效率?
  13. arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块
  14. python有哪些细节描写_细节描写的句子有哪些
  15. 迟来的2018年终总结
  16. 金三银四求职季,程序员面试必备——数据库篇
  17. 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,
  18. python包管理工具pip使用手册
  19. Electron11+Vue+ffi-napi环境配置
  20. 芯片后端开发基础知识(一)

热门文章

  1. Tikz教程:一个异步FIFO设计步骤示意图的画法
  2. SAIL-IMX7D开发板截屏工具gsnap移植
  3. 编译imx6 android,SAIL-IMX6Q ANDROID开发环境搭建与系统编译
  4. 2022级计算机保研历程
  5. 关于华为设备ospf进程中RID重叠的问题
  6. IC卡参数、公钥之 RID、AID
  7. 程序员软件开发 面试常见问题
  8. python 12306登录_Python 12306登陆详细分析及操作
  9. 远程工具TeamViewer 移动端和PC端连接
  10. 孙宇晨为恶俗炒作道歉;华为回应美国子公司裁员 600