KNN算法如何选择合适的邻居数量来保证模型泛化能力?

KNN算法如何选择合适的邻居数量来保证模型泛化能力?

介绍

K最近邻(K-Nearest Neighbors,简称KNN)算法是一种常用的监督学习算法,在分类和回归问题上都有广泛的应用。它的核心思想是根据训练集中样本的特征和标签,对新样本进行分类或回归预测。KNN算法中的一个重要参数是邻居数量K,决定了模型的泛化能力。本文将详细介绍KNN算法的原理、公式推导、计算步骤,并给出Python代码示例。

算法原理

KNN算法的原理非常直观和简单。给定一个新样本,KNN算法首先计算它与训练集中各个样本的距离,并找出距离最近的K个样本。然后根据这K个最近邻样本的标签,采用多数表决的方式进行分类,或者采用平均值的方式进行回归预测。

KNN算法中的距离度量通常使用欧氏距离、曼哈顿距离或闵可夫斯基距离等。在进行距离计算前,可以对特征进行归一化或标准化处理,以防止某些特征对距离计算的影响过大。

公式推导

在KNN算法中,假设训练集包含N个样本,每个样本的特征表示为$x_i$,标签表示为$y_i$,那么对于一个新样本$x$,其K个最近邻样本可表示为$N_k$。

对于分类问题,采用多数表决的方式,新样本$x$的预测标签$y$可以表示为:

$$
y = \operatorname{arg}\max_y \sum_{x_i \in N_k} I(y_i = y)
$$

其中,$I$为指示函数。对于回归问题,采用平均值的方式,新样本$x$的预测值$y$可以表示为:

$$
y = \frac{1}{K} \sum_{x_i \in N_k} y_i
$$

计算步骤

KNN算法的计算步骤可总结为以下几步:
1. 计算新样本$x$与训练集中所有样本的距离;
2. 根据距离找出K个最近邻样本;
3. 根据多数表决或平均值方式确定新样本的预测标签或值。

Python代码示例

接下来,我们使用一个虚拟数据集来演示KNN算法的应用,并展示完整的Python代码。

首先,我们需要导入必要的库:

import numpy as np
import matplotlib.pyplot as plt

然后,我们生成一个二维的虚拟数据集:

np.random.seed(0)
X1 = np.random.randn(50, 2)
X2 = np.random.randn(50, 2) + np.array([2.5, 2.5])
X = np.vstack([X1, X2])
y = np.hstack([np.zeros(50), np.ones(50)])

接着,定义计算欧氏距离的函数:

def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2)**2))

然后,定义KNN分类函数:

def knn_classify(X_train, y_train, x_test, k):
    distances = [euclidean_distance(x_test, x) for x in X_train]
    k_indices = np.argsort(distances)[:k]
    k_nearest_labels = [y_train[i] for i in k_indices]
    return max(set(k_nearest_labels), key=k_nearest_labels.count)

最后,进行数据预测并绘制分类结果的散点图:

plt.scatter(X[:, 0], X[:, 1], c=y)
x_test = np.array([0, 0])
k = 5
y_test = knn_classify(X, y, x_test, k)
plt.scatter(x_test[0], x_test[1], c='r', marker='x')
plt.title(f"KNN Classification (K={k}), Predicted Label: {y_test}")
plt.show()

代码细节解释

在代码示例中,我们首先生成了一个包括两个类别的二维虚拟数据集,每个类别包含50个样本。然后,定义了计算欧氏距离的函数和KNN分类函数。

KNN分类函数中,通过计算新样本与训练集中所有样本的距离,找出距离最近的K个样本的索引,并获取对应的标签。最后,采用多数表决的方式得到新样本的预测标签。

在绘制散点图时,我们通过红色的x来表示待预测样本,使用标题显示K的值和预测标签。

总结

本文详细介绍了KNN算法如何选择合适的邻居数量来保证模型的泛化能力。从算法原理、公式推导、计算步骤到Python代码示例,每一块都进行了详细的阐述。通过了解KNN算法的工作原理和运行流程,我们可以更好地应用它来解决实际的分类和回归问题。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/833804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球