机器学习:KNN
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}
\]
- 欧式距离:若\(a(a_1,a_2,a_3)\), \(b(b_1,b_2,b_3)\),则两者的欧式距离为:
决策规则:在分类模型中,主要使用多数表决或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法
- 多数表决/均值法:每个邻近样本权重相同;
- 加权多数表决/加权平均值法:每个邻近样本权重不同;一般情况下,采用权重和距离成反比的方式进行计算
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个点为止
下述博文中有关于此查找方式的案例,便于理解:
实际应用:
- 示例代码
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
由于这部分代码量太少,因此将其与决策树代码归到了一起,见下:
机器学习:KNN的更多相关文章
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- 机器学习-kNN
基于Peter Harrington所著<Machine Learning in Action> kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...
- 机器学习-KNN算法详解与实战
最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习 KNN算法原理
K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...
- 机器学习-KNN分类器
1. K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2. KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...
- ML02: 机器学习KNN 算法
摘要: 一张图说清楚KNN算法 看下图,清楚了吗? 没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...
- 机器学习——kNN(2)示例:改进约会网站的配对效果
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
随机推荐
- sticky -- position定位属性sticky值之粘性定位;
sticky简述 sticky 是css定为新增的属性:可以说是相对定位relative和固定定位fixed的结合: 它主要用在对scroll事件的监听上,简单说在滑动过程中,某个元素的距离其父元素的 ...
- Elasticsearch-head插件的安装与配置
第一种: 通过浏览器添加插件 通过chrome安装插件的方式提供一个可操作es的图形化界面. 在chrome 浏览器中,通过"扩展程序" 添加 elasticsearch head ...
- vue-cli3 创建多页面应用项目
1.创建vue项目 cmd命令执行 vue create ruc-continuing 创建vue项目,项目名称:ruc-continuing 选择一个 preset(预置项),或自定义: 选择自 ...
- python中字符串的各种方法
图片来源见水印,一个学python的公众号
- HTML+CSS设计个人主页
在个人主页的设计中,我采用了圣代布局和div分块.效果图如下: <!DOCTYPE html> <html lang="en"> <head> ...
- PHP中的对象比较
在之前的文章中,我们讲过PHP中比较数组的时候发生了什么?.这次,我们来讲讲在对象比较的时候PHP是怎样进行比较的. 首先,我们先根据PHP文档来定义对象比较的方式: 同一个类的实例,比较属性大小,根 ...
- jdbc 数据库连接 长时间空闲 断开连接 ApplicationContext.xml
数据库连接 长时间空闲 断开连接solution: <property name="validationQuery" value="select 1"/& ...
- JDBC 基础入门
由于我也是初学参考的是网上的或者是培训机构的资料所以可能会有错误的信息,仅供参考 一.什么是JDBC(Java Data Base Connectivity)? java程序连接数据库,JDBC是由S ...
- P7854-「EZEC-9」GCD Tree【构造】
正题 题目连接:https://www.luogu.com.cn/problem/P7854 题目大意 给出\(n\)数字的一个序列\(a\). 现在要求构造一棵树,使得对于任意的\((x,y)\)都 ...
- bzoj#2407-探险【最短路,二进制分组】
正题 题目链接:https://darkbzoj.tk/problem/2407 题目大意 \(n\)个点的一张无向图(但是正反权值不同),求一个从\(1\)出发回到\(1\)且不经过重复边的最短路径 ...