Python函数实现K近邻算法的方法
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近邻算法,你可以将其应用于任何机器学习任务中。
