📜  使用Python从头开始实现 K-最近邻(1)

📅  最后修改于: 2023-12-03 15:22:19.781000             🧑  作者: Mango

使用Python从头开始实现 K-最近邻算法

介绍

在机器学习领域,K-最近邻(K-Nearest Neighbor, KNN)算法是一种基本的分类和回归算法。KNN算法可以用于数据挖掘、图像识别、语音识别等领域。在本文中,我们将从头开始使用 Python 实现 KNN 算法,帮助你了解 KNN 算法的原理和实现过程。

算法原理

KNN算法是一种基于实例的学习算法,它的分类和回归过程都是依据相邻的训练样本而进行的。在分类任务中,KNN算法的原理是:当输入一个新的数据实例时,算法会在训练样本数据集中找到 K 个与该实例最接近的样本数据。然后从这 K 个训练样本中获取分类最多的标签作为该实例的分类标签。如果 K=1,那么该实例的分类标签就是与该实例最接近的训练样本的分类标签。

实现步骤
1. 加载数据集

我们将使用一个包含鸢尾花数据的数据集,该数据集包含4个特征和1个目标变量。首先需要将数据集加载到程序中。下面是使用 Python 加载数据集的实现代码片段:

import csv

def load_dataset(filename):
    dataset = []
    with open(filename, 'r') as file:
        csv_reader = csv.reader(file)
        for row in csv_reader:
            dataset.append([float(x) for x in row])
    return dataset

filename = 'iris.csv'
dataset = load_dataset(filename)
2. 数据归一化

为了消除各特征之间的量纲不同对算法的影响,我们需要对数据进行归一化处理。在这里,我们使用min-max归一化方法,将每个特征的值缩放到0到1之间。下面是数据归一化的实现代码片段:

def normalize_dataset(dataset):
    minmax = [[min(column), max(column)] for column in zip(*dataset)]
    for row in dataset:
        for i in range(len(row)):
            row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])
3. 计算距离

KNN算法的关键步骤是计算数据实例之间的距离。常用的距离度量方法有欧氏距离、曼哈顿距离、切比雪夫距离等,本文使用欧氏距离计算方法。下面是计算距离的实现代码片段:

import math

def euclidean_distance(instance1, instance2):
    distance = 0
    for i in range(len(instance1)):
        distance += (instance1[i] - instance2[i])**2
    return math.sqrt(distance)
4. 获取相邻的样本

在计算实例之间距离的基础上,我们可以获取与新实例最接近的 K 个训练样本。下面是获取相邻的样本的实现代码片段:

def get_neighbors(train_set, test_instance, k):
    distances = []
    for train_instance in train_set:
        dist = euclidean_distance(train_instance[:-1], test_instance)
        distances.append((train_instance, dist))
    distances.sort(key=lambda x: x[1])
    neighbors = [x[0] for x in distances[:k]]
    return neighbors
5. 预测分类标签

获取了最接近的 K 个样本之后,我们需要预测该新实例的分类标签。这个分类标签是与 K 个最接近训练样本中出现最多的标签相同。下面是对新实例分类的实现代码片段:

def predict_classification(train_set, test_instance, k):
    neighbors = get_neighbors(train_set, test_instance, k)
    labels = [neighbor[-1] for neighbor in neighbors]
    return max(set(labels), key=labels.count)
总结

本文介绍了Python实现KNN算法的详细步骤,并且提供了相应代码片段。通过实现KNN算法,你可以更加深入地了解该算法的原理和实现细节。