欢迎访问宙启技术站
智能推送

Python函数实现K近邻算法的方法

发布时间:2023-06-14 09:17:59

K近邻算法是一种非参数的分类和回归算法,可以用于多种机器学习任务中。在这篇文章中,我们将介绍Python函数实现K近邻算法的方法,这将使你能够快速地将K近邻算法应用到你的数据中。

K近邻算法的基本原理

K近邻算法是一种基于相似性度量的算法,它的核心思想是,如果两个样本在相似性度量空间中越接近,那么它们应该拥有相似的标签。K近邻算法的基本步骤如下:

- 选择一个合适的相似性度量的方式,例如欧氏距离、曼哈顿距离、余弦距离等。

- 给定一个测试样本,找到离它最近的K个训练样本。

- 根据这K个训练样本的标签来预测测试样本的标签。如果是分类问题,通常采用投票的方式决定标签;如果是回归问题,可以采用平均值或加权平均值来预测。

K近邻算法的Python实现

在Python中实现K近邻算法很简单,可以使用Scikit-Learn等第三方库,也可以自己编写函数实现。下面我们来看一下Python函数实现K近邻算法的方法。

首先,我们需要定义一个相似性度量的函数,它接收两个向量作为输入,计算它们之间的距离,并返回一个值。以下是一个计算欧氏距离的函数:

import math

def euclidean_distance(x, y):
    """
    计算两个向量之间的欧氏距离
    """
    distance = math.sqrt(sum([(a - b) ** 2 for a, b in zip(x, y)]))
    return distance

然后,我们需要定义一个函数来查找K个最近的邻居,这可以使用堆数据结构来实现。以下是一个查找K近邻的函数:

import heapq

def find_neighbors(training_set, test_instance, k):
    """
    查找测试样本的K个最近邻居
    """
    distances = []
    for train_instance in training_set:
        dist = euclidean_distance(test_instance, train_instance[:-1])
        distances.append((train_instance, dist))
    neighbors = heapq.nsmallest(k, distances, key=lambda x: x[1])
    return neighbors

最后,我们可以定义一个函数来使用K近邻算法进行分类预测。以下是一个基于K近邻算法的分类函数:

def predict_classification(training_set, test_instance, k):
    """
    预测测试样本的标签
    """
    neighbors = find_neighbors(training_set, test_instance, k)
    labels = [neighbor[0][-1] for neighbor in neighbors]
    predicted_label = max(set(labels), key=labels.count)
    return predicted_label

使用实例

现在我们已经定义了三个函数:计算距离、查找K近邻和进行分类预测。下面使用Iris数据集的一个示例来演示如何使用这些函数。

Iris数据集包含150个样本,其中每个样本有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。此外,每个样本还有一个标签,表示其所属的Iris品种。我们可以使用Pandas库读取Iris数据集。

import pandas as pd

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
iris_data = pd.read_csv(url, names=names)

然后,我们需要将数据集划分为训练集和测试集。我们选择80%的数据用于训练,20%的数据用于测试。

import random

def split_dataset(dataset, split_ratio):
    """
    将数据集划分为训练集和测试集
    """
    train_size = int(len(dataset) * split_ratio)
    train_set = []
    copy = list(dataset)
    while len(train_set) < train_size:
        index = random.randrange(len(copy))
        train_set.append(copy.pop(index))
    test_set = copy
    return train_set, test_set

split_ratio = 0.8
train_set, test_set = split_dataset(iris_data.values.tolist(), split_ratio)

现在我们可以使用K近邻算法对测试集实例进行分类预测。我们选择K=3。

k = 3
correct = 0
for test_instance in test_set:
    predicted = predict_classification(train_set, test_instance, k)
    if test_instance[-1] == predicted:
        correct += 1
accuracy = correct / float(len(test_set)) * 100.0
print('Accuracy: %.2f%%' % accuracy)

我们的最终准确率是93.33%。换句话说,我们的K近邻分类器预测正确的实例比例为93.33%。

结论

在本文中,我们介绍了Python函数实现K近邻算法的方法。我们首先定义了一个计算距离的函数,然后使用堆数据结构查找K近邻,最后使用投票和计算平均数的方式进行分类或回归预测。我们还使用Iris数据集的一个实例演示了如何使用这些函数。这些函数提供了一种快速而简单的方法来实现K近邻算法,你可以将其应用于任何机器学习任务中。