k最临近算法(KNN)

一、 介绍

KNN(K-Nearest Neighbor)算法是机器学习领域中最基础、最简单的算法之一。其核心思想是通过测量不同数据点之间的距离来进行分类。

具体来说,KNN算法的工作原理可以概括为以下几个步骤:首先,存在一个包含多个已知标签样本的数据集,这些样本由多个特征构成的多维空间表示。当需要预测或分类一个新的样本时,KNN算法会计算这个新样本与数据集中所有已知样本的距离。然后,选取与新样本距离最近的K个已知样本,这K个样本被称为该新样本的“最近邻”。最后,根据这K个最近邻的标签类别,通过多数投票的方式确定新样本的类别。

在KNN算法中,K的取值是一个重要的参数,它影响了算法的预测性能。如果K的值过小,可能会导致预测结果对噪声数据过于敏感,产生过拟合;而如果K的值过大,可能会导致预测结果过于平滑,忽视数据的局部结构。

KNN算法的优点在于它易于理解,实现简单,且不需要对数据进行复杂的预处理或特征工程。同时,KNN算法对于多类别问题以及非线性数据具有较好的处理能力。然而,KNN算法的缺点也很明显,它在进行预测时需要计算待分类样本与所有训练样本的距离,因此当数据集较大时,计算复杂度会非常高。此外,KNN算法对异常值敏感,对数据的分布和标准化程度也有一定要求。

在实际应用中,KNN算法广泛应用于图像分类、文本分类、推荐系统、数据挖掘、生物信息学以及财务分析等多个领域。例如,在图像分类中,KNN算法可以用于识别图像中的人脸、车牌等;在推荐系统中,KNN算法可以根据用户的历史行为推荐商品或音乐。

总的来说,KNN算法是一种简单而有效的机器学习算法,尽管存在一些缺点,但在许多实际应用场景中都能取得良好的分类效果。

二、距离的计算

KNN算法中的距离计算是核心步骤之一,用于确定数据点之间的相似度。在KNN算法中,常用的距离计算公式有多种,包括欧氏距离、曼哈顿距离和闵可夫斯基距离等。

1.欧氏距离

欧氏距离是最常用的距离计算方法。它衡量的是两个点在多维空间中的绝对距离。计算公式为:d(x, y) = sqrt((x1 - y1)^2 + (x2 - y2)^2 + ... + (xn - yn)^2),其中x和y表示两个样本点的特征向量,x1、x2、...、xn和y1、y2、...、yn是它们对应的特征值,sqrt表示平方根运算。

2.曼哈顿距离

曼哈顿距离也被称为城市街区距离,计算的是两个点在标准坐标系上的绝对轴距总和。其计算公式为:d(x, y) = |x1 - y1| + |x2 - y2| + ... + |xn - yn|。

除了欧氏距离和曼哈顿距离,KNN算法中还可以使用其他距离计算方法,如切比雪夫距离等。这些距离计算方法的选择取决于具体的应用场景和数据特性。

在计算完所有距离后,KNN算法会把这些距离从小到大排序,然后选择距离最近的K个样本作为新样本的“邻居”。最后,根据这些邻居的标签来预测新样本的标签。

需要注意的是,距离计算方式的选择对KNN算法的性能和结果有重要影响。因此,在实际应用中,需要根据数据的特点和问题的需求来选择合适的距离计算方式。

三、K值的选取

       当K值取1时,即为最临近算法。新增的未标注的样本点会被归到离它最近的样本所在的类中。这可能会出现问题,比如原数据存在问题的话。还是应该多参考其他邻居的情况。

        当K值过大时,这时可能会把较远的邻居考虑进去,这并不是我们希望的,就会导致欠拟合。

        当K值取偶数时,就可能出现两个类出现次数一样的情况,这时又该选哪一类?所以我们一般将K值设置为奇数。

        K值的选取我们可以通过交叉验证,让K从一个很小的值开始,比如从1开始慢慢增大,选取误差最小的K值。(为什么要从1开始呢?因为在某些情况下,K值取1的效果会更加好些,具体取值还得根据具体的实际情况决定)

import numpy as np  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn import metrics  
from sklearn.datasets import load_iris  
  
# 加载数据集,这里以鸢尾花数据集为例  
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()  
scaler.fit(X_train)  
  
X_train = scaler.transform(X_train)  
X_test = scaler.transform(X_test)  
  
# 初始化KNN分类器,设置邻居数量为3  
knn = KNeighborsClassifier(n_neighbors=3)  
  
# 使用训练数据拟合模型  
knn.fit(X_train, y_train)  
  
# 对测试数据进行预测  
y_pred = knn.predict(X_test)  
  
# 打印分类报告和混淆矩阵  
print("Classification report for classifier %s:\n%s\n"  
      % (knn, metrics.classification_report(y_test, y_pred)))  
print("Confusion matrix:\n%s" % metrics.confusion_matrix(y_test, y_pred))

在这个例子中,我们使用了鸢尾花(Iris)数据集,这是一个经典的多类分类数据集。首先,我们加载数据并将其划分为训练集和测试集。然后,我们使用StandardScaler对数据进行标准化处理,这是KNN算法中常见的数据预处理步骤,因为KNN是基于距离的算法,特征的尺度会影响距离的计算。

接下来,我们初始化一个KNeighborsClassifier对象,并设置邻居数量(n_neighbors)为3。然后,我们使用训练数据拟合模型,并对测试数据进行预测。最后,我们打印出分类报告和混淆矩阵来评估模型的性能。

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值