KNN:原理+Python实现

2023-12-19 23:10:45

引言

K最近邻算法(K-Nearest Neighbors,简称KNN)是一种基于实例的学习算法,用于分类和回归问题。KNN的基本思想是,如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,那么该样本也属于这个类别,并且具有这个类别上样本的特性。

KNN算法的基本原理:

  • 距离度量: KNN算法首先通过某种距离度量方法(通常是欧氏距离)计算样本之间的距离。欧氏距离的计算公式为:d(x,y)=[\sum_{i=1}^n(x_i-y_i)^2]^{\frac{1}{2}}其中x_iy_i分别是样本x和y的第i个特征。

  • 找到K个最近邻: 算法找到与目标样本距离最近的K个训练样本。

  • 投票决策: 对于分类问题,KNN通过对这K个最近邻的样本的类别进行投票来决定目标样本的类别。对于回归问题,KNN通过对这K个最近邻的样本的目标值进行平均来估计目标样本的值。

KNN算法的关键参数:

  • K值的选择: K是用户自行选择的参数,通常通过交叉验证来确定。较小的K值可能会导致模型对噪声敏感,而较大的K值可能会使模型过于平滑。

  • 距离度量: 不同的距离度量方法可能会对模型的性能产生影响,常用的包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。

  • 权重: 可以为每个最近邻样本赋予不同的权重,以更好地反映它们的贡献。

KNN算法的优缺点:

优点:

  • 简单易理解,无需估计参数。
  • 对于小规模数据集表现良好。

缺点:

  • 需要存储全部训练数据,对大规模数据集计算开销较大。
  • 预测时的计算复杂度高,特别是对于大规模数据和高维数据。
  • 对异常值敏感。
  • 需要事先确定K值。

KNN通常适用于数据集相对较小且类别之间有较为清晰边界的情况。在实际应用中,为了提高算法的效率,通常会使用树结构(如KD树)来存储训练数据,从而减少计算距离的开销。

Python实现

在Python中,你可以使用scikit-learn库来实现KNN算法。以下是一个简单的示例,演示如何使用scikit-learn中的KNeighborsClassifier来进行分类。

scikit-learn

首先,确保你已经安装了scikit-learn库:

pip install scikit-learn

code

然后,可以使用以下代码演示KNN算法的基本用法:

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
from sklearn import metrics

# 加载示例数据集,这里使用Iris数据集
iris = datasets.load_iris()
X = iris.data  # 特征矩阵
y = iris.target  # 目标标签

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建KNN分类器,设置邻居数为3
knn_classifier = KNeighborsClassifier(n_neighbors=3)

# 使用训练集拟合模型
knn_classifier.fit(X_train, y_train)

# 使用测试集进行预测
y_pred = knn_classifier.predict(X_test)

# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy}')

这个例子使用了Iris数据集,该数据集包含了3种不同种类的鸢尾花,每种花有4个特征(花瓣长度、花瓣宽度、花萼长度、花萼宽度)。在代码中,我们将数据集分割为训练集和测试集,然后使用KNN算法进行训练和预测,最后计算准确率。

文章来源:https://blog.csdn.net/weixin_54703767/article/details/135094964
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。