Python机器学习实战之k-近邻算法的实现

  • Post category:Python

Python机器学习实战之k-近邻算法的实现

简介

k-近邻算法是一种基于实例的学习算法,其基本思想是:对于一个新的样本,找到与其最相似的k个样本,然后根据这k个样本的标签来预测该样本的标签。在本攻略中,我们将介绍如何使用Python编程实现k-近邻算法。

k-近邻算法的实现

以下是使用Python编程实现k-近邻算法的示例代码:

import numpy as np

class KNN:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def predict(self, X):
        y_pred = []
        for x in X:
            distances = np.sqrt(np.sum((self.X_train - x)**2, axis=1))
            k_nearest = np.argsort(distances)[:self.k]
            k_labels = self.y_train[k_nearest]
            y_pred.append(np.bincount(k_labels).argmax())
        return y_pred

在这个示例中,我们定义了一个KNN类,该类包含三个方法:init、fit和predict。__init__方法用于初始化k值,默认为3。fit方法用于训练模型,接受训练数据X和标签y作为参数。predict方法用于预测新的样本,接受测试数据X作为参数,并返回预测标签y_pred。

在predict方法中,我们首先定义一个空列表y_pred,用于存储预测标签。然后,我们遍历测试数据X中的每个样本x。对于每个样本x,我们计算其与训练数据X中每个样本的距离,并将距离存储在distances数组中。然后,我们使用argsort函数对distances数组进行排序,并取出前k个最小值的索引,存储在k_nearest数组中。接下来,我们从训练标签y_train中取出k_nearest数组对应的标签,并使用bincount函数统计每个标签出现的次数,并返回出现次数最多的标签作为该样本的预测标签。最后,我们将预测标签y_pred添加到y_pred列表中,并返回y_pred。

示例

以下是两个示例说明,展示了如何使用Python编程实现k-近邻算法。

示例1

使用k-近邻算法对鸢尾花数据集进行分类:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from knn import KNN

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

在这个示例中,我们使用sklearn库中的load_iris函数加载鸢尾花数据集,并使用train_test_split函数将数据集分为训练集和测试集。然后,我们定义了一个knn对象,使用fit方法训练模型,并使用predict方法预测测试集的标签。最后,我们使用accuracy_score函数计算预测准确率,并将结果打印输出。

示例2

使用k-近邻算法对手写数字数据集进行分类:

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from knn import KNN

digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42)

knn = KNN(k=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

在这个示例中,我们使用sklearn库中的load_digits函数加载手写数字数据集,并使用train_test_split函数将数据集分为训练集和测试集。然后,我们定义了一个knn对象,使用fit方法训练模型,并使用predict方法预测测试集的标签。最后,我们使用accuracy_score函数计算预测准确率,并将结果打印输出。

结论

本攻略介绍了如何使用Python编程实现k-近邻算法,并提供了两个示例说明,展示了如何使用k-近邻算法对鸢尾花数据集和手写数字数据集进行分类。这些示例代码帮助初学者更好地理解如何使用Python编程实现k-近邻算法。