【机器学习】KNN算法

KNN算法是一种基于实例的学习,通过计算新样本与训练集样本的距离来分类或回归。文章介绍了KNN算法的基本思想、步骤、K值选择的影响以及距离度量方法如欧几里德和曼哈顿距离。通过两个Python代码实例展示了KNN在分类和回归问题中的应用,强调了K值选择和距离度量对算法性能的重要性。

一. KNN算法简介

KNN算法(K-Nearest Neighbors)是一种基于实例的学习算法,它通过度量样本之间的相似性来进行分类或回归。

KNN算法的基本思想很简单:对于一个未知样本,它的类别或输出值可以通过与训练集中最近邻居的比较来确定。这里的"最近邻"是指距离新样本最近的K个训练集样本。

KNN算法的优点是简单易懂,不需要进行显式的训练过程,而且在处理非线性问题或数据较为复杂的情况下表现良好。

然而,KNN算法也有一些限制。例如,它在处理大规模数据时可能会变得较慢,因为需要计算新样本与所有训练样本之间的距离。此外,KNN算法对于特征的选择和处理、距离度量的选择等方面也需要谨慎考虑。

二. KNN算法步骤

  1. 计算新样本与训练集中每个样本之间的距离。距离可以使用欧几里德距离、曼哈顿距离或其他距离度量方法来衡量。(下面会提距离度量。)
  2. 选择距离最近的K个样本作为新样本的邻居。
  3. 对于分类问题,通过观察邻居的标签来确定新样本的类别。可以使用多数表决的方式,即选择邻居中最常见的类别作为新样本的类别。
  4. 对于回归问题,通过观察邻居的输出值来确定新样本的输出。可以使用平均值或加权平均值来计算邻居的输出,并将该值作为新样本的输出。

三. K值选择

在KNN算法中,K代表选择的邻居数量。K的选择是KNN算法中一个重要的超参数,需要根据具体问题和数据集进行调整。

当K的值较小时(比如K=1),模型对噪声敏感,可能会受到单个离群点的影响。这意味着预测结果可能不够稳定,可能会出现过拟合的情况。

当K的值较大时,模型对噪声的影响较小,更加平滑。然而,选择较大的K值可能会导致模型偏向于多数类别,可能会出现欠拟合的情况。

因此,在实践中,选择适当的K值是很重要的,通常通过交叉验证等技术来确定最佳的K值。

四. 距离度量

在KNN算法中,我们可以根据具体情况选择适当的距离度量方法来计算样本之间的距离。欧几里德距离也称为欧式距离,用于衡量样本在标准坐标系上的直线距离,计算公式如下:

d i s t a n c e = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 distance = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} distance=(x1x2)2+(y1y2)2

对于更高维度的情况,欧几里德距离的计算公式类似,将每个维度上的差值平方相加后取平方根。

曼哈顿距离也叫出租车距离,用来衡量样本在标准坐标系上的绝对轴距总和,计算公式如下:

d i s t a n c e = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ distance = |x_1 - x_2| + |y_1 - y_2| distance=x1x2+y1y2

对于更高维度的情况,曼哈顿距离的计算公式将每个维度上的差值取绝对值后相加。

sklearn库中,我们可以通过指定metric参数来选择使用欧几里德距离或曼哈顿距离,以及其他距离度量方法。

这些不同的距离度量方法可以根据问题的特点来选择,以获得更好的KNN算法性能。

下面是两个简单的代码实例,一个用于分类问题,另一个用于回归问题,以说明KNN算法的应用。

五. 代码实例

实例1:KNN分类

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 假设你有一个包含特征和标签的数据集
# 特征通常是一个二维数组,标签是一个一维数组
features = [[2, 4], [4, 6], [3, 7], [6, 2], [7, 4], [5, 8]]
labels = ['A', 'B', 'A', 'B', 'B', 'A']

# 将数据集拆分为训练集和测试集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.2)

# 创建KNN分类器对象,设定K值为3
knn = KNeighborsClassifier(n_neighbors=3, metric='euclidean')

# 在训练集上训练KNN分类器
knn.fit(train_features, train_labels)

# 使用训练好的分类器进行预测
predictions = knn.predict(test_features)

# 计算预测的准确率
accuracy = accuracy_score(test_labels, predictions)

print(f"测试标签: {test_labels}")
print(f"预测结果: {predictions}")
print(f"准确率: {accuracy}")

在这个代码实例中,我们使用了sklearn库的KNeighborsClassifier类来构建KNN分类器。我们使用了train_test_split函数将数据集拆分为训练集和测试集,然后创建了一个KNN分类器对象,并设置K值为3,距离度量方法为欧几里德距离。接下来,我们使用训练集对KNN分类器进行训练,然后对测试集进行预测,并计算预测的准确率。

实例2:KNN回归

from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 假设你有一个包含特征和目标值的数据集
# 特征通常是一个二维数组,目标值是一个一维数组
features = [[2, 4], [4, 6], [3, 7], [6, 2], [7, 4], [5, 8]]
targets = [5, 8, 9, 3, 2, 6]

# 将数据集拆分为训练集和测试集
train_features, test_features, train_targets, test_targets = train_test_split(features, targets, test_size=0.2)

# 创建KNN回归器对象,设定K值为3,并指定距离度量为曼哈顿距离
knn = KNeighborsRegressor(n_neighbors=3, metric='manhattan')

# 在训练集上训练KNN回归器
knn.fit(train_features, train_targets)

# 使用训练好的回归器进行预测
predictions = knn.predict(test_features)

# 计算预测结果的均方误差(Mean Squared Error,MSE)
mse = mean_squared_error(test_targets, predictions)

print(f"预测结果: {predictions}")
print(f"测试目标值: {test_targets}")
print(f"均方误差: {mse}")

我们使用sklearn库的KNeighborsRegressor类来构建KNN回归器。再使用train_test_split函数将数据集拆分为训练集和测试集,然后创建了一个KNN回归器对象,并设置K值为3,距离度量方法为曼哈顿距离。接下来,我们使用训练集对KNN回归器进行训练,然后对测试集进行预测,并使用mean_squared_error函数计算预测结果的均方误差(MSE)。

### KNN算法原理 KNN算法(K-最近邻算法)是一种基于实例的学习方法,适用于多种机器学习任务,包括但不限于分类、回归等问题[^1]。作为一种监督学习技术,在处理分类问题时,对于给定的数据点,KNN通过找到训练集中与其最接近的k个邻居来决定其所属类别。这些邻居通常依据某种距离度量标准选出,比如欧氏距离。 当面对新的未标记数据时,算法会查找已知数据中最靠近新数据点的k个样本,并统计它们各自的类别频率。最终,待测对象被分配到拥有最多数目的同类成员的那一类中去[^2]。 值得注意的是,尽管名称相似,但是KNN与K-means完全不同。前者依赖于带有标签的数据集来进行预测;后者则是一个无监督的过程,旨在发现数据内部结构而不涉及任何预定义的目标变量[^3]。 关于参数`k`的选择也至关重要。较大的`k`意味着更广泛的范围内的邻居参与决策过程,从而降低了过拟合的风险但可能导致欠拟合现象的发生;相反较小的`k`可以提高模型复杂性和准确性但也容易受到噪声影响[^4]。 ### 应用实例分析 考虑一个具体的例子:假设有一只未知种类的小鸟,它的体形特征已经被量化成一组数值向量\( (0.2, 0.06, 0.25)\),代表翼展比例、体重百分比以及身高的标准化测量值。为了确定这只小鸟的具体物种归属,可以通过比较它和其他已经确认身份鸟类之间的差异程度——即计算两者的欧式距离——进而找出离得最近的一批个体作为参照物。如果设定\( k=3 \),那么就选取三个距离最小的对象并观察它们各自对应的类别分布情况,以此推断目标生物的最大可能性种属关系[^5]。 ```python from sklearn.neighbors import KNeighborsClassifier import numpy as np # 已有的带标签数据 X_train = [[...], [...]] # 特征矩阵 y_train = [...] # 对应标签列表 # 新观测值 new_bird_features = [0.2, 0.06, 0.25] # 创建KNN分类器并设置k值 clf = KNeighborsClassifier(n_neighbors=3) # 训练模型 clf.fit(X_train, y_train) # 预测新观测值的类别 predicted_class = clf.predict([new_bird_features]) print(predicted_class) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如果皮卡会coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值