K-最近邻(KNN,K-Nearest Neighbors)是一个非常简单但有效的机器学习算法。它的基本思想是:给定一个数据点,我们根据它的“邻居”来做预测,看看它与哪些数据点相似,并根据这些邻居的标签来决定该数据点的标签。
KNN 基本概念
假设你有一个数据集,每个数据点都有一些特征和一个标签(可以是分类标签,比如“猫”或“狗”)。KNN 做预测时,找到离当前数据点最近的 K 个数据点(邻居),然后根据这些邻居的标签来决定当前数据点的标签。
- K: 选择最近的 K 个邻居。
- 距离: KNN 使用距离度量来找最近的邻居,通常是欧几里得距离(即两点之间的直线距离)。
- 多数投票: KNN 根据邻居们的标签来决定当前点的标签,通常是采取“多数投票”的方式。
示例:用 KNN 做分类
假设你有一个关于水果的简单数据集,其中包含了水果的重量和颜色特征(比如“红色”和“黄色”),并且标签是“苹果”或“香蕉”。
步骤1:准备数据
首先,我们需要一些数据:
import numpy as np# 数据集:每个数据点有两个特征:重量、颜色
# 红色苹果和黄色香蕉
X = np.array([[150, 1], [120, 0], [170, 1], [130, 0], [160, 1]])
# 标签:1表示苹果,0表示香蕉
y = np.array([1, 0, 1, 0, 1])
在上面的代码中,X
是一个二维数组,代表了每个水果的特征。第一个特征是水果的重量,第二个是颜色(1表示红色,0表示黄色)。y
是水果的标签,1表示“苹果”,0表示“香蕉”。
步骤2:计算距离
KNN 需要计算数据点之间的距离。我们通常使用欧几里得距离,这是两点之间的直线距离。
from sklearn.neighbors import KNeighborsClassifier# 创建 KNN 分类器,k=3表示我们选择最近的3个邻居
knn = KNeighborsClassifier(n_neighbors=3)# 训练 KNN 模型
knn.fit(X, y)# 预测一个新的水果(重量为145,颜色为红色)
new_fruit = np.array([[145, 1]])
prediction = knn.predict(new_fruit)# 输出预测结果
if prediction == 1:print("这是一个苹果!")
else:print("这是一个香蕉!")
这是一个苹果!
步骤3:解释结果
在上面的代码中,我们创建了一个 KNN 模型,并用之前的数据集进行了训练。然后,我们给一个新数据点(重量145g,红色)进行预测。KNN 会根据最近的3个邻居(也就是 K=3)来判断这个新水果的标签。
假设结果显示:“这是一个苹果!”,说明根据最近的3个邻居(可能是一些苹果),KNN 推测这个新水果是苹果。
步骤4:选择 K 值
K 值的选择是 KNN 中一个重要的部分。通常,K 值越大,模型越平滑,但可能会导致过于“笼统”的预测;K 值越小,模型对数据的变化更敏感,可能导致过拟合。选择合适的 K 值需要通过实验来确定。
进一步理解:KNN 的优缺点
优点:
缺点:
- 计算开销大:每次预测时都需要计算与所有训练数据点的距离,特别是在数据量大的时候,效率较低。
- 对不相关特征敏感:如果数据中有噪声或不相关特征,KNN 的预测可能会受到影响。
- 内存消耗大:因为KNN需要保存整个训练集,所以内存消耗可能较大。
结论
KNN 是一个非常简单且实用的算法,特别适用于一些基础的分类任务。不过,它对数据量大的场景可能不太适用,需要一些优化或替代方法。对于小规模数据,KNN 的表现通常是不错的!