文章目录
最近邻算法 (Nearest Neighbor Algorithm)
最近邻算法是一种基于实例的学习方法,主要用于分类和回归任务。它的核心思想非常直观:对于一个新的未标记样本,算法会在已有的训练样本中找出与之最接近的样本,然后直接使用这个最接近样本的标签来预测新样本的标签。
-
记忆所有训练样本:最近邻算法不会从训练数据中学习一个显式的模型(如决策树或线性模型那样)。相反,它简单地存储或记忆所有的训练数据。
-
对新样本进行预测:当需要对一个新的未标记样本进行分类时,算法会执行以下步骤:
-
计算距离:算法会使用一种距离度量(常用的如欧氏距离、曼哈顿距离或余弦相似度等)来计算未标记样本与每一个训练样本之间的距离。
-
找到最近的邻居:在计算出的距离中,找到最小距离的训练样本,即最近邻。
-
分类预测:新样本的类别标签将被预测为这个最近邻样本的类别标签。
-
距离度量:选择合适的距离度量是最近邻算法中的一个重要部分,因为不同的度量方法可能会导致不同的邻近关系。最常用的距离度量包括:
- 欧氏距离(Euclidean distance)(L2 norm):在二维和三维空间中,欧氏距离就是两点之间的直线距离。
d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^{n}(x_{i} - y_{i})^{2}} d(x,y)=i=1∑n(xi−yi)2
- 曼哈顿距离(Manhattan distance)(L1 norm):在坐标系中是各坐标数值差的绝对值之和。
d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^{n}|x_{i} - y_{i}| d(x,y)=i=1∑n∣xi−yi∣
-
余弦相似度(Cosine similarity):主要度量两个向量的夹角,广泛用于文本分类等领域。
-
汉明距离:如果两个值相同,则距离为0;如果两个值不同,则距离为1。
d ( x , y ) = { 0 , if x = y 1 , if x ≠ y d(x, y) = \begin{cases} 0, & \text{if } x = y \\ 1, & \text{if } x \neq y \end{cases} d(x,y)={0,1,if x=yif x=y
- 如果你有多个分类属性,你会分别对每个属性计算出一个汉明距离,然后将这些距离作为向量的元素,最后使用欧氏距离来计算这个向量的长度。
-
最近邻算法虽然实现简单,但在处理大规模数据集时可能效率较低,因为每次分类都需要对所有训练样本进行距离计算。此外,该算法对噪声数据和异常值也较为敏感。
Normalization
当数据集的各个特征的尺度(范围)相差较大时,会对距离度量产生不公平的影响。例如,一个特征的范围是 1-10,另一个特征的范围是 100-1000。尽管两个特征可能同等重要,但尺度较大的特征在计算距离时将占主导地位。为了解决这个问题,我们需要进行归一化处理。
归一化通常指的是将数据的范围缩放到 [0, 1] 或者 [-1, 1]。最常用的一种归一化方法是 min-max scaling,其公式如下:
x
′
=
x
−
m
i
n
m
a
x
−
m
i
n
x' = \frac{x - min}{max - min}
x′=max−minx−min
其中,x 是原始数据,min 和 max 分别是数据的最小值和最大值,x’ 是归一化后的数据。
k 最近邻 (k-Nearest Neighbors, k-NN)
最近邻算法有几种变种,其中最著名的是k最近邻算法。在k-NN中,不是只考虑一个最近的邻居,而是取最近的k个邻居。
- 对K值的敏感性
-
选择K的值:
- K的值对算法的性能有很大影响。如果K值太小,算法对噪声数据非常敏感,易受异常值的影响;如果K值过大,则会使模型过于简单,可能导致欠拟合。
- 经验法则:一个常用的选择K值的方法是取训练样本数的平方根 k ≤ 训练样本数 k ≤ \text{训练样本数} k≤训练样本数 。这个规则提供了一个起点,但最优的K值通常通过交叉验证来确定。
- 商业软件包中的默认值:很多商业软件包默认使用
k
=
10
k=10
k=10,这个值在多种数据集上通常能提供不错的性能,但最佳值依赖于具体的数据特征和分布。
使用更多的邻居增加鲁棒性:
-
使用更多的邻居增加鲁棒性:
- 增加K值可以增强算法对噪声和异常数据的鲁棒性。当考虑更多的邻居时,单个异常值对最终结果的影响会减少。
-
在KNN分类中,一个新样本的类别通常是通过“多数投票”来决定的,即在最近的K个邻居中,出现次数最多的类别将被赋予给新样本。
当KNN用于回归任务时,预测的数值是最近的K个邻居的目标数值的平均值。这种方法可以平滑异常值的影响,使预测更加稳定。
Weighted nearest neighbor
在标准的 k-NN 算法中,我们只是简单地采用多数投票的方式决定新的数据点的类别。但是这种方法忽视了一个重要的信息,那就是不同邻居到查询点的距离可能会有很大的不同。一种改进的方法就是采用加权的方式,即距离越近的邻居权重越大。加权 k-NN 的投票公式如下:
v = ∑ i = 1 k w i v i v = \sum_{i=1}^{k} w_{i} v_{i} v=i=1∑kwivi
其中,v 是投票结果,k 是邻居的数量, w i w_{i} wi 是邻居 i 的权重, v i v_{i} vi 是邻居 i 的投票(通常是类别)。邻居的权重可以有多种计算方式,一种常见的方式是使用距离的倒数的平方,即:
w i = 1 d i 2 w_{i} = \frac{1}{{d_{i}}^2} wi=di21
Data Structure
KD-trees(k维树)和ball trees(球树)是两种常用于提高最近邻搜索效率的数据结构。它们能有效减少在大数据集中进行最近邻搜索时所需的距离计算次数。
-
KD-trees(k维树)
KD树是一种分割k维数据空间的二叉树结构。它将数据空间递归地划分成嵌套的超矩形区域,每个节点代表一个k维超矩形。构建和搜索KD树的步骤如下:
-
Ball Trees(球树)
球树是另一种用于组织数据以便进行快速最近邻搜索的树形结构,尤其适用于高维数据。球树中的每个节点定义了一个包含它所有子节点的数据点的超球体。
KD树适合处理低维数据(通常维度少于20),因为在高维空间中,边界框的重叠会导致效率下降。而球树在高维数据上表现更为稳定,因为它们使用球体而不是超矩形,能更好地适应数据的形状。然而,这两种结构都会受到维度的诅咒的影响,即随着维度的增加,任何数据结构的性能都可能会下降。