K近邻算法 (K-Nearest Neighbors, KNN)
通俗易懂算法
K近邻算法 (K-Nearest Neighbors, KNN) 是一种简单且常用的机器学习算法,主要用于分类和回归问题。其基本思想是:给定一个数据点,找到在训练集中距离该点最近的 k k k个数据点,然后根据这 k k k个点的信息来进行预测。以下是该算法的基本步骤:
-
选择 k k k值: k k k是一个超参数,表示我们要统计的最近邻居的数量。选择合适的 k k k值非常重要,会影响算法的准确性。
-
计算距离:对于给定的新数据点,计算它与训练集中每一个数据点之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。以欧氏距离为例,其公式为:
d ( x , x ( i ) ) = ∑ j = 1 n ( x j − x j ( i ) ) 2 d(\mathbf{x}, \mathbf{x}^{(i)}) = \sqrt{\sum_{j=1}^{n} (x_j - x_j^{(i)})^2} d(x,x(i))=j=1∑n(xj−xj(i))2
其中, x \mathbf{x} x是新数据点, x ( i ) \mathbf{x}^{(i)} x(i)是训练集中第 i i i个数据点, x j x_j xj和 x j ( i ) x_j^{(i)} xj(i)分别表示样本的第 j j j个特征。
-
选择最近的 k k k个邻居:根据计算出的距离,从训练集中选择与新数据点距离最近的 k k k个数据点。
-
投票决策(分类)或平均(回归):
- 对于分类问题,用这 k k k个邻居中出现次数最多的类别作为新数据点的预测类别。这种方法称为“多数投票”。
- 对于回归问题,计算这 k k k个邻居的特征值的平均值作为新数据点的预测值。
KNN的优点在于简单易懂且无需训练阶段。其缺点是在数据量大时计算效率较低,且对噪声敏感。
通过选择不同的 k k k值和距离度量方法,我们可以调节算法的复杂度和性能。小的 k k k值可能导致过拟合,而过大的 k k k值则可能使算法欠拟合。
希望这对你理解K近邻算法有所帮助!如果有其他问题,请随时提问。
底层原理
K近邻算法(K-Nearest Neighbors,简称KNN)是一种非参数、监督式的机器学习方法,主要用于分类和回归任务。KNN算法的基本思想是:对于给定的一个未知样本,寻找在特征空间中与其最近的 K K K个训练样本,根据这 K K K个邻居的类别信息对该未知样本进行分类(或回归预测)。
数学原理
距离度量
KNN算法中一个核心概念是“距离”,一般来说,为了找到样本点的最近邻,我们需要定义样本点之间的距离。常用的距离度量包括:
-
欧几里得距离(Euclidean Distance):
对于两个 d d d维向量 x = ( x 1 , x 2 , … , x d ) \mathbf{x} = (x_1, x_2, \ldots, x_d) x=(x1,x2,…,xd)和 y = ( y 1 , y 2 , … , y d ) \mathbf{y} = (y_1, y_2, \ldots, y_d) y=(y1,y2,…,yd),它们之间的欧几里得距离定义为:D ( x , y ) = ∑ i = 1 d ( x i − y i ) 2 D(\mathbf{x}, \mathbf{y}) = \sqrt{\sum_{i=1}^{d} (x_i - y_i)^2} D(x,y)=i=1∑d(xi−yi)2
-
曼哈顿距离(Manhattan Distance):
曼哈顿距离是各个维度上绝对差值之和:D ( x , y ) = ∑ i = 1 d ∣ x i − y i ∣ D(\mathbf{x}, \mathbf{y}) = \sum_{i=1}^{d} |x_i - y_i| D(x,y)=i=1∑d∣xi−yi∣
-
闵可夫斯基距离(Minkowski Distance):
这是一种比较广义的距离定义,其中 p p p是一个参数。它是欧几里得距离和曼哈顿距离的推广:D ( x , y ) = ( ∑ i = 1 d ∣ x i − y i ∣ p ) 1 p D(\mathbf{x}, \mathbf{y}) = \left( \sum_{i=1}^{d} |x_i - y_i|^p \right)^{\frac{1}{p}} D(x,y)=(i=1∑d∣xi−yi∣p)p1
特别地,当 p = 2 p=2 p=2时,就是欧几里得距离;当 p = 1 p=1 p=1时,就是曼哈顿距离。
分类原理
在进行分类任务时,KNN算法的目标是确定一个未标记样本的类别。基本步骤如下:
- 计算未知样本与训练集中所有样本的距离。
- 找到距离最近的 K K K个样本。
- 根据这 K K K个样本的类别来决定未知样本的类别。常用的方法是“多数表决”,即选择出现次数最多的类别作为预测结果。
假设 y i y_i yi是第 i i i个最近邻的类别,经过“多数表决”得到的预测结果 y ^ \hat{y} y^为:
y ^ = arg max c ∑ i = 1 K I ( y i = c ) \hat{y} = \arg\max_{c} \sum_{i=1}^{K} \mathbb{I}(y_i = c) y^=argcmaxi=1∑KI(yi=c)
其中 I \mathbb{I} I是指示函数,当括号内的条件成立时, I \mathbb{I} I取值为 1 1 1,否则为 0 0 0。
回归原理
对于回归问题,KNN算法的预测结果是最近 K K K个邻居的目标值的平均值。设 y i y_i yi为第 i i i个最近邻的目标值,则预测结果 y ^ \hat{y} y^为:
y ^ = 1 K ∑ i = 1 K y i \hat{y} = \frac{1}{K} \sum_{i=1}^{K} y_i y^=K1i=1∑Kyi
超参数 K K K
K K K的值是KNN算法中的一个重要超参数。选择较小的 K K K值可能导致模型对噪声数据过于敏感,而选择较大的 K K K值可能导致模型过于平滑,丧失对细节模式的捕捉。因此, K K K的选择通常依赖于验证集或交叉验证技术。
常用面试考点
K近邻算法(K-Nearest Neighbors,简称KNN)是一种简单的、用于分类或回归的非参数机器学习算法。其基本思想是,通过计算待预测样本与已知样本集中的每个样本之间的距离,选择距离最近的 k k k个样本,以这些样本的标签通过某种方式(如投票或平均)决定待预测样本的标签。以下从面试考点出发,讲解KNN算法的关键要素:
1. 核心概念
-
训练阶段:KNN算法不需要显式的训练过程,只需存储训练数据。这个特征使KNN成为一种惰性学习算法(Lazy Learning)。
-
预测阶段:对于新输入的样本,KNN通过以下步骤进行预测:
- 计算新样本与训练集所有样本之间的距离。
- 选择距离最近的 k k k个邻居。
- 对于分类任务,通过这 k k k个邻居的多数投票决定新样本的类别。
- 对于回归任务,取这 k k k个邻居标签的平均值作为预测结果。
2. 距离度量
KNN算法常用的距离度量方式有:
-
欧氏距离(Euclidean Distance):
d ( x i , x j ) = ∑ m = 1 n ( x i m − x j m ) 2 d(x_i, x_j) = \sqrt{\sum_{m=1}^{n} (x_{im} - x_{jm})^2} d(xi,xj)=m=1∑n(xim−xjm)2
其中, x i x_i xi和 x j x_j xj是两个样本, n n n是特征维度。
-
曼哈顿距离(Manhattan Distance):
d ( x i , x j ) = ∑ m = 1 n ∣ x i m − x j m ∣ d(x_i, x_j) = \sum_{m=1}^{n} |x_{im} - x_{jm}| d(xi,xj)=m=1∑n∣xim−xjm∣
-
明可夫斯基距离(Minkowski Distance):
d ( x i , x j ) = ( ∑ m = 1 n ∣ x i m − x j m ∣ p ) 1 p d(x_i, x_j) = \left( \sum_{m=1}^{n} |x_{im} - x_{jm}|^p \right)^{\frac{1}{p}} d(xi,xj)=(m=1∑n∣xim−xjm∣p)p1
当 p = 2 p=2 p=2时,等价于欧氏距离;当 p = 1 p=1 p=1时,等价于曼哈顿距离。
-
余弦相似度:用于衡量两个向量之间的角度相似性:
cos ( θ ) = x i ⋅ x j ∥ x i ∥ ∥ x j ∥ \cos(\theta) = \frac{x_i \cdot x_j}{\|x_i\| \|x_j\|} cos(θ)=∥xi∥∥xj∥xi⋅xj
在需要使用相似度而非距离时,余弦值可以作为一种选择。
3. 选择合适的 k k k值
-
交叉验证:使用交叉验证方法选取 k k k值,以确保模型在验证集上表现良好。
-
过小的 k k k值:容易受到噪声数据的影响,导致模型过拟合。
-
过大的 k k k值:可能包含过多不同类别的样本,导致模型泛化能力下降。
4. 加权KNN
在某些情况下,对邻居以距离的倒数进行加权,使得距离近的邻居对结果的影响更大:
f ( x ) = ∑ i = 1 k 1 d ( x , x i ) ⋅ y i ∑ i = 1 k 1 d ( x , x i ) f(x) = \frac{\sum_{i=1}^k \frac{1}{d(x, x_i)} \cdot y_i}{\sum_{i=1}^k \frac{1}{d(x, x_i)}} f(x)=∑i=1kd(x,xi)1∑i=1kd(x,xi)1⋅yi
其中, y i y_i yi是邻居的实际标签。
5. 算法优缺点
-
优点:
- 简单且易于理解、实现。
- 对于小规模数据和特征不多的情况下效果较好。
- 适合多分类问题。
-
缺点:
- 计算复杂度高,特别是大规模数据集。
- 存储每个训练样本需要大量内存。
- 对不相关或冗余特征较为敏感。
总结
KNN算法由于其简单性和直观性,在分类或回归的基本场景中仍然被广泛使用。理解其核心原理、实现细节以及适用场景,是在面试中遇到相关问题时的制胜法宝。选择合适的距离度量方式、最佳的 k k k值,以及进行特征缩放,都可能显著影响KNN模型的性能。