k近邻法的实现(kd树)-相关问题梳理
K邻近算法的伪代码
机器学习实战 李锐等译
对未知类别属性的数据集的每一个点依次进行如下操作:
1.计算已知类别数据集中的点与当前点之间的距离;
2.按照距离递增次序排序
3.选取与当前点距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点出现频率最高的类别作为当前点的预测分类
python源码:
import numpy as np
import mathdef classify0(inX,dataSet,labels,k):"""inX:初始值,用于分类的输入向量;dataSet :训练数据集,labels:标签向量k:表示用于选择最近邻居的数目"""dataSetSize=dataSet.shape[0]diffMat=np.tile(inX,(dataSetSize,1))-dataSet #np.tile先将初始向量扩展成和dataSet形状相同的矩阵sqDiffMat=diffMat**2sqDistances=sqDiffMat.sum(axis=1)distances=sqDistances**0.5sortedDistIndicies=distances.argsort()#从小到大排序classCount={}for i in range(k):votelLabel=labels[sortedDistIndicies[i]] #确定前k个距离最小的元素classCount[votelLabel]=classCount.get(votelLabel,0)+1#最小元素的类,键值对应的为频率sortedClassCount=sorted(classCount.items(),key=lambda x:x[1],reverse=True)#从大到小排序return sortedClassCount[0][0]
注:
#np.argsort()理解
rawArray=np.array([1.48,1.41,0,0.1])
#rawArray_Index: 0 1 2 3
#sortedRawArray=array([0,0.1,1.41,1.48])
sortedRawArray_index: 2 3 1 0
统计学习方法 李航著
K近邻模型的三个基本要素:距离度量、k值的选择、和分类规则决定。
- 距离度量。
k值选择。
K值较小:相当于用较小的邻域中的训练实例进行预测,学习的近似误差会减小,但缺点是学习的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果近邻点恰巧是噪声,预测就会出错。即k的减小会让模型变得复杂,容易发生过拟合。
K值较大:相当于用较大邻域中的实例进行预测,其优点是较少学习的估计误差。但是缺点是学习的近似误差会增大。
K值的选择,一般选取比较小的值,通常采用交叉验证法来选择最优的k值。分类规则。
多数表决规则:由输入实例中的k个邻近的训练实例中的多数类决定输入实例的类。如:分类函数是0-1损失函数,要使误分率最小即经验风险最小。多数表决规则等价于经验风险最小。
k近邻法最简单的实现方法是线性扫描,当训练集很大时,计算比较耗时,这种方法不可行。
k邻近的实现——kd树
Kd树是一种对k维空间中的实例点记性存储以便其进行快速检索的树形数据结构。
Kd树是二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的平面将k维空间划分,构成一系列的k维超矩形区域。Kd树的每一个结点对应于k维超矩形区域。
算法:
算法:构造平衡的kd树
输入:k维空间数据集 ,其中 ;
输出:Kd树
(1).开始:构造根结点,根结点对应于包含T的k维空间的超矩形区域。
选择x(l) 为坐标轴,以T中的所有实例的 x(l)坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴 垂直的超平面实现。
由根结点生成深度为1的左、右子结点:左子结点对应坐标x(l) 小于切分点的子区域,右子结点对应于x(l) 大于切分点的子区域。(2)重复:对深度为j的结点,选择x(l) 为切分的坐标轴, l=j(mod k)+1以该结点的区域中所有实例的 坐标的中位数为切分点,将该结点对应的超矩形区域分为两个子区域,切分由通过切分点并与坐标轴 垂直的超平面实现。
由根结点生成深度为(j+1)的左、右子结点:左子结点对应坐标 小于切分点的子区域,右子结点对应于 大于切分点的子区域。
(3).直到两个子区域再没有实例点存在时停止,从而形成kd树的区域划分。
关于kd树的相关问题梳理:
子空间划分维度的选择:
根据l=j(mod k)+1
或者最大方差法(使用较多);
第一种方法的解释kd树中常用案例(统计学习方法 p42 例3.2)中位数为7。
中位数为7的解释
案例的每一步具体解释KD树的详解及KD树最近邻算法
KD树的快速理解
kmeans与k近邻算法的区别和联系。
kmeans是无监督的聚类算法;k近邻是有监督的分类和回归算法。
参考文献:
kNN与K-means的比较
机器学习中 K近邻法(knn)与k-means的区别
k近邻法的实现(kd树)-相关问题梳理相关推荐
- k近邻算法——kd树
一.kd树概念 kd树(K-Dimensional Tree)是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构. kd树是二叉树,表示对K维空间的一个划分(partitio ...
- 机器学习 K近邻之KD树基本概念、绘制KD树
K近邻算法回顾 K近邻法模型的三要素: 距离度量: K值的选取:K值的选取一般可以采用交叉验证法,且一般小于训练集样本量的平方根 分类决策规则:多数表决等价于误分类数最小 关于K近邻的问题: 1.简 ...
- 机器学习 K近邻之KD树 搜索KD树
思想:K近邻搜索 1.寻找"当前最近点" 寻找最近邻的子节点作为目标的"当前最近点" 2.回溯 以目标点和"当前最近点"的距离沿树根部进行回 ...
- 机器学习基础(四十三)—— kd 树( k 近邻法的实现)
实现 k 近邻法时,主要考虑的问题是如何对训练数据进行快速 k 近邻搜索,这点在如下的两种情况时,显得尤为必要: (1)特征空间的维度大 (2)训练数据的容量很大时 k 近邻法的最简单的实现是现行扫描 ...
- java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍
1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
原文出自:http://blog.csdn.net/v_JULY_v/article/details/8203674 前言 前两日,在微博上说:"到今天为止,我至少亏欠了3篇文章待写:1.K ...
- 【转】从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
最近在看<统计学习方法>,发现这么一篇好文章,与大家分享 转自:http://blog.csdn.net/v_july_v/article/details/8203674?reload 前 ...
- ***K近邻Survey-Distance总结
(一):漫谈knn:原文链接:http://www.kankanews.com/ICkengine/archives/103938.shtml 看引擎...有点对不起作者,不过没有办法,联系不到啊 ...
- 机器学习算法系列之K近邻算法
本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...
最新文章
- 笔记 - ES6 - 学前浅析
- Oracle 基础篇 --- 表空间的操作
- 嵌入式jetty的HTTP实现
- unittest单元测试框架总结
- linux制作ext2磁盘镜像,linux--创建镜像挂载
- cactus java,使用cactus实现对servlet进行单元测试
- android 判断ip地址合法
- URP中的2D Light光照在移动端不生效的问题
- Stateless 3.0——.NET Core上的状态机库
- asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010...
- mysql dql_Mysql中的DQL查询语句
- 如何安全使用计算机,如何安全的使用计算机
- gitlab protected branch
- 设计模式之工厂方法的重载
- EXCEL VBA 入门与实用例子
- asp毕业设计—— 基于asp+access的网上论坛设计与实现(毕业论文+程序源码)——网上论坛
- 结构体数组定义时初始化
- Linux 启动管理(详细版)
- 已知销售额怎么计算成本_计算成本根据销售额怎么样推算出成本,举例, – 手机爱问...
- 【Python】Python网络爬虫-电视剧《平凡的荣耀》数据爬取与分析