资讯专栏INFORMATION COLUMN

Python数据分析:KNN算法(k-近邻算法)

Tychio / 486人阅读

摘要:算法是一种数据分类算法,以距离样本个最邻近数据的类别代表样本的类别,因此也叫作近邻算法。排序后访问元素的方式与访问二维数组元素的方式一致

KNN算法是一种数据分类算法,以距离样本k个最邻近数据的类别代表样本的类别,因此也叫作k-近邻算法。KNN算法是数据挖掘中最简单的方法之一,大致可分为以下几个步骤:

训练数据:原数据集中所有数据类别的数据。

测试数据:我们将要拿来测试的数据样本。

处理数据

我们得到的测试数据,通常和训练数据是不同维的,这时候就需要我们将测试数据升维到和训练数据相同,python的numpy中自带了一个tile()函数可以帮助我们将测试数据升维。

将数据向量化

测试数据升维后,我们为了计算距离样本点的距离,此时需要将数据向量化,所谓的向量化就很简单了,即将两个同维数据相减。

计算欧式距离

欧式距离,即欧几里得距离,运用勾股定理即可求出,将升维后的测试数据和训练数据相减获得的向量组的每一个向量的平方和开方即可得到由距离组成的向量组。

根据距离进行分类

选择k个距离样本点距离最小的数据,统计在这k个数据中哪类数据类别出现的频率最高,样本点的数据类别即可确定。

算法实现:

1.首先我们需要引入numpy以及operator,输入from numpy import *import operator

2.接下来我们需要定义一个knn函数,在knn函数中我们需要引入四个参数,分别为k、训练数据、测试数据和数据类别。

3.接下来我们需要先对数据进行升维操作,需要用到numpy下的tile(a,(b,c))函数,a为要进行升维操作的数据,也就是测试数据,b为要对测试数据升维的行数据,c为要对测试数据升维的列数据。

4.在上一操作中,我们一般需要获得训练数据的行数和列数,这时需要用到shape()函数,shape()函数返回的是由训练数据的行和列组成的元组,我们想要知道训练数据的行数或列数只需通过数组元素下标的方式引用。

5.数据的维度相同后,我们要将两数据相减得到一个向量,再计算这个向量每个值的平方和的开方即得测试数据到训练数据的距离,再调用argsort()函数将距离按照升序排列,不过该函数返回的是数组元素的下标。

6.接下来我们为了直观的看到不同数据类别的出现次数,需要设置一个空字典来存放这些数据,在得到字典后,我们需要将字典按照不同数据类别的出现次数降序排列,进而返回字典的第一个值即得到测试数据的数据类别。

7.算法代码如下:

from numpy import *
import operator
def knn(k, test_data, train_data, labels):
    train_size = train_data.shape[0]    #获取训练数据的行数
    test_size = tile(test_data, (train_size, 1))    #将测试数据的行升维
    minus = test_size-train_data    #得到向量
    sq_minus = minus**2
    sum_sq_minus = sq_minus.sum(axis=1)        #得到平方后的每个数组内元素的和
    distc = sum_sq_minus**0.5
    sort_distc = distc.argsort()    #将距离按升序排列
    static = {}
    for i in range(0, k):
        vote = labels[sort_distc[i]]    #获取数据类型
        static[vote] = static.get(vote, 0)+1    #统计每个数据类型的出现次数
    sort_static = sorted(static.items(), key=operator.itemgetter(1), reverse=True)    #将字典中的元素按出现次数降序排列
    return sort_static[0][0]    #返回出现次数最多的数据类型

8.算法中需要对字典进行排序,因此需要用到sorted()函数,sorted()函数共有三个参数,分别为items(),operator.itemgetter(),reverse,默认的排序为升序,我们要想按照降序排列需要令第三个参数为True,在这里我们是按照字典的values进行排序的,因此我们需要输入sorted(static.items(), key=operator.itemgetter(1), reverse=True),operator.itemgetter()函数中的值为1时,是按照字典的values进行排序,值为0时,是按照字典的key进行排序。

9.排序后访问元素的方式与访问二维数组元素的方式一致

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43003.html

相关文章

  • 【机器学习实战 Task1】 (KNNk近邻算法的应用

    摘要:背景近邻算法的概述近邻算法的简介近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。完美的分类器的错误率为,而最差的分类器的错误率则为。 1 背景 1.1 k近邻算法的概述 (1)k近邻算法的简介 k-近邻算法是属于一个非...

    toddmark 评论0 收藏0
  • 以❤️简单易懂❤️的语言带你搞懂有监督学习算法【附Python代码详解】机器学习系列之KNN

    必须要看的前言 本文风格:以❤️简单易懂❤️的语言带你彻底搞懂KNN,了解什么是有监督学习算法。 认真看完这篇文章,彻底了解KNN、了解监督学习算法绝对是一样很简单的事情。 注:本篇文章非常详细,同时我也附加了Python代码,欢迎收藏后慢慢阅读。 目录 必须要看的前言监督学习算法KNN/K近邻算法1 算法原理1.1 实现过程1.2 距离的确定 2 算法的优缺点3 算法的变种3.1 变...

    MoAir 评论0 收藏0
  • 机器学习(六)-基于KNN分类算法的自动划分电影的题材类型实现

    摘要:算法及工作原理近邻算法采用测量不同特征值之间的距离方法进行分类。最后选择个最相似数据中出现次数最多的分类作为新数据的分类。 1 分类算法引言 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。 动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是...

    MkkHou 评论0 收藏0
  • 机器学习分享——KNN算法及numpy实现

    摘要:是一种非参数的懒惰的监督学习算法非参数的意思是,模型不会对基础数据分布做出任何假设。电脑端查看源码参考资料网址是一个支持的人工智能建模平台,能帮助你快速开发训练并部署应用。 KNN 是一种非参数的懒惰的监督学习算法. 非参数的意思是,模型不会对基础数据分布做出任何假设。换句话说,模型的结构是根据数据确定的。懒惰的意思是没有或者只有很少的训练过程. KNN 算法既可以处理分类问题,测试数...

    U2FsdGVkX1x 评论0 收藏0

发表评论

0条评论

Tychio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<