一、KNN算法的概述
KNN算法又叫K近邻算法,是一种基本的分类与回归方法,KNN的全称是K Nearest Neighbors,是众多机器学习算法里面最基础、最简单的算法,简单的说,K近邻算法就是采用测量不同特征值之间的距离方法进行分类,k代表的是选取样本数据集中前k个最相识的数据,通常k是不大于20的整数,k的取值对于KNN算法有着至关重要的作用
二、KNN算法的一般流程
(1)收集数据:可以使用任何方法
(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式
(3)分析数据:可以使用任何方法
(4)训练算法:此步骤不适用于k-邻近算法
(5)测试算法:计算错误率
(6)使用算法:首先需要输入样本数据和结构化的输出结果,k-邻近算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
三、距离的计算
要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离,公式网上可以搜到,就不展示了。
四、代码的简单实现
(1)代码的展示
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
#让plt。show显示的图中title能显示中文而不是乱码
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
#手动导入数据
x1 = np.array([3,2,1])
y1 = np.array([104,100,81])
x2=np.array([101,99,98])
y2=np.array([10,5,2])
x3=18
y3=90
#对数据图像化显示
fig = plt.figure()
map = fig.add_subplot(111)
map.set_title('电影评估')
plt.xlabel('打斗镜头')
plt.ylabel('接吻镜头')
map.scatter(x1,y1,c='r')
map.scatter(x2,y2,c='b')
map.scatter(x3,y3,c='y')
plt.show()
#用于每个数据计算欧式距离
def distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
def knn(train_data, train_lable, test_data, k):
#计算所有的训练数据和测试数据的欧式距离
distances = [distance(test_data, x) for x in train_data]
#将distance中的元素从小到大排列,返回其对应的索引
min_distance = np.argsort(distances)[:k]
k_nearest_labels = [train_lable[i] for i in min_distance]
prediction = np.mean(k_nearest_labels) # 取k个最近样本的平均值作为预测值
return prediction
#导入上面的数据作为训练集
train_data = np.array([[3, 104], [2,100], [1,81], [101,10], [99,5],[98,2]])
train_lable =np.array([1,1,1,0,0,0])
#测试的数据
test_data = np.array([18, 90])
# 定义k值
k = 3
prediction = knn(train_data, train_lable, test_data, k)
print("预测结果:", prediction)
(2)执行的效果截图
数据集的点状图
最后判断的结果
五、实现代码中出现的问题
(1)
def distance(x1, x2):
return np.sqrt(np.sum((x1 - x2) ** 2))
这行代码最开始是使用下面的的代码,但是会报错
def distance(x1, x2):
return math.sqrt((x1 - x2) ** 2)
原因是
-
使用 NumPy 提供的函数进行了平方根运算。这种方法适用于处理向量和矩阵,并且通常在处理大量数据时更高效。
-
Python 的 math 方法是基于标准库提供的平方根函数,它可以用于计算两个数字之间的欧几里得距离。但是,它不能直接用于向量或矩阵,因此在处理大量数据时可能效率较低
(2)上面的代码需要自己手动输入测试集,而不能直接通过文本文件读取
六、总结
K 最近邻(KNN)算法是一种常用的监督学习算法,其优缺点如下:
优点:
- 简单易懂:KNN 是一种直观的算法,易于理解和实现。它不需要对数据进行假设,不需要进行模型训练,因此非常适合作为入门算法。
- 适用于多分类问题:KNN 可以用于解决分类和回归问题。在分类问题中,KNN 可以处理多分类任务,并且不需要进行特别的修改。
- 适用于非线性数据:KNN 不对数据的分布做出假设,因此适用于各种类型的数据,包括非线性数据。
- 预测速度快:在训练阶段,KNN 模型只是简单地存储数据,而在预测阶段,它只需计算新样本与已存储样本的距离,因此预测速度较快。
- 对异常值不敏感:KNN 的预测结果受异常值的影响较小,因为它是基于邻近样本进行预测的,而不是单个样本。
缺点:
- 计算复杂度高:在预测阶段,KNN 需要计算新样本与所有已存储样本的距离,因此计算复杂度较高,尤其是当训练集较大时。
- 存储空间大:KNN 需要存储所有的训练样本,因此对内存的需求较高,尤其是当训练集较大时。
- 需要确定 K 值:KNN 中的 K 值需要人为设定,选择不合适的 K 值可能会影响模型的性能。
- 对数据特征缺失敏感:KNN 是一种基于特征空间距离的算法,当样本特征中存在缺失值时,可能会导致距离计算的不准确性。
- 预测结果可能不稳定:当数据集中存在噪声较多或样本分布不均匀时,KNN 的预测结果可能不稳定,容易受到局部样本分布的影响。
综上所述,KNN 算法是一种简单且有效的算法,特别适用于小规模数据集和非线性数据,但在处理大规模数据时,可能会面临计算复杂度高和存储空间大的问题。