一、K近邻(KNN)算法是一种常见的监督学习算法,用于分类和回归问题。它基于一个简单的思想:如果一个样本在特征空间中的K个最近邻居中的大多数属于某一个类别,那么该样本很可能属于该类别。
二、 基本原理:如下图,在一个样本集中,以需要预测的样本为半径中心(图中圆心),通过特定的距离计算方法将数据集中不同特征的数据进行与样本测距,并分布在以圆心为半径的圆上(图中的各个三角形菱形图,此时对于要预测的圆心点我们去选择距离圆心最近的k个点中相同特征最多的点来预测圆心样本的特征。
例如当k=3时,图中距离中心样本的最多的是菱形,则预测中心样本也为菱形;而当k=5时,距离中心样本最多的则是三角形,则预测中心样本也为三角形。
因此对于knn算法来说,k的取值是非常重要的,不同的取值预测的结果是不同的。
三、knn算法中常用的距离指标
·欧几里得距离:
它也被称为L2范数距离。说白话点其实就是两点之间的直线距离,公式:
·曼哈顿距离:
也称为城市街区距离,通过在坐标系上沿着坐标轴方向移动计算出来的距离,公式:
四、knn算法的一般流程:
- 计算测试样本与训练样本之间的距离,常用的距离度量方法包括欧氏距离、曼哈顿距离等。
- 选择K个最近邻居,可以根据距离进行排序并选择距离最近的K个样本。
- 根据最近邻居的类别进行投票或计算权重,决定测试样本的类别。在分类问题中,常用的投票方式是多数表决,即选择K个最近邻居中出现频率最高的类别作为测试样本的类别。在回归问题中,通常取K个最近邻居的平均值作为预测结果。
- 输出测试样本的类别或预测结果。
五、knn算法的一个案例(基于游戏时长预测喜欢的游戏类型)
已知一个人喜欢的游戏类型为:
1·fps
2·moba
其包含以下特征:
1、apex游戏时长
2、lol游戏时长
3、csgo游戏时长
4、王者荣耀游戏时长
代码实现:
import numpy as np
# 定义KNN算法函数
def knn(data, labels, test_data, k):
distances = np.sum(np.abs(data - test_data), axis=1) # 使用曼哈顿距离计算距离
sorted_indices = np.argsort(distances) # 获取距离排序后的索引
k_nearest_labels = labels[sorted_indices[:k]] # 获取前k个最近邻的标签
label_counts = np.bincount(k_nearest_labels) # 统计每个类别的数量
predicted_label = np.argmax(label_counts) # 获取数量最多的类别作为预测结果
return predicted_label
# 创建模拟数据集
data = np.array([
[10, 8, 5, 3],
[2, 6, 8, 2],
[4, 9, 1, 7],
[8, 5, 7, 4],
[7, 4, 6, 5],
[3, 9, 8, 1]
])
labels = np.array([0, 1, 1, 0, 1, 0]) # 0表示likefps,1表示likemoba
# 测试样本
test_sample = np.array([6, 7, 4, 6])
# 使用KNN进行预测
k = 3 # 设置K值
predicted_label = knn(data, labels, test_sample, k)
# 打印预测结果
if predicted_label == 0:
print("预测结果:likefps")
else:
print("预测结果:likemoba")
运行结果:
五、总结:
因为此实验是继搭建环境后的第一个实验,同时也是我继环境搭建之后的第不知几次使用vscode,因此刚起步时就在使用上磕磕碰碰,其中就有几个比较笨比的问题:
1、在在vscode中运行代码时,要么是在右上角的开始号旁边的下拉键中选择运行python文件而不是直接点击运行按钮,如图:
又或是在vscode自带命令窗口通过代码python+文件名,来运行代码,注意在首次使用命令窗时一定要先选定Command Prompt,如图:
同时,在运行相关python代码的时候,一定要注意自己创建的虚拟环境中是否拥有代码所需的包,若没有一定要在对应虚拟环境中安装,注意不要安装错环境位置。
六、心得:
KNN算法是一种简单而有效的分类算法。它的主要思想是根据样本之间的距离来确定新样本的类别,即选择与新样本最近的K个邻居,并将其多数类别作为预测结果,适用于小规模数据集和特征维度不高的场景。但在使用过程中,需要注意特征选择、数据标准化、K值选择和处理不平衡数据集等问题。对于大规模数据集,KNN的计算开销和存储空间也需要加以考虑。