KNN算法

1. 什么是KNN算法

简单来说,就是根据周围几个邻居的类别来判断自己的类别

1.1 KNN概念

KNN算法全称K Nearest Neighbor

  • 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
  • 距离公式:两个样本的距离可以通过如下公式计算,⼜叫欧式距离;
    n维空间的欧式距离公式:

1.2 KNN算法流程

  1. 计算已知类别数据集中的点与当前点之间的距离
  2. 按距离递增次序排序
  3. 选取与当前点距离最⼩的k个点
  4. 统计前k个点所在的类别出现的频率
  5. 返回前k个点出现频率最⾼的类别作为当前点的预测分类

1.3 KNN算法优缺点

  • 优点

    • 简单有效
    • 重新训练的代价低
    • 适合类域交叉样本
      • KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
  • 缺点
    • 惰性学习

      • 懒散学习法(基本不学习),一些积极学习的算法要快得多
    • 类别评分不是规格化
      • 不像⼀些通过概率评分的分类
    • 输出可解释性不强
      • 例如决策树的输出可解释性就较强
    • 对不均衡的样本不擅长
      • 当样本不平衡时,如⼀个类的样本容量很大,而其他类样本容量很小时,有可能导致当输⼊一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某⼀类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
    • 计算量较大
      • 目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本

KNN案例示范

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler # 归一化,标准化(看需求选一即可)
from sklearn.neighbors import KNeighborsClassifier
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文乱码
mpl.rcParams['axes.unicode_minus'] = False# 获取鸢尾花数据
iris = load_iris()
print("鸢尾花数据集的返回值:\n",iris)
# 返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n",iris['data'])
print("鸢尾花的⽬标值:\n",iris.target)
print("鸢尾花特征的名字:\n",iris.feature_names)
print("鸢尾花⽬标值的名字:\n",iris.target_names)
print("鸢尾花的描述:\n",iris.DESCR)# 查看数据分布情况
# 把数据转换成dataframe的格式
iris_d = pd.DataFrame(iris['data'], columns=['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.targetdef plot_iris(iris, col1, col2):sns.lmplot(x=col1, y=col2, data=iris, hue="Species", fit_reg=False)plt.xlabel(col1)plt.ylabel(col2)plt.title('鸢尾花种类分布图')plt.show()plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')# 对鸢尾花数据集进行分割
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=99,test_size=0.2)# 数据预处理(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # fit_transform(x_train)是在x_train自身的基础上标准化
x_test = transfer.transform(x_test) # transform(x_test)是利用fit_transform的结果标准化# 模型训练
knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(x_train,y_train)# 模型评估
# 方法1:比对真实值和预测值
y_pre = knn_model.predict(x_test)
print("预测结果为:\n",y_pre)
print("⽐对真实值和预测值:\n",y_pre==y_test)# 方法2:计算准确率
score = knn_model.score(x_test,y_test)print("准确率:\n",score)

算法改进

1. 交叉验证,网格搜索

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成10份(k份),其中⼀份作为验证集。然后经过10次 (组)的测试,每次都更换不同的验证集。即得到10组模型的结果,取平均值作为最终结果。又称10折交叉验证(k折)。
网格搜索:搜索的是参数,即在指定的参数范围内,按步长依次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数,这其实是一个训练和比较的过程。

2. 目的

  1. 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
  2. 还可以从有限的数据中获取尽可能多的有效信息。

同模型改进示范

from sklearn.model_selection import GridSearchCV
# 创建新的模型
knn_model_1 = KNeighborsClassifier()
param_dict = {'n_neighbors':[5,7,9,11]} # 近邻数
knn_model_1 = GridSearchCV(knn_model_1,param_grid=param_dict,cv=3)
# fit数据进行训练
knn_model_1.fit(x_train,y_train)
# 模型评估
# 方法1:比对真实值和预测值
y_pre_1 = knn_model_1.predict(x_test)
print("预测结果为:\n",y_pre_1)
print("⽐对真实值和预测值:\n",y_pre_1==y_test)
# 方法2:计算准确率
score = knn_model_1.score(x_test,y_test)
print("准确率:\n",score)
print("在交叉验证中验证的最好结果:\n", knn_model_1.best_score_)
print("最好的参数模型:\n", knn_model_1.best_estimator_)
print("每次交叉验证后的准确率结果:\n", knn_model_1.cv_results_)

KNN算法原理及简单改进相关推荐

  1. KNN算法原理与简单实现

    KNN算法原理与简单实现 K最近邻(k-Nearest Neighbor,KNN)分类算法,是最简单的机器学习算法之一,涉及高等数学知识近乎为0,虽然它简单,但效果很好,是入门机器学习的首选算法.但很 ...

  2. 机器学习之KNN算法原理

    机器学习之KNN算法原理 1 KNN算法简介 2 算法思想 3 多种距离度量公式 ① 欧氏距离(Euclidean distance) ② 曼哈顿距离(Manhattan distance) ③ 闵式 ...

  3. 详细的KNN算法原理步骤

    KNN算法原理详解 KNN算法 1.1 解决监督学习中分类问题的一般步骤 1.2 什么是消极(惰性)的学习方法 2 首先从一个实例讲起 3 KNN分类算法入门 3.1.1算法综述 3.1.2算法思想 ...

  4. KNN算法原理及python实现

    文章目录 1 KNN算法原理 1.1 基本概念 1.2 KNN算法原理 1.3 实现步骤 1.3 KNN算法优缺点 2 python手工实现KNN算法 2.1 KNN算法预测单个数据 2.2 KNN算 ...

  5. KNN算法原理与python实现

    文章目录 KNN算法原理 KNN算法介绍 KNN算法模型 距离度量 k值的选择 分类的决策规则 KNN算法python实现 手写数字识别 sklearn代码实现 参考文献 KNN算法原理 KNN算法介 ...

  6. KNN算法原理及实现

    KNN算法原理及实现 1.KNN算法概述 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类 ...

  7. 深入浅出KNN算法(一) KNN算法原理

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...

  8. 机器学习算法—KNN算法原理

    机器学习算法-KNN算法原理 概述: KNN算法一般也会经常被称为K邻近算法,其核心思想是根据训练集中的样本分类计算测试集中样本与训练集中所有样本的距离,根据所设定的K值选取前K个测试样本与训练样本最 ...

  9. 浅谈KNN算法原理及python程序简单实现、KD树、球树

    最近比较空闲,打算利用这一段时间理一下机器学习的一些常见的算法.第一个是KNN算法: KNN 1.原理: KNN,K-NearestNeighbor---K最近邻 K最近邻,就是K个最近的邻居的意思, ...

最新文章

  1. Java中反射的三种常用方式
  2. 在CentOS上用yum安装redis
  3. php和asp.net下SQLite3的执行速度对比
  4. 服务器端与客户端TCP连接入门(三:多线程)
  5. php原生导出excel文件的两种方法
  6. 得推家政派单系统源码 v1.0
  7. 北京证券交易所首批三大基本业务规则开始征求意见
  8. POJ 1948 Triangular Pastures (二维01背包)
  9. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...
  10. 深入浅出讲解LDA主题模型(一)
  11. screentogif能录制声音吗_一款免费且强大的gif动画录制工具,再也不愁录动画!...
  12. 微信小程序选项卡demo
  13. 综合使用公网/专网等频段!今日,工信部发布工业互联网和物联网无线电频率使用指南(附下载)...
  14. 5G商用牌照发放,区块链与5G能擦出多大“火”
  15. 1/cos(x)、1/sin(x)的不定积分推导
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社区闲置物品交易平台z10mc
  17. SAAS之Multi-Tenancy解析
  18. 【管理学视频课程】TOC制约理论的…
  19. 勤学勤记(四)——放弃Addon,选择纯C++
  20. Kata Containers介绍

热门文章

  1. 艾司博讯:拼多多上架商品为什么被驳回
  2. 最优排序二叉树(OBST)
  3. 想开公众号写技术文章?听听我这个过来人的建议!
  4. 使用SQL语句清空数据库所有表的数据
  5. 2018年2月6日训练日记
  6. 什么是seo的关键字
  7. CentOS 7 部署 Ceph 分布式存储架构
  8. 文明6+ 科技市政伟人 速度修改
  9. qml草地足球简单案例
  10. 飞思卡尔16位单片机(十二)—— IIC模块测试