如何在Python中实现KNN算法的曼哈顿距离

K最近邻(KNN)是一种用于分类和回归的非参数监督学习算法。它的核心思想是根据训练数据中距离测试样本最近的K个邻居来进行预测。本文将详细介绍如何在Python中实现KNN算法,并使用曼哈顿距离来计算数据点间的距离。

整体流程

下面是实现KNN算法的整体流程:

步骤 描述
1 准备数据集
2 实现计算曼哈顿距离的函数
3 实现KNN算法的主逻辑
4 测试算法并进行预测
5 可视化结果

流程图

以下是整个流程的可视化表示:

flowchart TD
    A[准备数据集] --> B[实现曼哈顿距离函数]
    B --> C[实现KNN算法]
    C --> D[测试算法]
    D --> E[可视化结果]

各步骤详解

步骤1:准备数据集

我们首先需要一个数据集来进行KNN算法的训练。在这里,我们将使用NumPy库来创建一个简单的二维数据集。

import numpy as np

# 创建数据集,包含样本特征和对应的标签
# 特征:x1, x2 ; 标签:0或1
data = np.array([[1, 2, 0],
                 [2, 3, 0],
                 [3, 3, 1],
                 [6, 5, 1],
                 [7, 8, 1]])
                 
# 提取特征和标签
X = data[:, :2]    # 前两列是特征
y = data[:, 2]     # 第三列是标签

步骤2:实现计算曼哈顿距离的函数

曼哈顿距离是两点间的绝对距离之和,定义如下: [ D_{Manhattan}(p, q) = \sum_{i=1}^{n} |p_i - q_i| ]

以下是实现曼哈顿距离的代码:

def manhattan_distance(point1, point2):
    """
    计算两个数据点之间的曼哈顿距离
    
    :param point1: 第一个数据点
    :param point2: 第二个数据点
    :return: 曼哈顿距离
    """
    return np.sum(np.abs(point1 - point2))

步骤3:实现KNN算法的主逻辑

我们接下来实现KNN算法的主要逻辑,包括计算每个邻居的距离并进行投票。

def knn(X_train, y_train, X_test, k=3):
    """
    KNN算法的实现
    
    :param X_train: 训练样本特征
    :param y_train: 训练样本标签
    :param X_test: 测试样本特征
    :param k: 选择的邻居数量
    :return: 测试样本的预测标签
    """
    predictions = []
    
    for test_point in X_test:
        # 计算训练集中每个点到测试点的曼哈顿距离
        distances = [manhattan_distance(test_point, train_point) for train_point in X_train]
        
        # 找到距离最近的k个样本的标签
        k_indices = np.argsort(distances)[:k]
        k_nearest_labels = [y_train[i] for i in k_indices]
        
        # 找到最近邻的多数投票结果
        prediction = np.bincount(k_nearest_labels).argmax()
        predictions.append(prediction)
    
    return np.array(predictions)

步骤4:测试算法并进行预测

现在,我们将使用测试数据来评估KNN算法的效果。

# 测试数据
X_test = np.array([[1, 1],
                   [5, 5]])

# 进行预测
predicted_labels = knn(X, y, X_test, k=3)

print(f'预测标签: {predicted_labels}')  # 输出预测标签

步骤5:可视化结果

我们可以使用Matplotlib库来绘制数据点,观察KNN算法的效果。

import matplotlib.pyplot as plt

# 绘制训练数据
plt.scatter(X[:, 0], X[:, 1], c=y, marker='o', label='Train Data')

# 绘制测试数据
plt.scatter(X_test[:, 0], X_test[:, 1], c='red', marker='x', label='Test Data')

plt.title('KNN Visualization')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

饼状图展示

为了可视化我们对预测结果的分析,我们可以使用饼状图来展示预测与实际结果的关系。

pie
    title 预测类别分布
    "类别 0": 1
    "类别 1": 1

结尾

综上所述,我们成功实现了K最近邻(KNN)算法,并利用曼哈顿距离计算数据点间的距离。通过这个简单的例子,你可以看到KNN算法如何对数据进行分类。通过理解整个流程以及Python代码的实现,你可以将这个算法应用于更多复杂的数据集上。

希望这篇文章能帮助你更好地理解KNN算法的实现过程,祝你在机器学习的旅途中一路顺风!