引言
K最近邻算法(K-Nearest Neighbors,简称KNN)是一种基于实例的学习算法,用于分类和回归问题。KNN的基本思想是,如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,那么该样本也属于这个类别,并且具有这个类别上样本的特性。
KNN算法的基本原理:
-
距离度量: KNN算法首先通过某种距离度量方法(通常是欧氏距离)计算样本之间的距离。欧氏距离的计算公式为:其中和分别是样本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算法进行训练和预测,最后计算准确率。