【数据挖掘算法系列(一)】k-近邻(KNN)算法

本文介绍了k-近邻(KNN)算法,通过一个投票的例子阐述了KNN的基本思想和距离计算原理。文章还探讨了KNN的数学理论,包括欧几里得距离,并通过代码实现了一个简单的KNN案例。文章强调理解算法背后的理论对灵活运用机器学习框架的重要性。

开言

从本篇起,将开始我们的机器学习算法系列文章。

机器学习算法的作用不言而喻,是数据挖掘的核心部分也是比较难的一部分。但是别担心,跟着文章一步步来。

现在网上有很多现有的机器学习框架,例如scikit-learn,很方便,直接调用就可以。那我们为什么还要费时间学习这些算法的原理呢? 因为如果不懂得这些算法背后的理论,逻辑,可以很肯定的说你将无法灵活运用这些框架。

本系列文章力争将这些算法原理,重点,应用描述得简单易懂,深入浅出。那就让我们开始吧。

k-近邻(KNN)

从最简单的 K 最近邻(kNN,k-NearestNeighbor)开始。为什么说它最简单呢。因为,不需要高深的数学知识,而且直观易懂。

下面我们通过一个场景代入来了解 KNN 的原理。 相信我们都投过票,最后我们选出的结果是不是票数最高的那个。 投票的结果决策依据便是多数表决法,这也是 KNN 的底层思想。

现在有5个日本男生和5个韩国男生,然后第十一个男生的国籍是未知的,我们叫他为 Tony ,需要你来判断他是来自韩国还是日本的。经过我们对头发,身份,五官等特征的比对,发现跟 Tony 比较像的5个人里,有4个是韩国人,1个是日本人,那我们是不是可以说,Tony是韩国人的概率大一点,从而初步判定他是韩国人。

前面我们判断 Tony 是哪国人用的方法,其实就是我们今天要讲 KNN 算法。 KNN 的原理就是通过当前对象跟已知类别对象对比,选取最像的前 k 个对像,看看这 k 个对象中哪个类别最多,就认为这个对象就是 这个类别,从而得出这个未知对象的类别。是不是很简单?

那么怎么判断像不像呢?根据对象之间的距离大小来判断。

数学理论

前面我们已经了解了 KNN 算法的基本思想,下面我们来通过数学理论来解决 ‘多像’ 的问题,也就是如何计算对象之间的距离。

计算对象之间的距离,有很多公式,比如欧拉距离,这是最简单的,是我们初中学的。除此之外还有曼哈顿距离,闵可夫斯基距离等,本文只用欧拉距离。

上图是欧拉距离公式。 在二维坐标系中的a,b 两个点的x 坐标之

头歌平台上关于数据挖掘算法中 k - 近邻算法的相关内容丰富,涵盖原理、流程、函数使用和实战练习等方面。 算法原理是依据离样本最近的几个样本的类型来确定该样本的类型,简单流程包含计算每个样本的距离、找出最近 K 个样本、加权得到新的类别。其详细算法流程为:先初始化预测结果,设置循环遍历测试集每个样本,计算测试集中单个样本与训练集中每个样本的距离,求得距离最近 k 个样本的索引并拿到其对应的标签,最后初始化字典统计投票情况 [^1]。 numpy 函数 np.argsort() 在 k - 近邻算法中有重要应用。头歌实战练习方面,有返回 K 个最近的标签练习,代码如下: ```python import numpy as np def topK(i,k,x,y): ''' input: i(int):第i个样本 k(int):最近邻样本个数 x(ndarray):数据特征 y(ndarray):数据标签 output: topK(list):样本i的最近k个样本标签 ''' #*********Begin*********# #计算样本到所有样本的距离 dis = [np.sqrt(np.sum((x[i]-p)** 2)) for p in x] #除样本本身外的最近的k个样本的索引 idx = np.argsort(dis)[:k+1] idx = idx[idx != i] #除样本本身外的最近的k个样本的标签 ## 要将数组转换成列表 topK = y[idx].tolist() #*********End*********# return topK ``` 还有动手实现 KNN 的练习,以及使用 sklearn 中的 kNN 算法进行分类和回归的内容。如编写对数据进行分类的程序,代码如下: ```python from sklearn.neighbors import KNeighborsClassifier def classification(train_feature, train_label, test_feature): ''' 使用KNeighborsClassifier对test_feature进行分类 :param train_feature: 训练集数据 :param train_label: 训练集标签 :param test_feature: 测试集数据 :return: 测试集预测结果 ''' #********* Begin *********# clf = KNeighborsClassifier() clf.fit(train_feature, train_label) return clf.predict(test_feature) #********* End *********# ``` 此外,还涉及机器学习应用,如加载手写数据集、获取数据特征和标签、划分数据集 8:2 并进行 KNN 分类 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值