随机森林原理介绍

二、构建完kd树之后,如今进行最近邻搜索呢?

KD树的查找算法:

在k-d树中进行数据的查找也是特征匹配的重要环节,其目的是检索在k-d树中与查询点距离最近的数据点。

这里先以一个简单的实例来描述最邻近查找的基本思路。

例一:查询的点(2.1,3.1)(较简单)。

1、如图3所示,星号表示要查询的点(2.1,3.1)。通过二叉搜索,顺着搜索路径很快就能找到最邻近的近似点,也就是叶子节点(2,3)。

2、而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。

3、为了找到真正的最近邻,还需要进行’回溯’操作:

             算法沿搜索路径反向查找是否有距离查询点更近的数据点。

此例中先从(7,2)点开始进行二叉查找,然后到达(5,4),最后到达(2,3),此时搜索路径中的节点为<(7,2),(5,4),(2,3)>,

首先以(2,3)作为当前最近邻点,计算其到查询点(2.1,3.1)的距离为0.1414,

然后回溯到其父节点(5,4),并判断在该父节点的其他子节点空间中是否有距离查询点更近的数据点。以(2.1,3.1)为圆心,以0.1414为半径画圆,如图3所示。发现该圆并不和超平面y = 4交割,因此不用进入(5,4)节点右子空间中去搜索。

4、最后,再回溯到(7,2),以(2.1,3.1)为圆心,以0.1414为半径的圆更不会与x = 7超平面交割,因此不用进入(7,2)右子空间进行查找。至此,搜索路径中的节点已经全部回溯完,结束整个搜索,返回最近邻点(2,3),最近距离为0.1414。

                                      图3

例二:查找点为(2,4.5)(叫复杂一点)。

一个复杂点了例子如查找点为(2,4.5)。

1、同样先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,

2、取(4,7)为当前最近邻点,计算其与目标查找点的距离为3.202。然后回溯到(5,4),计算其与查找点之间的距离为3.041。

       ((4,7)与目标查找点的距离为3.202,而(5,4)与查找点之间的距离为3.041,所以(5,4)为查询点的最近点;)

3、以(2,4.5)为圆心,以3.041为半径作圆,如图4所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找。此时需将(2,3)节点加入搜索路径中得<(7,2),(2,3)>。

4、回溯至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5。

5、回溯至(7,2),以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如图5所示。

至此,搜索路径回溯完。返回最近邻点(2,3),最近距离1.5。

                   图4                                                                         图5

上述的kd树是完成最近邻的搜索,其实也可以找到最近的k个点。 


k-d树查询算法的简要说明:

从root节点开始,DFS搜索直到叶子节点,同时在stack中顺序存储已经访问的节点。
如果搜索到叶子节点,当前的叶子节点被设为最近邻节点。
然后通过stack回溯:
如果当前点的距离比最近邻点距离近,更新最近邻节点.
然后检查以最近距离为半径的圆是否和父节点的超平面相交.
如果相交,则必须到父节点的另外一侧,用同样的DFS搜索法,开始检查最近邻节点。
如果不相交,则继续往上回溯,而父节点的另一侧子节点都被淘汰,不再考虑的范围中.
当搜索回到root节点时,搜索完成,得到最近邻节点。
            </div>
                </div>
### 随机森林算法原理 随机森林(Random Forest)是一种基于集成学习的算法,其核心思想是通过构建多棵决策并将这些的结果综合起来以提升模型性能。具体来说,随机森林通过对原始数据集进行多次重采样(Bootstrap),生成若干个子样本集合,并针对每个子样本训练一颗独立的决策[^1]。 #### 数据与特征的双重随机化 在随机森林中,不仅对数据进行了随机抽样,还对特征进行了随机选择。这意味着,在每次分裂节点时,只从所有可能的特征中随机选取一部分作为候选特征用于分割。这种机制有效降低了各决策之间的相关性,从而提高了整体模型的泛化能力[^3]。 #### 流程概述 以下是随机森林的主要工作流程: 1. **数据准备**: 对于给定的数据集D,采用Bootstrap方法从中抽取m次大小相同的子样本{S_1, S_2,...,S_m}。 2. **建模过程**: 使用每一个子样本Si去建立对应的决策Ti(i=1...m),其中每一颗都是完全生长而不剪枝的状态。 3. **预测阶段**: - 在分类任务中,最终输出由投票决定——即每棵给出自己的类别标签,得票最多的类被选作最后结果; - 而对于回归问题,则取所有木预测值的平均数作为最终估计量[^2]。 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt import numpy as np # 加载鸢尾花数据集 data = load_iris() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3) # 创建随机森林实例并拟合数据 rfc = RandomForestClassifier(n_estimators=100) rfc.fit(X_train,y_train) # 绘制重要性图谱 feat_importances = rfc.feature_importances_ indices = np.argsort(feat_importances)[::-1] plt.figure(figsize=(8,6)) plt.title("Feature Importances") plt.bar(range(len(indices)), feat_importances[indices], align="center", color='r') plt.xticks(range(len(indices)), indices) plt.show() ``` 上述代码展示了如何利用`sklearn`库中的`RandomForestClassifier`来创建一个随机森林模型,并绘制出各个特征的重要性图表。 ### §相关问题§ 1. 如何调整参数优化随机森林的表现? 2. 决策随机森林之间有什么区别?各自适用场景是什么? 3. 是否存在其他形式的Bagging技术能够替代随机森林? 4. 当前主流框架里有哪些实现高效处理大规模数据集上的随机森林工具包? 5. 如果我的问题是关于时间序列预测而非传统结构化表格型输入,那么还能否应用随机森林呢?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值