📜  K 最近邻与Python |机器学习(1)

📅  最后修改于: 2023-12-03 14:43:37.947000             🧑  作者: Mango

K 最近邻与Python |机器学习

K 最近邻 (KNN) 是一种非常简单但实用的机器学习算法,可用于分类和回归问题。该算法是基于一个假设:类似的案例具有相似的结果。KNN 根据输入数据点的距离找到它们最近的 K 个邻居,并采用它们的多数表决来预测输出数据的类别或值。

实现 KNN

首先,我们需要一个数据集和一个测试集。我们将训练集中的每个数据点与测试集中的每个数据点进行比较,并找到它们之间的距离。我们选择 K 个最近的邻居,并找到这些邻居中最频繁的类别或值。下面是一个使用 KNN 的 Python 代码片段:

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 个邻居
        k_indices = np.argsort(distances)[:self.k]
        
        # 获取邻居们的标签
        k_labels = [self.y_train[i] for i in k_indices]
        
        # 用众数来进行分类
        most_common = Counter(k_labels).most_common(1)
        return most_common[0][0]
使用 KNN 进行分类

这里是一个例子,展示如何使用 KNN 对 Iris 数据集中的花进行分类。我们使用 Scikit-learn 库中提供的 Iris 数据集,该库也提供了 KNN 分类器。对于这个例子,我们将使用自己的算法。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
 
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)
结论

KNN 算法是一种简单但实用的机器学习算法,可用于分类和回归问题。它的优点是易于理解和实现,并且通常没有训练时间。但是,它需要计算每个输入数据点和每个训练数据点之间的距离,这可能变得非常耗时。因此,在大规模数据集上使用 KNN 可能不是最理想的选择。