KNN算法(K-Nearest Neighbors Algorithm)是一种常见的监督学习算法,用于分类和回归问题。它的基本思想是根据数据样本之间的距离度量来进行分类或回归预测。
KNN算法原理
-
计算测试样本与训练集中所有样本之间的距离,可以使用欧几里得距离、曼哈顿距离等距离度量方式。
-
根据距离大小对训练集中的样本进行排序。
-
选取与测试样本距离最近的K个样本,这些样本称为最近邻样本。
-
在分类问题中,对于K个最近邻样本,统计它们所属的类别,并将测试样本归属于出现次数最多的类别。
-
在回归问题中,对于K个最近邻样本,计算它们的平均值,并将测试样本预测为这些值的平均值。
KNN算法的实现过程如下:
-
加载数据集,并将数据集分为训练集和测试集。
-
对数据集进行归一化处理,例如将数据缩放到0到1的范围。
-
对测试集中的每个样本,计算其与训练集中所有样本之间的距离。
-
对距离排序,选取距离最近的K个训练样本。
-
对于分类问题,统计这K个样本所属的类别,将测试样本分类为出现次数最多的类别。对于回归问题,计算这K个样本的平均值,将测试样本预测为这些值的平均值。
-
对于每个测试样本,计算预测结果的准确率或均方误差(MSE)等指标,评估模型的性能。
import numpy as np
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X_train, y_train):
self.X_train = X_train
self.y_train = y_train
def predict(self, X_test):
y_pred = []
for x in X_test:
distances = [np.sqrt(np.sum((x - x_train)**2)) for x_train in self.X_train]
nearest_indices = np.argsort(distances)[:self.k]
nearest_labels = [self.y_train[i] for i in nearest_indices]
y_pred.append(max(set(nearest_labels), key=nearest_labels.count))
return np.array(y_pred)
# 加载数据集
iris = datasets.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.3, random_state=42)
# 训练KNN模型
knn = KNN(k=5)
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 计算模型的准确率
accuracy = np.sum(y_pred == y_test) / len(y_test)
print('Accuracy:', accuracy)