KNN原理介绍

KNN(K-Nearest Neighbors)算法是一种基础且直观的分类与回归方法。下面我将详细介绍KNN算法的原理、思想、涉及的数学知识以及代码实现。

原理

KNN算法基于实例的学习,或者说是“懒惰学习”,因为它没有显式的训练过程,只是简单地将所有训练数据存储在内存中,当接收到新的测试数据时,它会计算新数据与所有训练数据之间的距离,然后找出K个最近邻的样本,最后根据这K个最近邻的样本的类别进行投票,将测试数据归为票数最多的那一类。

思想

KNN算法的核心思想是“物以类聚,人以群分”。如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别。它假设在特征空间中,相似的样本(即距离较近的样本)更有可能属于同一类别。

数学知识

  1. 距离度量:常用的距离度量方式有欧氏距离、曼哈顿距离等。在KNN中,我们通常使用欧氏距离来计算样本之间的相似度。对于二维空间中的两个点(p_1(x_1, y_1))和(p_2(x_2, y_2)),它们的欧氏距离定义为:(d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2})。对于高维空间中的点,可以类似地扩展这个定义。

  2. K值选择:K值的选择对KNN算法的性能有很大影响。较小的K值意味着模型对近邻的样本非常敏感,可能导致过拟合;而较大的K值则可能使模型变得过于简单,导致欠拟合。通常需要通过交叉验证来选择一个合适的K值。

  3. 多数投票:对于分类问题,KNN算法使用多数投票来决定测试样本的类别。即,将测试样本归为K个最近邻样本中出现次数最多的类别。

代码实现

import numpy as np
from collections import Counter


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 = [np.linalg.norm(x - x_train) for x_train in self.X_train]
        # 获取k个近邻的索引  
        k_indices = np.argsort(distances)[:self.k]
        # 提取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]

    # 示例数据


X_train = np.array([[1, 2], [2, 3], [3, 1], [4, 4], [5, 5]])
y_train = np.array([0, 0, 1, 1, 1])

# 创建KNN分类器实例(k=3)  
knn = KNN(k=3)

# 训练模型(实际上KNN没有显式的训练过程,只是保存了训练数据)  
knn.fit(X_train, y_train)

# 预测新数据点  
X_test = np.array([[3, 3]])
predictions = knn.predict(X_test)
print(predictions)  # 输出预测结果

在这个示例中,我们使用了鸢尾花数据集,并通过train_test_split将数据划分为训练集和测试集。然后,我们使用StandardScaler对数据进行标准化处理,以消除不同特征之间的量纲差异对KNN算法的影响。接着,我们初始化一个KNN分类器并设置K值为3,然后使用训练数据对模型进行训练。最后,我们使用测试数据进行预测,并输出评估报告和混淆矩阵来评估模型的性能。

运行结果截图:

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
KNN(K-Nearest Neighbors)是一种常用的机器学习算法,用于分类和回归任务。KNN算法最早由Fix和Hodges于1951年提出,是最简单、直观的机器学习算法之一。 KNN算法的基本思想是:如果一个样本附近的K个最近邻居中,大多数属于某个类别,则该样本也属于该类别。该算法基于一个假设:相似的样本具有相似的标签。因此,通过比较样本之间的相似性来进行分类或回归。 KNN算法原理如下: 1. 计算距离:对于给定的测试样本,计算它与训练集中每个样本之间的距离。常用的距离度量包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。 2. 选择K值:选择一个合适的K值,表示在进行分类或回归时要考虑的最近邻居的数量。 3. 选择邻居:选择与测试样本最近的K个训练样本作为邻居。 4. 进行投票或求平均:对于分类任务,采用投票的方式,将邻居中出现最多的类别作为测试样本的预测类别;对于回归任务,将邻居的标签值求平均,作为测试样本的预测值。 KNN算法的优点是简单易于理解和实现,对于非线性问题效果较好。然而,它的计算复杂度较高,特别是当训练集很大时,预测速度较慢。此外,KNN算法对于数据集中的噪声和冗余特征比较敏感。 总结来说,KNN算法基于样本之间的相似性进行分类或回归。它通过计算距离、选择邻居和投票求平均来进行预测。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值