k-近邻算法

一、k-近邻算法介绍

        K-近邻算法(K-Nearest Neighbors,简称KNN)是一种基本且广泛使用的监督学习算法,主要用于分类和回归问题。它是一种基于实例的学习或懒惰学习算法,因为其核心思想是在预测时才进行计算,而不是在训练阶段。

二、k-近邻算法原理概述

2.1算法原理

KNN算法的核心思想是“物以类聚”,即相似的事物倾向于聚集在一起。对于一个给定的数据点,算法会找到训练数据集中与其最相似的K个邻居。这里的“相似”是通过某种距离度量(如欧氏距离)来定义的。然后,算法根据这K个邻居的标签来预测数据点的标签。

2.2算法步骤

  1. 确定参数K的值:K代表的是邻居的数量,即一个未知样本周围距离最近的K个已知样本。

  2. 计算距离:计算未知样本与所有已知样本之间的距离。常用的距离计算方法包括欧氏距离、曼哈顿距离和明可夫斯基距离等。

  3. 找到最近的K个邻居:根据计算出的距离,确定距离最近的K个样本,这些样本的类别已知。

  4. 进行投票:在分类任务中,K个最近邻居中出现次数最多的类别将被认为是未知样本的类别。在回归任务中,通常是取这K个最近邻居的输出的平均值作为预测值。

  5. 输出预测结果:根据上述投票或平均值,输出最终的预测结果。

2.3距离计算

  1. 欧氏距离(Euclidean Distance)

    • 最常用的距离度量方法,适用于多维空间中的直线距离计算。
    • 计算公式为:d\left (x,y \right )=\sqrt{\sum_{i=1}^{n}\left (x_{i} -y_{i}\right )^{2}},其中 xy 是两个数据点,xi​ 和 yi​ 分别是这两个点在第i个维度上的值。
  2. 曼哈顿距离(Manhattan Distance)

    • 计算两点在标准坐标系上的绝对轴距总和,适用于网格化的城市街区距离计算。
    • 计算公式为:
  3. 切比雪夫距离(Chebyshev Distance)

    • 计算两点在各维度上的最大差值,适用于最大差值距离计算。
    • 计算公式为:

三、代码实现

scikit-learndatasets模块加载了鸢尾花数据集。数据集包含150个样本,每个样本有4个特征和1个类别标签。然后,代码将数据集分为训练集和测试集,其中20%的数据用于测试。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, accuracy_score

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

为了提高KNN算法的性能,我们使用StandardScaler对特征进行了缩放,使得每个特征都有相同的尺度。这是因为KNN算法是基于距离的,如果特征的尺度差异很大,可能会导致算法性能下降。

接下来,我们创建了一个KNeighborsClassifier实例,并设置了K值(在这个例子中K=5)。然后,我们使用训练集数据训练了模型,并在测试集上进行了预测。

# 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 创建KNN分类器实例
knn = KNeighborsClassifier(n_neighbors=5)  # 你可以尝试不同的K值

# 训练模型
knn.fit(X_train_scaled, y_train)

# 进行预测
y_pred = knn.predict(X_test_scaled)

 使用accuracy_scoreclassification_report来评估模型的性能。accuracy_score给出了模型的整体准确率,而classification_report提供了每个类别的精确度、召回率和F1分数。

# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification report:")
print(classification_report(y_test, y_pred))

四、优缺点及应用场景

4.1优缺点

优点:

  • 简单易懂:KNN算法的原理简单,易于理解和实现。
  • 无需训练:作为懒惰学习算法,KNN不需要显式的训练过程,所有计算在预测时进行。
  • 适应性强:KNN算法可以用于分类和回归问题,并且对数据的分布没有假设。

缺点:

  • 计算成本高:对于大规模数据集,计算每个测试点与所有训练点之间的距离非常耗时。
  • 存储需求大:需要存储整个训练数据集。
  • 对参数敏感:K值和距离度量的选择对结果有很大影响。
  • 维度的诅咒:在高维空间中性能下降,因为距离度量可能不再有效。
  • 对异常值敏感:由于是基于距离的算法,KNN对异常值比较敏感。

4.2应用场景

KNN算法在多个领域都有广泛的应用,包括但不限于:

  • 推荐系统:通过分析用户的过去行为来推荐相似的产品或服务。
  • 图像识别:如手写数字识别、图像分类等。
  • 生物信息学:用于基因表达数据的分类。
  • 市场分析:根据消费者的购买历史来预测其未来的购买行为。
  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值