机器学习: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)示例:改进约会网站的配对效果
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
随机推荐
- Python - 文件模式a+读取不了文件
代码 f = open('test/gbk.txt', 'a+', encoding='utf-8') print(f.readline()) 最终的执行结果是输出空,为什么呢? a+模式打开文件指针 ...
- stat 命令家族(4)- 详解 iostat
性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 报告 CPU 信息和 I/ ...
- 了解mysql concat()函数
concat(arg1,arg2,....):将形参对应字段的值组合成一个字符串 假设:现在有一张学生表(test_user) 将这三个字段组合成一个字符串作为第四个字段 select test_us ...
- Ubantu启动失败,提示“Started GNOME Display Manager”之后起不来了
我是在搭建DPDK环境时,为了尝试下多网卡多列配置,将虚拟机的网卡类型由e1000改成了vxnet3类型.之后修改了下内存大小和CPU核数.然后启动ubantu虚拟机,结果无法成功启动,显示结果如下: ...
- AQS快速入门
一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...
- 解决国内npm安装太慢的方法,又不能FQ情况下,使用淘宝镜像教程
安装npm及cnpm(Windows) [工具官网] 因为国内上网下载组件太慢,淘宝给我们提供了镜像源,,但是我不是建意FQ上网.条件有限的可以使用下面的方法安装CNPM,原文转自网络,正好自己需要也 ...
- 谈谈如何进阶Java高级工程师
从入门到瓶颈(++文末附学习脑图++) 首先,先自我介绍一下,楼主94年的,四川人,普通大专毕业. 第一阶段 实习阶段 2015年,实习阶段去浙江温州(没错,就是皮革厂的那个地方)找了份软件实施的工作 ...
- python中reduce filter map lambda函数
lambda函数 python 使用 lambda 来创建匿名函数,lambda返回值是一个函数的地址,也就是函数对象. 语法:lambda [arg1 [,arg2,.....argn]]:expr ...
- select后给字段起别名,where和group后不能用,但having后可以
为什么mysql having的条件表达式可以直接使用select后的别名? SQL语句的语法顺序: FROM -> WHERE -> GROUP BY -> HAVING -> ...
- Linux下Nodejs安装(完整详细)转
Linux下安装有两种方式,一个是下载源码make编译安装. 另外一种是比较推荐的,直接下载编译好的二进制,官方比较推荐后者. //Linux 64bit version wget --no-chec ...