<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>机器学习 on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/</link>
        <description>Recent content in 机器学习 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Fri, 24 Apr 2026 11:17:13 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>K-近邻算法入门：用邻居投票理解机器学习分类</title>
        <link>https://www.knightli.com/2026/04/24/knn-algorithm-beginner-guide/</link>
        <pubDate>Fri, 24 Apr 2026 11:17:13 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/04/24/knn-algorithm-beginner-guide/</guid>
        <description>&lt;p&gt;&lt;code&gt;K-近邻算法&lt;/code&gt;，也常写作 &lt;code&gt;KNN&lt;/code&gt; 或 &lt;code&gt;k-NN&lt;/code&gt;，是机器学习里非常适合入门的一类算法。它的想法很朴素：要判断一个新样本属于哪一类，就看看它周围最像它的几个样本大多属于哪一类。&lt;/p&gt;
&lt;p&gt;如果一句话解释 KNN，可以这样说：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;近朱者赤，近墨者黑。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如你刚搬到一个小区，不知道附近哪家早餐店更适合学生。你问了离你最近的 5 个邻居，里面 4 个人都推荐同一家店，那你大概率也会先相信这家店。KNN 做分类时，也是在做类似的事情：找邻居，看多数。&lt;/p&gt;
&lt;h2 id=&#34;1-先从一个小例子理解&#34;&gt;1. 先从一个小例子理解
&lt;/h2&gt;&lt;p&gt;假设我们要判断一个水果是苹果还是橙子。已知一些水果的特征，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重量&lt;/li&gt;
&lt;li&gt;颜色&lt;/li&gt;
&lt;li&gt;甜度&lt;/li&gt;
&lt;li&gt;表皮是否粗糙&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在来了一个新水果，我们还不知道它是什么。KNN 不会先总结一套复杂规则，而是直接去已知水果里找“最像它”的几个。&lt;/p&gt;
&lt;p&gt;如果最像它的 5 个水果中，有 4 个是苹果，1 个是橙子，那么 KNN 就会判断：这个新水果更可能是苹果。&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;K&lt;/code&gt;，就是“要看几个邻居”。如果 &lt;code&gt;K=5&lt;/code&gt;，就是看最近的 5 个样本。&lt;/p&gt;
&lt;h2 id=&#34;2-一个简单示意图&#34;&gt;2. 一个简单示意图
&lt;/h2&gt;&lt;p&gt;下面用一个二维小图来直观理解。假设 &lt;code&gt;A&lt;/code&gt; 表示苹果，&lt;code&gt;O&lt;/code&gt; 表示橙子，&lt;code&gt;?&lt;/code&gt; 是我们想判断的新水果。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;甜度 ↑
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  高 |        A       A
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     |           ?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     |       A       O
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  低 |   O       O
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     +--------------------→ 重量
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        轻              重
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果我们设 &lt;code&gt;K=3&lt;/code&gt;，就看离 &lt;code&gt;?&lt;/code&gt; 最近的 3 个点。假设最近的 3 个邻居里有 2 个 &lt;code&gt;A&lt;/code&gt;、1 个 &lt;code&gt;O&lt;/code&gt;，那 KNN 就会把 &lt;code&gt;?&lt;/code&gt; 判断为 &lt;code&gt;A&lt;/code&gt;，也就是苹果。&lt;/p&gt;
&lt;p&gt;这就是 KNN 最核心的过程：&lt;strong&gt;找最近的 K 个邻居，然后投票。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;3-knn-的基本步骤&#34;&gt;3. KNN 的基本步骤
&lt;/h2&gt;&lt;p&gt;用不带公式的方式看，KNN 的分类流程大概是这样：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;准备一批已经标好类别的数据&lt;/li&gt;
&lt;li&gt;新来一个未知类别的样本&lt;/li&gt;
&lt;li&gt;计算它和所有已知样本的相似程度&lt;/li&gt;
&lt;li&gt;找出最相似的 K 个样本&lt;/li&gt;
&lt;li&gt;看这 K 个样本里哪个类别最多&lt;/li&gt;
&lt;li&gt;把新样本归到这个类别&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这也是为什么 KNN 很容易理解。它不像一些模型那样需要先训练出一堆参数，KNN 更像是把训练数据先存起来，真正需要判断时再去查邻居。&lt;/p&gt;
&lt;p&gt;这种特点也让 KNN 常被称为一种“惰性学习”方法。这里的“惰性”不是贬义，而是说它不会在训练阶段做太多计算，主要工作被推迟到了预测阶段。&lt;/p&gt;
&lt;h2 id=&#34;4-什么叫最近&#34;&gt;4. 什么叫“最近”
&lt;/h2&gt;&lt;p&gt;KNN 里的“最近”，不一定只是地图上的距离。它通常表示“特征上更相似”。&lt;/p&gt;
&lt;p&gt;比如判断水果时，两个水果如果重量接近、颜色接近、甜度接近，就可以认为距离更近。判断用户兴趣时，如果两个人看过的内容、点击习惯、购买记录很像，也可以认为他们更接近。&lt;/p&gt;
&lt;p&gt;所以 KNN 的关键不是“空间位置”，而是你怎么描述一个样本。&lt;/p&gt;
&lt;p&gt;常见特征可以是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商品价格、重量、销量&lt;/li&gt;
&lt;li&gt;用户年龄、浏览次数、购买频率&lt;/li&gt;
&lt;li&gt;图片的颜色、纹理、形状&lt;/li&gt;
&lt;li&gt;文本中某些词出现的情况&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特征选得好不好，会直接影响 KNN 的效果。&lt;/p&gt;
&lt;h2 id=&#34;5-k-值怎么选&#34;&gt;5. K 值怎么选
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;K&lt;/code&gt; 不是固定答案，而是需要根据数据来选。&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;K&lt;/code&gt; 太小，比如 &lt;code&gt;K=1&lt;/code&gt;，模型会非常相信最近的那个样本。这有时很敏感：如果最近的样本刚好是噪声数据，判断就容易错。&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;K&lt;/code&gt; 太大，模型又会看太多邻居，结果可能被远处不太相关的样本影响，分类边界会变得模糊。&lt;/p&gt;
&lt;p&gt;可以把它理解成问人意见：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只问 1 个人：容易被个别意见带偏&lt;/li&gt;
&lt;li&gt;问太多人：可能把不熟悉情况的人也算进来了&lt;/li&gt;
&lt;li&gt;问附近几位最相关的人：通常更稳&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在二分类问题里，很多时候会选奇数 K，比如 &lt;code&gt;3&lt;/code&gt;、&lt;code&gt;5&lt;/code&gt;、&lt;code&gt;7&lt;/code&gt;，这样可以减少投票平局的情况。&lt;/p&gt;
&lt;h2 id=&#34;6-knn-不只可以做分类&#34;&gt;6. KNN 不只可以做分类
&lt;/h2&gt;&lt;p&gt;KNN 最常见的用途是分类，比如判断：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;邮件是不是垃圾邮件&lt;/li&gt;
&lt;li&gt;图片里是猫还是狗&lt;/li&gt;
&lt;li&gt;用户是否可能流失&lt;/li&gt;
&lt;li&gt;一条评论是正面还是负面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但它也可以做回归。回归可以理解为预测一个数值。&lt;/p&gt;
&lt;p&gt;比如我们想估计一套房子的价格，可以找出和它最相似的几套房子，然后参考这些房子的价格。不是投票选类别，而是把邻居的数值做一个综合估计。&lt;/p&gt;
&lt;p&gt;简单说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分类：邻居投票，选类别&lt;/li&gt;
&lt;li&gt;回归：参考邻居数值，估结果&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7-加权-knn近一点的邻居更重要&#34;&gt;7. 加权 KNN：近一点的邻居更重要
&lt;/h2&gt;&lt;p&gt;普通 KNN 会让每个邻居的投票权差不多。但现实中，离得更近的邻居通常更可信。&lt;/p&gt;
&lt;p&gt;比如有 5 个邻居，其中 1 个和新样本几乎一模一样，另外 4 个只是稍微有点像。完全平均投票可能不太合理。&lt;/p&gt;
&lt;p&gt;所以有一种改进思路叫“加权 KNN”：越近的邻居，影响越大；越远的邻居，影响越小。&lt;/p&gt;
&lt;p&gt;这很好理解。你买手机时，和你预算、用途、品牌偏好都很接近的人，他的建议往往比泛泛而谈的建议更有参考价值。&lt;/p&gt;
&lt;h2 id=&#34;8-knn-的优点&#34;&gt;8. KNN 的优点
&lt;/h2&gt;&lt;p&gt;KNN 的优点非常适合初学者理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;思路直观，容易解释&lt;/li&gt;
&lt;li&gt;不需要复杂训练过程&lt;/li&gt;
&lt;li&gt;可以用于分类，也可以用于回归&lt;/li&gt;
&lt;li&gt;对一些边界不规则的问题比较灵活&lt;/li&gt;
&lt;li&gt;新增数据时通常比较方便&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你刚开始学机器学习，KNN 是一个很好的起点。它能帮助你理解“样本”“特征”“距离”“分类”“训练数据”这些基本概念。&lt;/p&gt;
&lt;h2 id=&#34;9-knn-的局限&#34;&gt;9. KNN 的局限
&lt;/h2&gt;&lt;p&gt;KNN 也有明显短板。&lt;/p&gt;
&lt;p&gt;第一，预测时可能比较慢。因为每来一个新样本，都要和很多已有样本比较。如果数据量很大，计算成本会升高。&lt;/p&gt;
&lt;p&gt;第二，它很依赖特征尺度。比如一个特征是“收入”，动不动几千几万；另一个特征是“年龄”，通常几十。如果不做处理，收入这个特征可能会过度影响距离判断。&lt;/p&gt;
&lt;p&gt;所以在使用 KNN 前，经常需要做数据标准化，让不同特征在比较时更公平。&lt;/p&gt;
&lt;p&gt;第三，它容易受无关特征影响。如果你判断水果类别，却把“购买日期”这种无关信息也放进去，模型可能会被干扰。&lt;/p&gt;
&lt;p&gt;第四，它对局部数据分布敏感。如果某一类样本特别多，投票时可能更容易压过其他类别。&lt;/p&gt;
&lt;h2 id=&#34;10-容易和-k-平均算法混淆&#34;&gt;10. 容易和 K-平均算法混淆
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;KNN&lt;/code&gt; 和 &lt;code&gt;K-平均算法&lt;/code&gt; 名字里都有 &lt;code&gt;K&lt;/code&gt;，但它们不是一回事。&lt;/p&gt;
&lt;p&gt;KNN 是监督学习，通常使用已经标好类别的数据来判断新样本。&lt;/p&gt;
&lt;p&gt;K-平均算法更常用于聚类，也就是在没有明确标签时，把数据自动分成几组。&lt;/p&gt;
&lt;p&gt;可以简单记：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KNN：看邻居，做分类或回归&lt;/li&gt;
&lt;li&gt;K-平均：找中心，把数据分组&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;11-什么时候适合用-knn&#34;&gt;11. 什么时候适合用 KNN
&lt;/h2&gt;&lt;p&gt;KNN 适合这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据量不太大&lt;/li&gt;
&lt;li&gt;特征比较容易表示成数值&lt;/li&gt;
&lt;li&gt;样本之间的“相似程度”比较有意义&lt;/li&gt;
&lt;li&gt;需要一个容易解释的基线方法&lt;/li&gt;
&lt;li&gt;想快速验证一个分类思路是否可行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果数据量巨大、特征非常多、预测速度要求很高，KNN 可能就不是最合适的选择，或者需要配合更高效的近邻搜索方法。&lt;/p&gt;
&lt;h2 id=&#34;12-初学者应该记住什么&#34;&gt;12. 初学者应该记住什么
&lt;/h2&gt;&lt;p&gt;学 KNN 时，不需要一开始就钻进复杂公式。先记住这几个直觉就够了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;KNN 用“邻居”来判断新样本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K&lt;/code&gt; 表示看几个最近邻居&lt;/li&gt;
&lt;li&gt;分类时靠投票，回归时参考邻居数值&lt;/li&gt;
&lt;li&gt;特征选择和数据标准化很重要&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K&lt;/code&gt; 太小容易受噪声影响，太大又可能变得迟钝&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;KNN 的价值不只是它本身能解决一些问题，更在于它把机器学习里几个基础观念讲得很清楚：数据如何表示、相似度如何衡量、预测如何从已有样本中产生。&lt;/p&gt;
&lt;p&gt;只要理解了“找相似样本，再根据邻居做判断”这件事，就已经抓住了 KNN 的核心。&lt;/p&gt;
&lt;h2 id=&#34;相关链接&#34;&gt;相关链接
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://zh.wikipedia.org/wiki/K-%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;K-近邻算法 - 维基百科&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
