K近邻(KNN)算法

概述

K近邻算法(K-Nearest Neighbors,简称KNN)是一种用于分类和回归的机器学习算法。它是一种基于实例的学习方法,用于解决分类和回归问题。KNN算法的核心思想是通过比较一个数据点与其最近的K个邻居(样本点)来进行预测或分类。

KNN算法的工作原理

原理

1.选择一个适当的距离度量标准,通常使用欧氏距离或曼哈顿距离来度量数据点之间的距离。

2.给定一个要预测的数据点,计算它与训练数据集中所有数据点之间的距离。

3.根据距离度量,选择与预测数据点最近的K个邻居。

4.对于分类问题,根据这K个邻居中最常见的类别来预测目标数据点的类别。通常采用多数表决的方式,即取K个邻居中出现最频繁的类别作为预测结果。对于回归问题,可以取K个邻居的平均值或加权平均值作为预测结果。

距离度量

欧氏距离(Euclidean Distance): 也称为直线距离,表示两点之间的最短距离。在二维空间中,欧氏距离计算公式为:\sqrt{\left ( {x_{1}}^{2}-{x_{2}}^{2} \right )+({y_{1}}^{2}-{y_{2}}^{2})}

曼哈顿距离(Manhattan Distance): 表示两点之间沿坐标轴的距离总和。在二维空间中,曼哈顿距离计算公式为:\left | {x_{1}}^{} -x_{2}\right |+\left | y_{1} -y_{2}\right |

K值的选择

K值是KNN算法中需要谨慎选择的参数。选择不同的K值可能会导致不同的预测结果。一般来说:1.较小的K值会使模型对噪声敏感,产生波动较大的预测结果。
2.较大的K值会使模型更加稳定,但可能会忽略局部细节。
3.选择K值的方法包括交叉验证、网格搜索和启发式方法。根据问题的复杂性和数据的分布,选择合适的K值是关键的。

实际案例:鸢尾花分类

问题描述:
我们有一组鸢尾花的测量数据,其中包括花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征。每个样本都属于三种不同的鸢尾花品种之一:山鸢尾、变色鸢尾和维吉尼亚鸢尾。我们的目标是构建一个模型,根据这些特征将鸢尾花正确分类到相应的品种。

数据集:
我们将使用经典的鸢尾花数据集(Iris dataset),该数据集包含了150个鸢尾花样本,每个品种各有50个样本。
每个样本都包括四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。

代码示例:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
k = 3  
knn_classifier = KNeighborsClassifier(n_neighbors=k)

knn_classifier.fit(X_train, y_train)
y_pred = knn_classifier.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)
confusion = confusion_matrix(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)

print(f"准确性:{accuracy}")
print("混淆矩阵:")
print(confusion)
print("分类报告:")
print(classification_rep)
# 绘制散点图
plt.figure(figsize=(10, 6))

plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap='viridis', label='Training set')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap='viridis', marker='x', s=100, label='Test set prediction')

plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title('Iris Classification Scatter Plot')

plt.legend()

plt.show()

运行结果:

通过使用K近邻算法,我们可以构建一个能够自动分类鸢尾花品种的模型。这个模型在实际应用中可以用于鸢尾花的自动分类,以帮助大家识别不同品种的鸢尾花。

KNN算法的优势


1.简单易懂: KNN是一种直观的算法,易于理解和实现,适用于初学者。

2.适用于多类别问题: KNN能够有效地处理多类别分类问题,不需要对输出类别进行修改或重新训练。

3.无需训练过程: KNN是一种惰性学习(Lazy Learning)算法,不需要显式的训练过程。模型的训练阶段只涉及存储训练数据。

4.适用于非线性数据: KNN不对数据的分布做出明确的假设,因此对于非线性和复杂的数据分布具有较好的性能。

5.可用于分类和回归: 除了分类任务,KNN还可以应用于回归问题,其中目标是预测数值而不是类别。

6.适应新数据: 模型可以轻松地适应新的训练数据,无需重新训练整个模型。

总结


K近邻算法是一种机器学习方法,用于分类和回归问题。它的核心思想是通过比较一个数据点与其最近的K个邻居来进行预测或分类。它可以在多种问题中使用。但在实际应用中,需要谨慎选择距离度量和K值,以获得最佳性能。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值