机器学习算法(四):K近邻算法(K-Nearest Neighbors, KNN)最简单的监督学习回归和分类算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

K近邻算法(K-Nearest Neighbors, KNN)是一种简单但有效的监督学习算法,广泛应用于分类和回归任务中。

一、K近邻算法(K-Nearest Neighbors, KNN)

1. 基本思想

KNN算法的基本思想是:给定一个训练数据集,对新输入的实例,根据其在训练数据集中最相似的K个邻居的类别来进行预测。在分类任务中,这个预测通常是通过投票来决定的,即选择K个邻居中出现最多的类别作为新实例的类别;在回归任务中,预测值是K个邻居的平均值。

2. 算法步骤

  1. 选择参数K:即选择最近邻居的数量K。
  2. 计算距离:对于新输入的实例,计算它与训练数据集中每个实例的距离。常用的距离度量包括欧氏距离、曼哈顿距离等。
  3. 找到最近的K个邻居:根据计算的距离,找出距离最小的K个训练实例。
  4. 分类或回归
    • 分类:统计K个邻居中各个类别的出现频率,选择出现频率最高的类别作为新实例的预测类别。
    • 回归:计算K个邻居的输出平均值,作为新实例的预测值。

3. 距离度量

常见的距离度量方法包括:

  • 欧氏距离:对于两个实例 x = ( x 1 , x 2 , … , x n ) x = (x_1, x_2, \ldots, x_n) x=(x1,x2,,xn) y = ( y 1 , y 2 , … , y n ) y = (y_1, y_2, \ldots, y_n) y=(y1,y2,,yn),欧氏距离定义为:
    d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} d(x,y)=i=1n(xiyi)2
  • 曼哈顿距离:定义为:
    d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^{n} |x_i - y_i| d(x,y)=i=1nxiyi
  • 闵可夫斯基距离:是欧氏距离和曼哈顿距离的推广,定义为:
    d ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p d(x, y) = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{1/p} d(x,y)=(i=1nxiyip)1/p

4. 参数选择

  • K值选择:K值的选择对算法性能有很大影响。K值过小,容易受到噪声影响,导致过拟合;K值过大,则计算量增加,并且可能导致欠拟合。常用的选择方法是通过交叉验证来确定最优的K值。
  • 距离度量选择:不同的距离度量对结果的影响不同,选择合适的距离度量可以提高模型的性能。

5. 优缺点

优点

  • 简单易懂,容易实现。
  • 无需训练过程,适合小数据集。

缺点

  • 计算复杂度高,尤其是当数据集较大时,计算所有点之间的距离开销大。
  • 存储复杂度高,需要存储所有训练数据。
  • 对不平衡数据集不敏感,少数类可能被多数类淹没。
  • 需要选择合适的K值和距离度量。

6. 应用实例

假设有一个二维平面上的点数据集,点的颜色代表不同的类别。对于一个新点,计算它到数据集中所有点的距离,选择最近的K个点,按照它们的颜色进行投票,最终确定新点的颜色。

7. 代码示例(Python)

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

# 加载数据集
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.2, random_state=42)

# 标准化数据
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练KNN分类器
k = 5
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)

# 评估准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

以上是关于K近邻算法的详细解释及其在Python中的简单实现。希望这能帮助你更好地理解KNN算法。

总结

可以看到KNN算法的确很简单,模型复杂度低,对于复杂性任务效果就不是很好了。而且模型是基于距离来的,各个数据点键是独立的,缺乏依赖性,似乎丧失了机器学习中学习的意思。

举一个很简单的例子来说明该算法无法处理复杂问题:
我之前做过一个将经纬高坐标转换成地心地固坐标的任务(有具体的转系公式),当时我是用转系公式转过去的。但我这个有一个不是很靠谱的想法(主要是数据集不能覆盖整个地球上的点),用神经网络去拟合这个转系公式,输入是经纬高,输出是地心地固三坐标。理论上只要数据集能覆盖整个地球且够多是可以做到的。

但如果KNN的思路碰到类似问题,缺陷就很大了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值