实现 K-最近邻 (KNN) 算法涉及几个关键步骤:计算点之间的距离、找到最近的邻居以及基于这些邻居进行预测。下面是用 Python 从头开始实现 KNN 分类的简单示例。这个例子将帮助你理解 KNN 背后的核心机制。
步骤 1:计算距离
首先,我们需要一个函数来计算两点之间的距离。通常使用欧几里得距离来实现这一目的。
import numpy as np
def euclidean_distance(point1, point2):
return np.sqrt(np.sum((point1 - point2) ** 2))
步骤 2:KNN 模型
KNN 模型将包括用于拟合数据的方法(对于 KNN 而言,就是存储数据集)和预测新点类别的方法。
class KNN:
def __init__(self, k=3):
self.k = k
self.X_train = None
self.y_train = None
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
# 计算 x 与训练集中所有样本之间的距离
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
# 按距离排序并返回前 k 个邻居的索引
k_indices = np.argsort(distances)[:self.k]
# 提取 k 个最近邻训练样本的标签
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 返回最常见的类别标签
most_common = max(set(k_nearest_labels), key=k_nearest_labels.count)
return most_common
步骤 3:测试实现
要测试这个实现,我们可以使用一个简单的数据集。这里,我们将使用 `sklearn` 的 `make_classification` 来创建一个数据集,然后应用我们的 KNN 分类器。
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# 创建一个数据集
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, random_state=42)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化我们的 KNN
knn = KNN(k=3)
# 拟合模型
knn.fit(X_train, y_train)
# 进行预测
predictions = knn.predict(X_test)
# 计算准确率
accuracy = np.sum(predictions == y_test) / len(y_test)
print(f"准确率: {accuracy}")
这个简单的实现提供了对 KNN 工作原理的清晰理解。然而,在实践中,对于更大的数据集和更复杂的应用,使用像 `scikit-learn` 这样的优化库会更有效。上述实现没有包括使用数据结构(如 KD-树或球树)进行更快速距离计算的优化,这对于处理大型数据集至关重要。
KNN是一种懒惰学习算法,其中所有计算都推迟到预测时进行。对于KNN来说,"训练"阶段实际上只涉及存储数据集。在传统意义上(像在线性回归中拟合一条线或在决策树算法中构建一棵树),并没有从训练数据中构建模型的过程。所以,当我们说.fit(X, y)时,本质上是在记忆训练数据集,这些数据集稍后将在预测阶段用于根据距离度量找到'k'个最近的邻居。