KNN算法实战:从原理到代码的全面解析

KNN算法实战:从原理到代码的全面解析

本文深入浅出地解析KNN(K最近邻)算法的核心思想,围绕“距离计算、k值选择、分类与回归”三大步骤展开讲解。通过“身高预测体重”的实例,结合Python代码实现,生动演示KNN在回归问题中的应用,并分析k值选择对结果的影响。文章涵盖欧氏距离、曼哈顿距离等关键概念,以及交叉验证调参技巧,适合机器学习初学者快速入门并动手实践。

核心思想:物以类聚,人以群分

  • 通过距离最近的K个邻居的标签,预测自己的类别。

核心步骤

1. 计算距离

  • 距离表征了数据点之间的相似度

例如:小明想通过身高预测体重,只需要找和他身高最近的 k 个同学,通过计算它们的体重平均值来估算自己的体重

常用的计算距离的方法:

  • 欧氏距离:直线距离
  • 曼哈顿距离:网格距离

2.选择 k 值

  • k太小:比如 k 取 1,但是这个选的人正好很胖,体重严重超过当前身高所对应的标准体重,会导致小明估算的体重也偏重
  • k太大:比如 k 取 100,此时虽然保证了体重接近正常人水平,但是如果小明很胖呢,估算结果会受大部分人影响

如何选 k:

  • 经验法:选择 3-10 的奇数,防止平票(会出现在分类问题中)
  • 交叉验证:通过实验选择误差最小的 k 值

3.投票 or 平均

  • 分类问题:少数服从多数,例如根据小明 k 个邻居的宠物选择小明最可能的宠物
  • 回归问题:取平均值,例如根据小明 k 个身高最近同学的体重预测自己的体重

代码实现

import numpy as np


class KNNRegressor:
    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):
        preds = []
        for x in X_test:
            distances = np.sqrt(
                np.sum((self.x_train - x) ** 2, axis=1)
            )  # axis=1表示对每行元素进行求和,这里只有一个特征值,等于没求和
            k_indices = np.argsort(distances)[: self.k]
            k_nearest_labels = self.y_train[k_indices]
            pred = np.mean(k_nearest_labels)
            preds.append(pred)
        return np.array(preds)


# 为什么用二维数组:因为机器学习中输入数据通常为二维数据,即使每个数据只有一个特征值,这样可以更好地辨认出:每一行是一个数据样本,列数即为总样本数
X = np.array([[160], [165], [170], [175], [180], [185]])
y = np.array([50, 55, 65, 70, 80, 85])

knn = KNNRegressor(k=3)
knn.fit(X, y)
test_data = np.array([[168], [172]])
print(knn.predict(test_data))

[63.33333333 63.33333333]

你可能感兴趣的:(机器学习,算法,近邻算法,机器学习,人工智能)