第三章 统计学习方法-K-近临法

本文深入探讨了k近邻算法的基本原理,包括距离度量、k值选择与分类决策规则,解析了k近邻法在分类与回归中的应用,并介绍了kd树在k近邻算法中的实现方式。

 

k近邻法(k-nearest neighbor, k-NN)是一种基本分类与回归方法。k近邻法假设给定一个训练数据集,其中的实例类别己定。分类时,对新的实例,根据其k个最近邻的训练实例的类别通过多数表决等方式进行预测。k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量及分类决策规则是k近邻法的三个基本要素。

3.2   k近邻模型

k近邻法三个基本要素:距离度量、k值的选择和分类决策规则

 

距离度量:  常用欧氏距离,其他距离

Lp距离(与distance)     

 

当p=2时,称为欧氏距离(Euclidean distance)

当p=1时,称为曼哈顿距离(Manhattan distance )

Minkowski距离

k值的选择

如果选择较小的k值,“学习”的近似误差( approximation ertor)会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用。但缺点是“学习”的估计误差(estimarion ertor) 会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰巧是噪声,预测就会出错.换句话说,k值的减小就意味着整体模型变得复杂,容易发生过拟合。

如果选择较大的k值,正好相反, k值的增大就意味着整体的模型变得简单.如果k=N,那么无论输入实例是什么,都将简单地预测它属于在训练实例 中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的.在应用中,k值一般取一个比较小的数值.通常采用交叉验证法来选取最优 的k值.

分类决策规则

常用:多数表决规则(majority voting rule):0-1

损失函数下经验风险最小化.

                                                 

 

3.3 k近邻法的实现:kd树

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维空间的一个划分(partition)。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一个k维超矩形区域.

构造kd树:

  •  

搜索kd树:

 

 

 

 

### 虚假邻点 Python 实现 虚假邻点是一种用于检测嵌入维度是否合适的方法,在时间序列分析等领域有广泛应用。该方法通过判断重构相空间中的两点在增加嵌入维度后是否仍然接来决定合适的嵌入维度。 #### 方法原理 对于给定的时间序列 \( \{X_t\} \),假设已经选择了初始的延迟时间和嵌入维度 m 来构建向量: \[ V_i^{(m)} = [X(i), X(i+\tau), ..., X(i+(m-1)\tau)] \] 当嵌入维度增加到 \( m+1 \) 时,对应的向量变为: \[ V_i^{(m+1)} = [X(i), X(i+\tau), ..., X(i+(m-1)\tau), X(i+m\tau)] \] 如果两个相邻点之间的欧氏距离显著增大,则认为这两个点是虚假邻点。 #### Python 实现 下面是一个简单的 Python 函数实现,用来计算指定数据集上的虚假邻比例[^1]: ```python import numpy as np def false_nearest_neighbors(time_series, tau, min_dim, max_dim, threshold=0.1): """ 计算不同嵌入维度下的虚假最近邻居的比例 参数: time_series (list/array): 输入的一维时间序列. tau (int): 延迟参数. min_dim (int): 最小嵌入维度. max_dim (int): 最大嵌入维度. threshold (float): 判断是否为虚假邻的标准,默认值为0.1 返回: fns_ratio (dict): 不同嵌入维度下虚假最近邻居的比例字典 {dim: ratio}. """ def create_embedding(data, dim, delay): n = len(data)-(dim-1)*delay embedded_data = np.zeros((n,dim)) for i in range(dim): embedded_data[:,i] = data[i*delay:i*delay+n] return embedded_data fns_ratio = {} for m in range(min_dim, max_dim + 1): emb_m = create_embedding(time_series, m, tau) dists = [] nearest_indices = [] # 寻找每个点最邻距离及其索引 for idx, point in enumerate(emb_m[:-1]): distances = np.linalg.norm(point - emb_m[idx+1:], axis=1) closest_idx = np.argmin(distances)+idx+1 nearest_indices.append(closest_idx) dists.append(distances.min()) count_fnn = 0 if m < max_dim: emb_next = create_embedding(time_series, m+1, tau) for j, index in enumerate(nearest_indices): orig_dist = dists[j] new_point_1 = emb_next[j] new_point_2 = emb_next[index] next_dist = np.linalg.norm(new_point_1-new_point_2) R = next_dist/orig_dist if R >= threshold and abs(new_point_1[-1]-new_point_2[-1]) > \ 10 * np.std(time_series[(index+j):(index+j+len(new_point_1)-1)]): count_fnn += 1 fns_ratio[m] = float(count_fnn)/len(dists) return fns_ratio ``` 此代码定义了一个 `false_nearest_neighbors` 函数,它接收时间序列以及一些必要的参数作为输入,并返回一个包含各个嵌入维度对应虚假邻比率的结果字典。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值