KNN原理介绍

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

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

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

数学知识
距离度量:常用的距离度量方式有欧氏距离、曼哈顿距离等。在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})。对于高维空间中的点,可以类似地扩展这个定义。

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

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

代码实现(Python使用scikit-learn库)
下面是一个使用scikit-learn库实现KNN分类器的简单示例:

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,然后使用训练数据对模型进行训练。最后,我们使用测试数据进行预测,并输出评估报告和混淆矩阵来评估模型的性能。

运行结果截图:

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值