简单的KNN算法的实现

一、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)算法是一种常用的监督学习算法,其优缺点如下:

优点:

  1. 简单易懂:KNN 是一种直观的算法,易于理解和实现。它不需要对数据进行假设,不需要进行模型训练,因此非常适合作为入门算法。
  2. 适用于多分类问题:KNN 可以用于解决分类和回归问题。在分类问题中,KNN 可以处理多分类任务,并且不需要进行特别的修改。
  3. 适用于非线性数据:KNN 不对数据的分布做出假设,因此适用于各种类型的数据,包括非线性数据。
  4. 预测速度快:在训练阶段,KNN 模型只是简单地存储数据,而在预测阶段,它只需计算新样本与已存储样本的距离,因此预测速度较快。
  5. 对异常值不敏感:KNN 的预测结果受异常值的影响较小,因为它是基于邻近样本进行预测的,而不是单个样本。

缺点:

  1. 计算复杂度高:在预测阶段,KNN 需要计算新样本与所有已存储样本的距离,因此计算复杂度较高,尤其是当训练集较大时。
  2. 存储空间大:KNN 需要存储所有的训练样本,因此对内存的需求较高,尤其是当训练集较大时。
  3. 需要确定 K 值:KNN 中的 K 值需要人为设定,选择不合适的 K 值可能会影响模型的性能。
  4. 对数据特征缺失敏感:KNN 是一种基于特征空间距离的算法,当样本特征中存在缺失值时,可能会导致距离计算的不准确性。
  5. 预测结果可能不稳定:当数据集中存在噪声较多或样本分布不均匀时,KNN 的预测结果可能不稳定,容易受到局部样本分布的影响。

综上所述,KNN 算法是一种简单且有效的算法,特别适用于小规模数据集和非线性数据,但在处理大规模数据时,可能会面临计算复杂度高和存储空间大的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值