KNN:K-nearst neighbors

简介:

  • k-近邻算法采用测量不同特征值之间的距离来进行分类,简而言之为:人以类聚,物以群分
  • KNN既可以应用于分类中,也可用于回归中;在分类的预测是,一般采用多数表决法;在做回归预测时,一般采用平均值法

KNN三要素:

在KNN的算法中,主要考虑以下三个要素:

  • K值的选择:表示样本可由距离其最近的K个邻居来代替;可由交叉验证来选择最适合K值

    • 当K值较小的时候,表示使用较小领域的样本进行预测,因此会导致模型更加复杂,导致过拟合;
    • 当K值较大的时候,表示使用较大领域的样本进行预测,训练误差会增大,模型会简化,容易导致欠拟合
  • 距离的度量:一般使用欧式距离;

    • 欧式距离:若\(a(a_1,a_2,a_3)\), \(b(b_1,b_2,b_3)\),则两者的欧式距离为:
      \[\sqrt{(a1-b1)^2+(a2-b2)^2+(a2-b2)^2}
      \]
  • 决策规则:分类模型中,主要使用多数表决或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法

    • 多数表决/均值法:每个邻近样本权重相同;
    • 加权多数表决/加权平均值法:每个邻近样本权重不同;一般情况下,采用权重和距离成反比的方式进行计算

KNN算法实现:

蛮力实现(brute)

  • 计算预测样本到所有训练集样本的距离,然后选择最小的k个距离即可得到K个最邻近点。
  • 缺点:计算消耗资源大

KD树(kd tree)

  • 对训练数据进行建模,构建KD树;
  • 根据构建好的模型对样本进行预测;

除此之外,还有一些从KD树改进而来的求解最近邻点的算法,例如Ball Tree、BBF Tree、MVP Tree

KD树浅析

当样本数量较少时,可以通过brute蛮力来求解最近邻;而当样本量较大的时候,KD树就能发挥其优势。

构建方式

  • 从m个样本的n维特征中,分别计算n个特征取值的方差;
  • 用方差最大的第k维特征\(n_k\)作为根节点;
  • 对于这个特征,选择取值的中位数\(n_{kv}\)作为样本的划分点,对于小于该值的样本划分到左子树,对于大于等于该值的样本划分到右子树;
  • 对左右子树采用同样的方式找方差最大的特征作为根节点,递归即可产生KD树

查找方式

  • 对于一个目标点,首先在KD树里面找到包含目标点的叶子节点;

    • 从根节点出发,根据之前划分的条件,递归的向下访问KD树,直到达到叶子节点为止;
  • 以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得出一个超球体,最近邻的点一定在这个超球体的内部;
  • 返回到叶子节点的父节点,检查另一个子节点包含的超矩形区域是否和上述的超球体相交:
    • 若相交,则去这个子节点寻找是否有更加近的点,若有,则更新最近点;
  • 若不相交,则继续回到叶子节点的父节点的父节点,在这个更父的父节点对应的另一个子树中继续上述步骤;
  • 经过上述几步一直更新,当回溯到根节点时,最后的最近点就是当前目标点的最近邻点
  • 把改点删除,继续进行上述的操作,直到找到K个点为止

下述博文中有关于此查找方式的案例,便于理解:

https://cloud.tencent.com/developer/news/212042

实际应用:

  • 示例代码
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV def knn_classifier_iris():
"""
K-近邻预测鸢尾花
"""
# 加载数据
lr = load_iris()
# 划分数据
x_train, x_test, y_train, y_test = train_test_split(lr.data, lr.target, test_size=0.25)
# 特征工程(标准化)
std = StandardScaler()
# 对测试集和训练集的特征值进行标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 采用knn
knn = KNeighborsClassifier(n_neighbors=3)
# 训练
# knn.fit(x_train, y_train) # # 得出预测
# y_predict = knn.predict(x_test)
# print(y_predict) # #评估模型
# print("预测的准确率:", knn.score(x_test, y_test))
# print("每个类别的精确率与召回率与F1Score", classification_report(y_test, y_predict, target_names=lr.target_names)) # 采用网格搜索+交叉验证
# 构造超参数的选择
param = {"n_neighbors":[1,3,5]} # 构造网格搜索对象 2折交叉验证
gc = GridSearchCV(knn, param_grid=param, cv=2)
# 拟合
gc.fit(x_train, y_train)
# 预测+模型评估
print("在测试集上的准确性:", gc.score(x_test, y_test))
# 在测试集上的准确性: 0.9210526315789473
print("在交叉验证当中的最好的结果:", gc.best_score_)
# 在交叉验证当中的最好的结果: 0.9910714285714286
print("最好的参数选择:", gc.best_params_)
# 最好的参数选择: {'n_neighbors': 3}
print("最好的模型:", gc.best_estimator_)
# 最好的模型: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=3, p=2, weights='uniform')
print("每个超参数每次交叉验证的结果:", gc.cv_results_)
# 略
return None

由于这部分代码量太少,因此将其与决策树代码归到了一起,见下:

https://github.com/zhuChengChao/ML-DecisionTree

机器学习:KNN的更多相关文章

  1. [机器学习] ——KNN K-最邻近算法

    KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  2. 机器学习——kNN(1)基本原理

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  3. 机器学习--kNN算法识别手写字母

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

  4. 机器学习-kNN

    基于Peter Harrington所著<Machine Learning in Action> kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...

  5. 机器学习-KNN算法详解与实战

    最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...

  6. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  7. 机器学习 KNN算法原理

    K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...

  8. 机器学习-KNN分类器

    1.  K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2.  KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...

  9. ML02: 机器学习KNN 算法

    摘要: 一张图说清楚KNN算法 看下图,清楚了吗?   没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...

  10. 机器学习——kNN(2)示例:改进约会网站的配对效果

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

随机推荐

  1. SVN无法查看最近日志和提交记录

    现象: 使用SVN查看最近的提交记录日志时,最近总是无法显示出全部的日志内容,只能显示到几天之前的日志.就算是自己刚提交的代码也是无法没有记录的. 解决方式:右键选择TortoiseSVN中的&quo ...

  2. iframe 内容适用高度

    HTML: <div class="content"> <iframe id="frameObj" src="链接" fr ...

  3. SpringBoot-异步定时-邮件任务

    目录 背景 异步任务 定时任务 邮件任务 背景 在我们的工作中,常常会用到异步处理任务,比如我们在网站上发送邮件, 后台会去发送邮件,此时前台会造成响应不动,直到邮件发送完毕,响应才会成功, 所以我们 ...

  4. Linux学习笔记--快捷键

    桌面 ALT+空格 打开窗口菜单 ALT+F1 聚焦到桌面左侧任务导航栏,可按上下键导航 ALT+F2     运行命令 ALT+F4 关闭窗口 ALT+TAB 切换程序窗口 PRINT 桌面截图 S ...

  5. Selenium系列4-元素定位

    前言 说起元素定位,一定是学习自动化测试绕不开的第一道关,无论是web端的UI自动化还是移动端的自动化,在需要首先对元素进行定位才可以完成对元素的操作已达成测试目的,在Selenium中,可以使用fi ...

  6. 6步快速配置Tomcat环境变量(Win10)

    一.配置 tomcat环境变量之前先安装jdk和配置jdk的环境变量 1.首先右击我的电脑(此电脑),点击属性,或者也可以从控制面板上打开,如下图,找到系统点击高级系统设置: 2.然后进入系统属性界面 ...

  7. mac下使用vscode技巧

    1.查找 command +  F 2.查找并替换 选中要替换的文字  再 command +  options + F 3.竖状区域部分替换 鼠标点中替换字段的开头或者结尾,按options + s ...

  8. TP5模型开启事务

    和Db开启事务类似,Db是静态方法 $userObj = new UserModel(); $userObj->startTrans(); try { $userObj->data($da ...

  9. Shell系列(18)- 什么是正则表达式

    概念: 正则表达式是用于描述字符排列和匹配模式的一种语法 它主要用于字符串的模式分割.匹配.查找及替换操作.

  10. Jmeter目录分析

    通讯协议 最重要的基础知识. 性能测试的原理?通过协议模拟压力 jmeter目录结果解析 bin docs,文档 lib,存放库文件,所依赖的jar包 ext jmeter自己的jar包 jmeter ...