📅  最后修改于: 2023-12-03 14:43:37.947000             🧑  作者: Mango
K 最近邻 (KNN) 是一种非常简单但实用的机器学习算法,可用于分类和回归问题。该算法是基于一个假设:类似的案例具有相似的结果。KNN 根据输入数据点的距离找到它们最近的 K 个邻居,并采用它们的多数表决来预测输出数据的类别或值。
首先,我们需要一个数据集和一个测试集。我们将训练集中的每个数据点与测试集中的每个数据点进行比较,并找到它们之间的距离。我们选择 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 对 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 可能不是最理想的选择。