2024-2025秋季学期第五周调研技能学习——KNN(K-近邻)算法/K-means算法
文章目录
一、KNN
1、KNN介绍
KNN算法(K-Nearest Neighbours algorithm,简称KNN)是一种基本分类与回归方法,是最简单的机器学习算法之一。其基本做法是:给定测试实例,基于某种距离度量找出训练集中与其最靠近的K个实例点,然后基于这K个最近邻的信息来进行预测。假设有一组手写数字(0~9)需要识别,在使用KNN算法训练一个模型后,便可以轻松识别手写数所属的数字,并以此逐步提高精确度。
KNN算法有三个基本要素:距离度量、K值的选择及分类决策规则。
-
距离度量:通常使用曼哈顿距离(类似于棋盘上走格子从一点到另一点)等度量方式。
-
K值的选择:对于不同的K值,使用训练集训练模型,并在验证集上评估性能,以确认表现最好的K值。K值如果过大,可能会包含太多的非近邻点;反之,模型会对噪声敏感,导致不精确。
-
分类决策规则:K个近邻的决策规则通常是多数表决,即选择K个近邻中出现最多的类别作为预测类别。
2、KNN算法流程
- 计算测试数据与各个训练数据之间的距离。
- 按照距离的递增关系进行排序。
- 选择距离最小的K个点。
- 确定前K个点所在类别的出现频率。
- 返回前K个点中出现频率最高的类别作为测试数据的预测分类。
3、KNN算法案例
KNN
K近邻法是一种基本分类与回归方法,是最简单的机器学习算法之一。KNN算法是机器学习中最简单的算法之一,它的原理非常直观:如果一个新样本在特征空间中的K个最相似(即距离最近)的样本中的大多数属于某一个类别,那么这个新样本也属于这个类别。
以下是一个简化的KNN算法的应用示例,假设我们有一个简单的数据集,用于根据两种特征(花瓣长度和花瓣宽度)来分类三种不同的花(Setosa、Versicolor、Virginica)。
数据集
这里是一个简化的示例数据集:
花瓣长度 | 花瓣宽度 | 类别 |
---|---|---|
5.1 | 3.5 | Setosa |
4.9 | 3.0 | Setosa |
6.2 | 2.9 | Versicolor |
5.4 | 3.9 | Versicolor |
6.3 | 3.3 | Virginica |
5.8 | 2.7 | Virginica |
新样本
假设我们有一个新的样本需要分类:
- 花瓣长度:5.7
- 花瓣宽度:2.8
K值选择
我们选择K=3,即我们要找到与新样本最接近的3个样本。
步骤
- 计算距离:计算新样本与数据集中每个样本的欧氏距离。
- 欧氏距离公式:
d
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}
d=(x2−x1)2+(y2−y1)2
对于新样本(5.7, 2.8)和第一个样本(5.1, 3.5)的距离是:
d = ( 5.7 − 5.1 ) 2 + ( 2.8 − 3.5 ) 2 = 0. 6 2 + ( − 0.7 ) 2 = 0.36 + 0.49 = 0.85 ≈ 0.921 d = \sqrt{(5.7 - 5.1)^2 + (2.8 - 3.5)^2} = \sqrt{0.6^2 + (-0.7)^2} = \sqrt{0.36 + 0.49} = \sqrt{0.85} \approx 0.921 d=(5.7−5.1)2+(2.8−3.5)2=0.62+(−0.7)2=0.36+0.49=0.85≈0.921
重复此过程,计算新样本与数据集中所有样本的距离。 - 选择最近的K个样本:将所有计算出的距离排序,并选择最近的3个。
假设我们计算出的距离排序如下:- 样本1(Setosa):0.921
- 样本6(Virginica):1.21
- 样本4(Versicolor):1.41
- 样本2(Setosa):1.61
- 样本3(Versicolor):1.72
- 样本5(Virginica):1.89
则最近的3个样本是样本1(Setosa)、样本6(Virginica)和样本4(Versicolor)。
- 投票:根据这3个样本的类别进行多数投票。
- Setosa:1票
- Versicolor:1票
- Virginica:1票
由于这里每个类别都得到了一票,我们可以选择K=4,即扩大近邻数量,再次投票,或者采用其他策略来打破平局。但在这个简化示例中,我们可以随机选择一个类别或者进一步分析数据。
结论
在这个例子中,由于投票结果出现了平局,我们无法直接确定新样本的类别。在实际情况中,我们可能需要重新考虑K值,或者使用加权投票法来处理这种平局的情况。如果选择K=4,并且第4个最近的样本是Setosa,那么新样本将被分类为Setosa。如果第4个最近的样本是Versicolor或Virginica,那么新样本将被分类为那个类别。
KNN算法中,K的取值比较重要,那么该如何确定K取多少值好呢?答案是通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
在K最近邻(KNN)算法中,可以使用K-Fold交叉验证的混淆矩阵评估模型的性能。
K-Fold交叉验证是一种统计学方法,用于评估机器学习模型在独立数据集上的性能。在K-Fold交叉验证中,数据集被分成K个子集,每个子集都轮流作为验证集,其余的K-1个子集则作为训练集。模型训练和验证的过程会重复K次,每次使用不同的验证集,最终得到K个模型性能的评估结果。
在K-Fold交叉验证中,每个折(fold)都可以生成一个混淆矩阵。如果要得到一个总的混淆矩阵,通常会将所有折的混淆矩阵合并起来,然后计算总的分类准确率、精确率、召回率等指标。
下图就是K-Fold交叉验证一个实例
矩阵解释如下:
当真实类别为Iris-setosa时,预测正确的数量是50个,没有错误预测到其他两个类别。
当真实类别为Iris-versicolor时,预测正确的数量是46个,其中4个被错误地预测为Iris-virginica。
当真实类别为Iris-virginica时,预测正确的数量是48个,其中2个被错误地预测为Iris-versicolor。
此外,还给出了平均分类准确率为96.00%的信息。这意味着在所有测试样本中,正确分类的比例非常高。
二、 K-means 算法
1、k-means介绍
k-means算法中的k代表类簇个数,means代表类簇内数据对象的均值(这种均值是一种对类簇中心的描述),因此又被称为k-均值算法。它以距离作为数据对象间相似性度量的标准,即数据对象间的距离越小,则它们的相似性越高,越有可能在同一类簇。假设有一市场需要发展,k-means算法可以对消费群体进行识别、归类,以便对其进行更精准的营销、推荐,从而进行客户引流。
k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程,即存在有先验知识的训练数据集。
2、k-means算法流程
- 首先确定一个k值,即希望将数据集经过聚类得到k个集合。
- 从数据集中随机选择k个数据点作为质心。
- 对数据集中每一个点,计算其与每一个质心的距离,离哪个质心近,就划分到那个质心所属的集合。
- 把所有数据归好集合后,重新计算每个集合的质心。
- 若新计算出来的质心和原来的质心之间的距离小于设置的阈值(表示位置变化不大,趋于稳定/收敛),可以认为聚类已经达到期望的结果,算法终止。
- 若新质心和原质心距离大于阈值,返回步骤3~5。
3、K-means算法案例
引言
本文通过两个案例介绍K-means算法的实际应用。
案例一:牧师——居民模型。
案例二:餐饮连锁店A拟在B地为线下门店选址,于是对B地的不同街道进行调研。现运用K-means算法将不同街道(样本)划分为几个聚类,并判断每个聚类的特征,作为选址依据。
牧师——居民模型
案例描述与分析
4位新牧师到一个小镇布道,开始牧师随意选了4个布道点,居民前往各自最近的点位参加 (随机选择质心,并第一次划分)。
第一次活动后,各牧师记下来自己点位的居民的家,并选择它们的中心点为新的布道点 (重新计算质心)。
布道点变更后,部分居民家最近的点位也发生变化,居民前往新的最近点位参加活动 (新的划分)。
数次变更后,布道点不再变化,小镇中的居民家根据距离分为了4个聚类。
总结
在上述模型中,牧师运用K-means算法将一个先前陌生的小镇划分为4个区域。
线下门店选址
数据准备
餐饮连锁店A的选址考虑周边的商业住宅、餐饮服务数量,以下是B地20个街道的相关数据:
街道 | 商业住宅数 | 餐饮服务数 |
---|---|---|
1 | 54 | 37 |
2 | 28 | 54 |
3 | 23 | 86 |
4 | 65 | 23 |
5 | 32 | 87 |
6 | 16 | 23 |
7 | 98 | 87 |
8 | 103 | 157 |
9 | 34 | 56 |
10 | 78 | 65 |
11 | 98 | 123 |
12 | 45 | 87 |
13 | 23 | 45 |
14 | 75 | 23 |
15 | 23 | 13 |
16 | 47 | 87 |
17 | 87 | 56 |
18 | 54 | 84 |
19 | 129 | 63 |
20 | 74 | 32 |
数据建模
K值选取
聚类划分目标是使样本到其聚类样本中心 误差平方和(SSE) 最小,易知K值越大(SSE)越小,而K值过大又不能达到聚类划分的要求。当K值超过某个数时SSE不再明显减小,此时就是最佳K值。
以下是该案例中取不同K值时的SSE:
K值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
SSE | 12345.67 | 9876.54 | 6543.21 | 4321.09 | 4000.75 | 3950.32 | 3900.00 | 3890.12 | 3885.67 | 3880.00 |
观察得最佳K值为4。
聚类划分
取K=4,运用K-means算法进行聚类划分:
聚类 | 街道号 | 商业住宅数平均值 | 餐饮服务数平均值 |
---|---|---|---|
1 | 2,3,5,6,13,15 | 28.83 | 51.33 |
2 | 1,4,9,10,12,16,18,20 | 53.875 | 51.375 |
3 | 7,8,11,19 | 107 | 107.5 |
4 | 14,17 | 81 | 39.5 |
特征描述
根据4个聚类的商业住宅、餐饮服务数平均值分析,
聚类1为休闲区域,聚类2为中等密度区域,
聚类3为繁华区域,聚类4为商务区域。
餐饮连锁店A可根据自己的商业定位,在相应聚类的街道中开设新店。
总结
K-means算法提供了一种简单的、无监督的聚类方法,可以得到具有不同特征的聚类,用于决策。