目录

  • 1.概述
  • 2.算法流程
    • (1)计算距离
    • (2)选择最近邻点
    • (3)预测
  • 3.KNN优化之KD树
    • (1)KD树之建树
    • (2)KD树之搜索
  • 4.sklearn实现KNN
    • (1)数据预处理
    • (2)预测和评价
    • (3)网格搜索

1.概述

KNN的原理非常简单明了,根据离样本最近的 k k k个点的标签来决定样本的类别或值。既可以用来分类,也可以进行回归。
分类:多数表决。在数据集中,找出与样本特征最近的 k k k个数据点,这些数据点中占比最多的类别即为要预测的样本的类别。
回归:取平均值。在数据集中,找出与样本特征最近的 k k k个数据点,取它们的平均值作为样本的预测值。

2.算法流程

(1)计算距离

计算样本与训练集中每个点的距离。一般使用欧式距离,向量 x , y \mathbf{x,y} x,y的欧式距离为:
D ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 D(\mathbf{x,y})=\sqrt{\sum_{i=1}^{n}(\mathbf{x}_{i}-\mathbf{y}_{i})^{2}} D(x,y)=i=1∑n​(xi​−yi​)2 ​
其中, n n n为每个样本的维度。

(2)选择最近邻点

选择距离样本点最近的 k k k个点, k k k值的选择应该多次尝试,因为当 k k k较小时,容易发生过拟合;当 k k k较大时,模型简单,容易加大预测误差。

(3)预测

如果是分类,多数表决;如果是回归,输出为最近 k k k个类别的平均值。

3.KNN优化之KD树

如果每次预测都需要计算每个样本的距离,则无疑计算量是巨大的。为了减少计算,这里给出KD树在KNN中的应用。

(1)KD树之建树

建树依据为维度方差最大化:
数据有 n n n个维度,依次计算各个维度的方差。选择方差最大的维度 n i n_{i} ni​,在所有样本的此维度中寻找中位数;假设中位数为10,将其他样本中维度 n i n_{i} ni​的值小于10的划入左子树,大于10的划入右子树。递归建树直到最后一个维度。

(2)KD树之搜索

样本 x \mathbf{x} x的预测过程:
根据维度划分,首先找到样本 x \mathbf{x} x对应的叶子节点,以样本 x \mathbf{x} x和叶子结点的距离为半径做超球体,最近邻的点一定在这个超球体内部。返回叶子节点的父节点,检查父节点的另一个节点的超矩形和这个超球体是否相交,相交的话在这个矩形内寻找是否有更近的节点,有的话跟新最近邻;不相交的话继续返回上一层的父节点,重复以上步骤直到根节点。

4.sklearn实现KNN

(1)数据预处理

导入数据集,划分训练集、测试集,标准化

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = load_iris()
x,y=iris.data,iris.target
x_train,x_test,y_train,y_test=train_test_split(x,y)
std = StandardScaler()
x_train=std.fit_transform(x_train)
x_test = std.fit_transform(x_test)
print(x_train.shape,x_test.shape)

输出:

(112, 4) (38, 4)

(2)预测和评价

KNN模型的K值设为3:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
model = KNeighborsClassifier(n_neighbors=3)
model.fit(x_train,y_train)
y_pred = model.predict(x_test)
print(accuracy_score(y_pred,y_test))

输出:

0.8421052631578947

(3)网格搜索

使用网格搜索、交叉验证选择合适的K值

from sklearn.model_selection import GridSearchCV
parameters={'n_neighbors':[1,3,5,10,20,50]}
model2 = KNeighborsClassifier()
cvModel=GridSearchCV(model2,parameters,cv=5)
cvModel.fit(x_train,y_train)
print(cvModel.best_score_)
print(cvModel.best_params_)

输出:

0.9727272727272727
{'n_neighbors': 10}

十四.K最近邻(KNN)原理和sklearn实现、网格搜索相关推荐

  1. ML之kNN:k最近邻kNN算法的简介、应用、经典案例之详细攻略

    ML之kNN:k最近邻kNN算法的简介.应用.经典案例之详细攻略 目录 kNN算法的简介 1.kNN思路过程 1.1.k的意义 1.2.kNN求最近距离案例解释原理-通过实际案例,探究kNN思路过程 ...

  2. 以K近邻算法为例,使用网格搜索GridSearchCV优化模型最佳参数

    文章目录 参数优化 网格搜索 代码实现 自编代码 sklearn 代码验证 参数优化 在之前的文章以K近邻算法为例,使用交叉验证优化模型最佳参数中,我们使用验证曲线(validation_curve) ...

  3. 【数学建模】机器学习预测算法(KNN、随机森林、网格搜索对决策树、支持向量机)(Python代码实现)【2021华为杯】

    目录 1 题目 2 数据集介绍及建模目标 3 问题 4 简化描述 5 Python代码实现 1 题目 乳腺癌是目前世界上最常见,致死率较高的癌症之一.乳腺癌的发展与雌激素受体密切相关,有研究发现,雌激 ...

  4. 【Python-ML】SKlearn库网格搜索和交叉验证

    # -*- coding: utf-8 -*- ''' Created on 2018年1月18日 @author: Jason.F @summary: GridSearch网格搜索:同一模型下组合参 ...

  5. sklearn GridSearchCV网格搜索案例与代码

    文章目录 准备数据 网格搜索参数 评估结果 全部代码 需要的包如下: import pandas as pd import numpy as np from sklearn.ensemble impo ...

  6. ML————朴素贝叶斯原理和SKlearn相关库

    二师兄养成记正式开始, 以后就写这了.  写的不对的.有疑问的,恳请大佬指出来. 一. 贝叶斯定理 1.  条件概率: P(A | B) = P(A B) / P(B) = P(A U B)/ P(B ...

  7. nagios二次开发(四)---nagios监控原理和nagios架构简介

    nagios监控原理 下面根据上面摘自网络的原理图对nagios的监控原理进行一下简单的说明: 1.nagios通过nsca进行被动监控.那么什么是被动监控呢?被动监测:就是指由被监测的服务器主动上传 ...

  8. 机器学习(四)——模型调参利器 gridSearchCV(网格搜索) scoring的

    如果是None,则使用estimator的误差估计函数 (3)       scoring=None 模型评价标准,默认None,这时需要使用score函数:或者如scoring='roc_auc', ...

  9. KNN(K最近邻)分类算法_糖潮丽子的博客

    申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师. 讲师介绍:梁老师 <细说Java>与<Java深入解析>图书作者.一线互联网资深数据分析专家,超过十年软件开 ...

最新文章

  1. iOS开发 - 事件传递响应链
  2. BootStrap table 数据填充与分页应用总结
  3. 微信后端服务架构及其过载控制系统DAGOR
  4. 【工具类】发送邮件的方法
  5. servlet,springmvc,springboot转发时页面静态资源404问题
  6. 【Python CheckiO 题解】Say Hi
  7. LeetCode 312. 戳气球(DP,难)
  8. Springboot集成ES启动报错
  9. 实践中整理出tomcat集群和负载均衡
  10. python中的 DFS 与 BFS
  11. F5实现2台机器的热备 Priority Group Activation
  12. Teraterm的Log设定
  13. java非字符文件的复制--图片复制
  14. php点击表格单元格链接,详解PhpSpreadsheet单元格设置样式、图片、超链接等
  15. Unity3d 周分享(20期 2019.6.30 )
  16. 软件需求说明书模板概要书
  17. 计算机二级ppt文小雨,计算机二级PPT真题:制作日月潭介绍PPT
  18. 【前端框架】当前基于bootstrap框架的几种主流前端框架
  19. 美团算法团队:深度学习在美团OCR中的应用!
  20. python课程总结-Python课程学习总结

热门文章

  1. java常用工具类 - 全角转半角、半角转全角
  2. J2EE基础之EJB全面了解
  3. 【元胞自动机】基于matlab元胞自动机模拟交通路况(含超车)【含Matlab源码 2389期】
  4. 基于php的教务选课管理系统毕业设计
  5. wxparse的使用php返回数组输出,微信小程序中WxParse循环解析返回的富文本数据
  6. 手机云顶之弈谷歌账号换服务器,云顶之弈手游谷歌账号怎么充值 云顶之弈手游谷歌账号充值流程一览...
  7. 从GoogleMap的金字塔模型到无限级索引数据结构(一)
  8. python批量检测URL访问状态
  9. PHP模板引擎Smarty(一)Smarty下载、配置、一个最简单的应用示例
  10. 命令行运行javac,报错: 编码 GBK 的不可映射字符 (0x9C)