一、介绍
K最近邻算法(k-Nearest Neighbors,简称KNN)是一种常见的分类和回归算法。简单来说,通过查找测试数据点的K个最近邻居来进行分类或回归。它基于一个简单的假设:如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,则该样本也属于该类别。
KNN算法的关键是选择合适的K值和距离度量方法。K值的选择需要根据具体问题和数据集的特点进行调整。常用的距离度量方法包括欧氏距离、曼哈顿距离和闵可夫斯基距离。
KNN算法的优点是简单易实现,适用于多分类和回归问题。但它的缺点是计算复杂度高,需要存储全部训练样本,对于大规模数据集计算开销较大。此外,KNN对于类别不平衡和噪声数据比较敏感,需要进行数据预处理和特征选择。KNN算法在实际应用中广泛使用,特别是在模式识别、图像处理和推荐系统等领域。
KNN算法的实现步骤如下:
1. 计算测试样本与每个训练样本之间的距离。
2. 根据距离将训练样本排序。
3. 选取距离最近的K个训练样本。
4. 统计这K个训练样本中每个类别的出现次数。
5. 将测试样本分类为出现次数最多的类别。
二、代码实现
首先定义了一个名为KNN的类,它具有三个方法:__init__
,fit
和predict
。在__init__
方法中,我们初始化了K的值,默认为3。在fit
方法中,我们将训练数据X和对应的标签y转换为NumPy数组。在_euclidean_distance
方法中,我们计算两个样本之间的欧氏距离。在predict
方法中,我们遍历测试数据,计算每个测试样本与所有训练样本的距离,并选择最近的K个样本。然后,我们统计这K个样本中标签的频数,并选择频数最高的标签作为预测结果。
import numpy as np
from collections import Counter
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X = np.array(X)
self.y = np.array(y)
def _euclidean_distance(self, x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
def predict(self, X_test):
y_pred = []
for x_test in X_test:
distances = [self._euclidean_distance(x_test, x_train) for x_train in self.X]
k_indices = np.argsort(distances)[:self.k]
k_labels = [self.y[i] for i in k_indices]
most_common = Counter(k_labels).most_common(1)
y_pred.append(most_common[0][0])
return y_pred
# 示例用法
X_train = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]]
y_train = [0, 0, 1, 1, 1]
X_test = [[3, 2], [1, 5]]
knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(y_pred) # 输出:[0, 1]
在示例用法部分,定义了一些简单的训练数据和测试数据,并创建了一个KNN对象。通过调用fit
方法,将训练数据传递给模型进行训练。然后,调用predict
方法来进行预测,并打印预测结果。