python实现kNN算法

  • Post category:Python

Python实现kNN算法的完整攻略

kNN算法是一种常用的机器学习算法,用于分类和回归问题。本文将细讲解Python实现kNN算法的整个攻略,包括算法原理、实现过程和示例。

算法原理

kNN算法的基本思想是通过计算待分类样本与训练集中所有样本的距离,选取距离最近的k个样本,根据这k个样本的类别进行投票,将待分类样本归票数最多的类别。在回归问题中,kNN算法的基本思想是通过计算待预测样本与训练集中所有样本的距离,选取距离最近的k个样本,根据这k个样本的值进行平均或加权平均,得到待预测样本的预测值。

具体来说算法分为以下几个步骤:

  1. 计算待分类样本与训练集中所有样本的距离。
  2. 选取距离最近的k个样本。
  3. 根据这k个样本的类别进行投票,将待分类样本归为票数最多的类别。
  4. 在回归问题中,根据这k个样本的值进行平均或加权平均,得到待预测样本的预测值。

实现过程

以下是使用Python实现kNN算法的示例代码:

import numpy as np
from collections import Counter

def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2)**2))

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 = [self._predict(x) for x in X]
        return np.array(y_pred)

    def _predict(self, x):
        distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
        k_indices = np.argsort(distances)[:self.k]
        k_nearest_labels = [self.y_train[i] for i in k_indices]
        most_common = Counter(k_nearest_labels).most_common(1)
        return most_common[0][0]

上述代码中,首先定义了一个euclidean_distance函数,用于计算欧几里得距离。然后定义了一个KNN类,包含fit和predict两个方法。在fit方法中,将训练集X和y保存为类属性。在predict方法中,遍历待分类样本X,调用_predict方法进行预测。在_predict方法中,计算待分类样本与训练集中所有样本的距离,选取距离最近的k个样本,根据这k个样本的类别进行投票,将待分类样本归为票数最多的类别。

示例1

以下是使用kNN算法进行分类的示例代码:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, 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)

上述代码中,首先使用load_iris函数加载鸢尾花数据集。然后使用StandardScaler对数据进行预处理,将数据进行标准化。接着使用train_test_split函数将数据集划分为训练集和测试集。然后使用KNN类训练模型,并使用predict方法预测测试集。最后使用accuracy_score函数计算准确率。

示例2

以下是使用kNN算法进行回归的示例代码:

import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target

# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
knn = KNN(k=3)
knn.fit(X_train, y_train)

# 预测测试集
y_pred = knn.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print('MSE:', mse)

上述代码中,首先使用load_boston函数加载波士顿房价数据集。然后使用StandardScaler对数据进行预处理,将数据进行标准化。接着使用train_test_split函数将数据集划分为训练集和测试集。然后使用KNN类训练模型,并使用predict方法预测测试集。最后使用mean_squared_error函数计算均方误差。

总结

本文详细讲解了Python实现kNN算法的整个攻略,包括算法原理、实现过程和示例。kNN算法是一种常用的机器学习算法,可以用于分类和回归问题。在Python中,可以使用numpy和collections模块实现kNN算法,实现程上述所示。通过示例看到kNN算法在实际应用中的灵活性和实用性。