开心实习之第二十五天

在接触机器学习的过程中,K 近邻算法(KNN)给我留下了深刻的印象。它不像有些算法那样包含复杂的数学推导和模型训练过程,反而以简单直观的思路,让我轻松理解了机器学习中 “分类” 任务的核心逻辑。通过学习 PPT 中的内容,从电影分类的实际案例到鸢尾花数据集的代码实现,我不仅掌握了 KNN 的基本原理,更体会到了 “从理论到实践” 的学习乐趣,

开始是用 “电影分类” 这个贴近生活的例子,让我瞬间理解了 KNN 的核心思想 ——“物以类聚,人以群分”。简单来说,就是通过比较新事物与已知事物的 “相似性”,让 “邻居” 来决定新事物的类别。在电影分类的案例中,PPT 给出了一组已知类型电影的特征数据:爱情片和动作片的区别,主要体现在 “打斗镜头数量” 和 “接吻镜头数量” 上。比如《California Man》有 3 个打斗镜头、104 个接吻镜头,被明确归类为 “爱情片”;而《Kevin Longblade》有 101 个打斗镜头、5 个接吻镜头,显然是 “动作片”。当遇到一部 “未知类型” 的电影(18 个打斗镜头、90 个接吻镜头)时,KNN 算法的思路很直接:先看看这部未知电影和已知电影在 “打斗”“接吻” 两个特征上的 “距离”(相似性),再找距离最近的 K 个 “邻居电影”,最后看这 K 个邻居里多数是爱情片还是动作片,未知电影就归为哪一类。这个例子让我意识到,KNN 本质上是一种 “基于相似性的投票机制”,完全不需要复杂的公式推导,凭直觉就能理解。

二、KNN 算法的核心步骤:5 步搞定分类

理解了案例后,PPT 中 KNN 的具体步骤就变得非常清晰了。其实整个算法可以拆解为 5 个简单的步骤,不管是电影分类还是其他任务,都遵循这个逻辑:

  1. 算距离:计算新数据(比如未知电影)与样本集中每个已知数据(比如已知类型的电影)之间的 “距离”。这里的 “距离” 是衡量特征相似性的指标,PPT 中重点介绍了两种常用的距离 —— 欧式距离和曼哈顿距离。
  2. 排顺序:把所有已知数据按与新数据的 “距离” 从小到大排序,距离越近,说明两者越相似。
  3. 选邻居:从排序后的结果里,挑出距离最近的 K 个数据,这 K 个就是新数据的 “邻居”。PPT 特别提到,K 值一般不大于 20,具体选多少需要根据任务调整。
  4. 算频率:统计这 K 个邻居各自的类别,比如 K=3 时,3 个邻居里有 2 个爱情片、1 个动作片。
  5. 定类别:选择出现频率最高的类别作为新数据的分类结果。比如刚才的例子中,爱情片频率更高,未知电影就被判定为爱情片。

这 5 个步骤环环相扣,没有任何 “绕弯子” 的地方。尤其是 PPT 中用 “蓝三角” 和 “红圆” 的示意图展示 K 值的影响时,我更直观地感受到了 K 的重要性:当 K=3 时,新数据的邻居里蓝三角更多,就被归为蓝三角;当 K=5 时,邻居里红圆更多,就被归为红圆。这让我明白,K 值的选择会直接影响分类结果,不能随意设定。

三、关键概念:距离度量如何选?

在 KNN 的第一步 “算距离” 中,“距离度量” 是关键 —— 选对了距离,才能准确衡量数据的相似性。PPT 中重点讲解了两种最常用的距离,我用自己的理解整理成了表格,方便对比:

距离类型核心特点计算公式(以二维空间为例)适用场景
欧式距离衡量两点之间的 “直线距离”,是我们日常生活中最常理解的距离d=(x1​−x2​)2+(y1​−y2​)2​特征值是连续的、且各特征单位一致的场景(比如电影的镜头数量、鸢尾花的花瓣长度)
曼哈顿距离衡量两点在坐标轴上的 “绝对轴距总和”,类似出租车在城市里绕路的距离$d=x_1-x_2+y_1-y_2$特征值有明显 “街区式” 分布的场景(比如城市中的位置定位、用户的消费金额与次数)

一开始我会疑惑 “为什么需要两种距离”,后来通过例子才明白:如果用欧式距离计算城市中两个地点的距离,会忽略 “不能直接走直线” 的实际情况,而曼哈顿距离更符合现实;但如果是计算鸢尾花花瓣长度和宽度的相似性,欧式距离就能准确反映两点的差异。这也让我意识到,机器学习不是 “一套方法用到底”,而是要根据数据特点选择合适的工具。

四、实践出真知:用 sklearn 实现鸢尾花分类

PPT 的后半部分通过 “鸢尾花分类” 的案例,展示了如何用 Python 的 sklearn 库实现 KNN 算法。这部分内容让我从 “理论理解” 走向 “实际操作”,也解决了我之前的很多疑问。

1. 数据集了解:先搞懂 “要分什么”

鸢尾花数据集包含 3 种不同的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾),每种鸢尾花都有 4 个特征:萼片长度(sepal length)、萼片宽度(sepal width)、花瓣长度(petal length)、花瓣宽度(petal width)。我们的任务就是根据这 4 个特征,用 KNN 算法判断一朵未知鸢尾花属于哪一类。

在代码中,通过iris = datasets.load_iris()就能加载数据集,然后用iris.target获取分类标签(0、1、2 分别代表 3 种鸢尾花),用iris.feature_names查看 4 个特征的名称 —— 这些简单的代码让我明白,机器学习的第一步是 “熟悉数据”,只有知道数据里有什么,才能后续建模。

2. 数据划分:为什么要分训练集和测试集?

PPT 中提到 “划分训练集和测试集”,代码是x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)。这里test_size=0.3表示把 30% 的数据作为测试集,70% 作为训练集。

一开始我不理解 “为什么不能用所有数据训练”,后来才想通:如果用所有数据训练模型,模型会 “记住” 所有数据的特征,再用这些数据测试时,准确率肯定很高,但遇到新数据时就会 “不会用”—— 这就是 “过拟合”。而划分测试集的目的,就是模拟 “模型遇到新数据” 的场景,检验模型的泛化能力。这个点让我意识到,机器学习不仅要 “训练得好”,还要 “用得好”。

3. 模型训练与评估:K 值的影响很关键

在训练模型时,代码中创建了 KNN 实例:knn = KNeighborsClassifier(n_neighbors=5, metric="euclidean")。这里n_neighbors=5表示选择 5 个邻居,metric="euclidean"表示用欧式距离计算。然后通过knn.fit(x_train, y_train)完成训练,整个过程非常简洁。

训练完成后,需要评估模型的好坏:用knn.score(x_train, y_train)看训练集得分,用knn.score(x_test, y_test)看测试集得分。PPT 中没有给出具体的得分,但我自己尝试时发现,当 K=5 时,测试集得分通常在 90% 以上,而如果 K 值选得太小(比如 K=1),训练集得分可能很高,但测试集得分会下降 —— 这是因为 K=1 时,模型容易被 “个别异常数据” 影响,也就是 “欠拟合”。

最后,通过y_pred = knn.predict(x_test)可以预测测试集中未知鸢尾花的类别,再对比真实的y_test,就能直观看到模型的预测效果。这个过程让我明白,KNN 的实现并不复杂,关键在于理解每一步的目的,以及参数(比如 K 值、距离度量)对结果的影响。

五、学习 KNN 的收获与反思

通过学习 PPT 中的 KNN 算法,我不仅掌握了一种具体的机器学习方法,更收获了一些通用的学习思路:

  1. 复杂问题简单化:KNN 没有复杂的数学模型,而是用 “找邻居” 这种直观的思路解决分类问题。这让我意识到,机器学习不是 “越复杂越好”,而是要追求 “简单有效”—— 能通过直观逻辑解决的问题,不需要强行套用复杂算法。

  2. 理论与实践结合:一开始我对 “距离度量”“K 值选择” 这些概念只是死记硬背,但通过电影分类的案例和鸢尾花的代码实现,这些概念突然 “活” 了起来。比如当我用不同的 K 值测试鸢尾花分类时,亲眼看到测试集得分的变化,才真正理解了 “K 值不能太大也不能太小” 的原因。这也让我明白,机器学习的学习必须 “动手实践”,只有代码跑起来,才能真正理解理论。

  3. 参数选择的重要性:KNN 中的 K 值、距离度量,都是影响结果的关键参数。这让我意识到,机器学习不是 “调包就行”,而是需要根据数据特点和任务需求,不断尝试和调整参数 —— 比如在电影分类中,K=3 和 K=5 可能会得到不同的结果,需要根据实际情况选择更合适的 K 值。

当然,我也意识到自己的不足:比如 PPT 中没有涉及 KNN 的 “缺点”(比如处理大量数据时速度慢、对异常值敏感),这些内容还需要我后续进一步学习;另外,在实际操作中,如何更科学地选择 K 值(比如通过交叉验证),我还需要更多的实践经验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值