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. Python - 文件模式a+读取不了文件

    代码 f = open('test/gbk.txt', 'a+', encoding='utf-8') print(f.readline()) 最终的执行结果是输出空,为什么呢? a+模式打开文件指针 ...

  2. stat 命令家族(4)- 详解 iostat

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 报告 CPU 信息和 I/ ...

  3. 了解mysql concat()函数

    concat(arg1,arg2,....):将形参对应字段的值组合成一个字符串 假设:现在有一张学生表(test_user) 将这三个字段组合成一个字符串作为第四个字段 select test_us ...

  4. Ubantu启动失败,提示“Started GNOME Display Manager”之后起不来了

    我是在搭建DPDK环境时,为了尝试下多网卡多列配置,将虚拟机的网卡类型由e1000改成了vxnet3类型.之后修改了下内存大小和CPU核数.然后启动ubantu虚拟机,结果无法成功启动,显示结果如下: ...

  5. AQS快速入门

    一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...

  6. 解决国内npm安装太慢的方法,又不能FQ情况下,使用淘宝镜像教程

    安装npm及cnpm(Windows) [工具官网] 因为国内上网下载组件太慢,淘宝给我们提供了镜像源,,但是我不是建意FQ上网.条件有限的可以使用下面的方法安装CNPM,原文转自网络,正好自己需要也 ...

  7. 谈谈如何进阶Java高级工程师

    从入门到瓶颈(++文末附学习脑图++) 首先,先自我介绍一下,楼主94年的,四川人,普通大专毕业. 第一阶段 实习阶段 2015年,实习阶段去浙江温州(没错,就是皮革厂的那个地方)找了份软件实施的工作 ...

  8. python中reduce filter map lambda函数

    lambda函数 python 使用 lambda 来创建匿名函数,lambda返回值是一个函数的地址,也就是函数对象. 语法:lambda [arg1 [,arg2,.....argn]]:expr ...

  9. select后给字段起别名,where和group后不能用,但having后可以

    为什么mysql having的条件表达式可以直接使用select后的别名? SQL语句的语法顺序: FROM -> WHERE -> GROUP BY -> HAVING -> ...

  10. Linux下Nodejs安装(完整详细)转

    Linux下安装有两种方式,一个是下载源码make编译安装. 另外一种是比较推荐的,直接下载编译好的二进制,官方比较推荐后者. //Linux 64bit version wget --no-chec ...