K-NN算法实操及介绍

这篇具有很好参考价值的文章主要介绍了K-NN算法实操及介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.KNN算法介绍

1.1简要介绍

在模式识别领域中,最近邻居法KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法[1],由美国统计学家伊芙琳·费克斯和小约瑟夫·霍奇斯于1951年首次提出,后来由托马斯·寇弗扩展。在这两种情况下,输入包含特征空间中的k个最接近的训练样本。

  • k-NN分类中,输出是一个分类族群。一个对象的分类是由其邻居的“多数表决”确定的,k个最近邻居(k为正整数,通常较小)中最常见的分类决定了赋予该对象的类别。若k = 1,则该对象的类别直接由最近的一个节点赋予。
  • k-NN回归中,输出是该对象的属性值。该值是其k个最近邻居的值的平均值。

最近邻居法采用向量空间模型来分类,概念为相同类别的案例,彼此的相似度高,而可以借由计算与已知类别案例之相似度,来评估未知类别案例可能的分类。

以上部分来自维基百科,大致意思就是根据已有数据的标签进行新数据标签的预测,也就是说,通过一个人身边高收入者的数量判断这个人是不是高收入者,一个人身边的高收入朋友越多,这个人就越有可能是高收入者。通过这个思路,通过了解这个人身边富人朋友的数量是否多到一个阈值k,我们就可以预测其是否为富人。而这个k值,就是该算法的一个重点。

1.2 算法流程介绍

1.2.1数据收集

要进行这个算法的实现,首先需要一定的数据的训练和测试以确定预测正确率最高的k值,所以第一步时进行数据的收集,这一步可以通过上网寻找或者通过其他大佬的博客进行下载,或者通过调取python的sklearn库中的内置数据集进行实现

1.2.2数据处理

这一步需要对已有的数据进行结构化处理,即对单个样本拥有的标签进行格式化规范化,形成表格式的数据集。

再之后,还需要对数据进行归一化或者赋予比重。因为部分样本不同标签下的数据完全不成比例,在这种情况下如果完全不对其进行处理,那么将会出现某个标签在进行判断时判断权重很小甚至完全被忽略的情况。

进行归一化的公式为

K-NN算法实操及介绍,python

即以该值减去该标签下的最小值除以标签下最大值和最小值的差,将数据进行该处理后可保证哥哥标签下的范围为[0,1]。

1.2.3 算法实施

该算法需要计算在n维空间中,预测点与其他已知样本点的距离,然后选取与之最近的k个点,然后在k个点中选取出现频率最高的属性,并将之作为预测结果。

此处的距离可采用欧几里得距离,公式为

K-NN算法实操及介绍,python

其中n值为标签数量,i表示第i个标签,x和y分别为预测点和已知样本点。

二. 实操

2.1数据准备

本次使用的数据为橙子苹果梨的判断,每个样本点有两个标签,分别为直径和高度,范围设置如下表格(范围为帖主本人瞎编,数据集全部为随机数生成,如有雷同纯属巧合)。

K-NN算法实操及介绍,python

数据文本示例如下图

K-NN算法实操及介绍,python

此为一部分内容,本次实践设置了200个数据样本作为训练集。

2.2 数据导入

首先导入保存于.txt中的数据,对每行的数据进行分割,并将前两项数据加入至data_set中,标签存入lables中。

def createDataSet(filename):
    data_set = []  # 保存数据
    data_labels = []  # 保存标签
    with open(filename, 'r', encoding='utf-8') as file:
        for line in file:
            d, h, name = line.strip().split(',')
            data_set.append([int(d), int(h)])
            data_labels.append(name)
    return np.array(data_set), data_labels

2.3 数据归一化

在这段函数中通过numpy库的内置函数找到训练集中的最大最小值并依照上面给出的公式进行处理,最后返回处理过的数据。

def normalize(dataset, mydata):
    mindata = np.min(dataset, axis=0)  # axis=0按行进行比较
    maxdata = np.max(dataset, axis=0)
    my_data = (mydata - mindata) / (maxdata - mindata)
    data_set = (dataset - mindata) / (maxdata - mindata)
    return data_set, my_data

2.4 knn算法主体部分

在这段函数中,通过.shape[0]获取data_set的行数,再通过numpy库中的tile函数,根据mydata生成一个与data_set行数相同的矩阵并与data_set进行计算,获取平方后再使用.sum方法,获取平方后的各个值的和,再依据和的大小按从小到大的顺序进行排列。

完成排列后的列表中,依次选取k个值并获取其数目最大的标签并且返回。

def knn(data_set, data_labels, k, mydata):
    data_size = data_set.shape[0]
    temp_distance = (np.tile(mydata, (data_size, 1)) - data_set) ** 2
    distances = temp_distance.sum(axis=1) ** 0.5
    sorted_distances_indices = distances.argsort()
    data_dict = {}
    for i in range(k):
        data_label = data_labels[sorted_distances_indices[i]]
        data_dict[data_label] = data_dict.get(data_label, 0) + 1
    sort_dict = sorted(data_dict.items(), key=operator.itemgetter(1), reverse=True)
    return sort_dict[0][0]

2.5 测试集的验证及k值的选取

knn算法的一个重点就是k值的选取,这个值的选取应该通过验证来选取,因此,在这次实操中加载了一个含有100组数据的测试集,依次测试k的值不同时得到的正确率有多高,最后打印折线图并且返回最佳的k

def find_k():
    # 获取数据集以及标签
    data_set, data_labels = createDataSet("fruit_data.txt")
    test_set, test_labels = createDataSet("fruit_2.txt")

    # 初始化准确率列表
    accuracy_list = []

    # 遍历 k 值从 1 到 30
    for k in range(1, 31):
        correct_count = 0
        # 遍历测试集
        for i in range(len(test_set)):
            # 进行归一化
            set_data, test_data = normalize(data_set, test_set[i])
            # 使用 KNN 算法进行预测
            predicted_label = knn(set_data, data_labels, k, test_data)
            # 比较预测结果与实际标签
            if predicted_label == test_labels[i]:
                correct_count += 1
        # 计算准确率
        accuracy = correct_count / len(test_set)
        accuracy_list.append(accuracy)

    # 绘制准确率随 k 值变化的折线图
    plt.plot(range(1, 31), accuracy_list, marker='o', linestyle='-', color='blue', label='Accuracy')
    plt.xlabel('k')
    plt.ylabel("accuracy")
    plt.title("result")
    plt.legend()
    plt.grid(True)
    plt.show()

    # 找出最优的 k 值
    max_accuracy = max(accuracy_list)
    optimal_k = accuracy_list.index(max_accuracy) + 1
    print(f"Best value of k: {optimal_k} with an accuracy of {max_accuracy:.2f}")
    return optimal_k

最后得到的折线图和结果如下

K-NN算法实操及介绍,python

K-NN算法实操及介绍,python

2.6主函数

依据find_k函数找到k值,再根据读入的数据进行判断即可

def main():
    # 获取数据集以及标签
    data_set, data_labels = createDataSet("fruit_data.txt")
    my_test = [int(input("请输入待分类水果的直径:\n")), int(input("请输入待分类水果的高:\n"))]
    # 进行归一化
    k = find_k()
    set_data, test_data = normalize(data_set, my_test)
    print('输入的数据所对应的水果类别是:{}'.format(knn(set_data, data_labels, k, test_data)))

结果图如下

K-NN算法实操及介绍,python

三.总结

本次实践对knn算法有了一定的理解

首先其核心内容易理解,思想较为简单,但由于每次运算都需要跑完全部的数据集,因而计算量较大,较为花费时间。而当k值选取有误时容易出现过拟合现象。

作为本学期的第一个实验,完整顺下来之后对于python的函数等内容有了一定的了解,但在编码能力上还有欠缺,多多学习吧文章来源地址https://www.toymoban.com/news/detail-844907.html

到了这里,关于K-NN算法实操及介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 神经网络(NN)网络构建及模型算法介绍

    神经网络最主要的作用是作为提取特征的工具,最终的分类并不是作为主要核心。 人工神经网络也称为多层感知机,相当于将输入数据通过前面多个全连接层网络将原输入特征进行了一个非线性变换,将变换后的特征拿到最后一层的分类器去分类。 神经网络是由多个神经元

    2024年02月04日
    浏览(66)
  • python实操之网络爬虫介绍

    网络爬虫,也可以叫做网络数据采集更容易理解。它是指通过编程向网络服务器(web)请求数据(HTML表单),然后解析HTML,提取出自己想要的数据。 它包括了根据url获取HTML数据、解析HTML,获取目标信息、存储数据几个步骤;过程中可能会涉及到数据库、网络服务器、HTTP协

    2024年01月21日
    浏览(24)
  • pytorch容器之nn.Sequential, nn.ModuleList, nn.ModuleDict介绍

      在深度学习模型创建的时候,我们经常会碰到 nn.Sequential , nn.ModuleList , nn.ModuleDict 这三个东西,尤其是在迁移学习训练的时候经常碰到,他们到底是什么,怎么用的,使用的时候有哪些注意事项,通过这篇博文浅记一下。   在介绍这三个容器之前,我们需要先知道什么

    2024年02月08日
    浏览(31)
  • 【PyTorch API】 nn.RNN 和 nn.LSTM 介绍和代码详解

    torch.nn.RNN 的 PyTorch 链接:torch.nn.RNN(*args, **kwargs) nn.RNN 的用法和输入输出参数的介绍直接看代码: 需要特别注意的是 nn.RNN 的第二个输出 hn 表示所有掩藏层的在最后一个 time step 隐状态,听起来很难理解,看下面的红色方框内的数据就懂了。即 output[:, -1, :] = hn[-1, : , :] 这里

    2024年02月12日
    浏览(27)
  • torch.nn.BCEWithLogitsLoss用法介绍

    self.bce = nn.BCEWithLogitsLoss(reduction=\\\'none\\\') , None的使用方法可以见官网pytorch代码文档 代码举例 举例的代码中target中的计算方法是这样的( resuction=\\\'none\\\' ) 对于target[0][0][0]=1=y n , a[0][0][0]=0.2070=x n , 因此,对于l n 0.5950 = − ( 1 × ln ⁡ σ ( 0.2070 ) + 0 × ln ⁡ ( 1 − σ ( 0.2070 ) ) ) 0.5950 = -l

    2024年01月18日
    浏览(30)
  • 深度学习之pytorch 中 torch.nn介绍

    pytorch 中必用的包就是 torch.nn,torch.nn 中按照功能分,主要如下有几类: 1. Layers(层):包括全连接层、卷积层、池化层等。 2. Activation Functions(激活函数):包括ReLU、Sigmoid、Tanh等。 3. Loss Functions(损失函数):包括交叉熵损失、均方误差等。 4. Optimizers(优化器):包括

    2024年02月22日
    浏览(35)
  • 【torch.nn.Sequential】序列容器的介绍和使用

    nn.Sequential是一个有序的容器,该类将按照传入构造器的顺序,依次创建相应的函数,并记录在Sequential类对象的数据结构中,同时以神经网络模块为元素的有序字典也可以作为传入参数。 因此,Sequential可以看成是有多个函数运算对象,串联成的神经网络,其返回的是Module类型

    2024年02月04日
    浏览(34)
  • pytorch中nn.Conv1d功能介绍

            在使用Conv1d函数时,pytorch默认你的数据是一维的,比如一句话“深度学习”可以用一个一维数组 [\\\'深\\\', \\\'度\\\', \\\'学\\\', \\\'习\\\'] 表示,这个数据就是一维的。图片是二维数据,它有长宽两个维度。         因此在使用 Conv1d 函数时,输入是一个三位数组,三个维度分别表

    2024年02月10日
    浏览(30)
  • OpenFeign的简单介绍和功能实操

    本文主要做一下OpenFeign的简单介绍和功能实操,实操主要是OpenFeign的超时和重试,在阅读本文章前,请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 OpenFeign全名Spring Cloud OpenFeign,是SpringCloud开发团队基于Feign开发的框架,声明式Web服务客户端 Feign是一种声

    2024年02月06日
    浏览(25)
  • Pytorch学习笔记(5):torch.nn---网络层介绍(卷积层、池化层、线性层、激活函数层)

     一、卷积层—Convolution Layers  1.1 1d / 2d / 3d卷积 1.2 卷积—nn.Conv2d() nn.Conv2d 1.3 转置卷积—nn.ConvTranspose nn.ConvTranspose2d  二、池化层—Pooling Layer (1)nn.MaxPool2d (2)nn.AvgPool2d (3)nn.MaxUnpool2d  三、线性层—Linear Layer  nn.Linear  四、激活函数层—Activate Layer (1)nn.Sigmoid  (

    2024年01月20日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包