机器学习[k近邻算法]

k近邻算法简称kNN算法,由Thomas等人在1967年提出[1]。它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票,票数最多的那个类就是分类结果。因为直接比较样本和训练样本的距离,kNN算法也被称为基于实例的算法。最近邻算法是k近邻算法k=1时的一种特殊情况。

基本概念

确定一个样本所属类别的一种最简单的方法是直接比较它和所有训练样本的相似度,然后将其归类的最相似的样本所属的那个类,这是一种模板匹配的思想。下图6.1是使用k近邻思想进行分类的一个例子:

k近邻分类示意图

 在上图中有红色和绿色两类样本。对于待分类样本即图中的黑色点,我们寻找离该样本最近的一部分训练样本,在图中是以这个矩形样本为圆心的某一圆范围内的所有样本。然后统计这些样本所属的类别,在这里红色点有12个,圆形有2个,因此把这个样本判定为红色这一类。上面的例子是二分类的情况,我们可以推广到多类,k近邻算法天然支持多类分类问题。

预测算法

k近邻算法没有求解模型参数的训练过程,参数k由人工指定,它在预测时才会计算待预测样本与训练样本的距离。

对于分类问题,给定l个训练样本(xi,yi ),其中xi为维特征向量,yi为标签值,设定参数k,假设类型数为c,待分类样本的特征向量为x。预测算法的流程为:

1.在训练样本集中找出离x最近的个样本k,假设这些样本的集合为N

2.统计集合N中每一类样本的个数Ci, i=1,...,c

3.最终的分类结果为argmaxiCi

在这里argmaxiCi表示最大的值Ci对应的那个类i。如果看k=1,k近邻算法退化成最近邻算法。

k近邻算法实现简单,缺点是当训练样本数大、特征向量维数很高时计算复杂度高。因为每次预测时要计算待预测样本和每一个训练样本的距离,而且要对距离进行排序找到最近的k个样本。我们可以使用高效的部分排序算法,只找出最小的k个数;另外一种加速手段是k-d树实现快速的近邻样本查找。

一个需要解决的问题是参数k的取值。这需要根据问题和数据的特点来确定。在实现时可以考虑样本的权重,即每个样本有不同的投票权重,这称方法称为为带权重的k近邻算法。另外还其他改进措施,如模糊k近邻算法[2]。

距离定义

根据前面的介绍,kNN算法的实现依赖于样本之间的距离值,因此需要定义距离的计算方式。接下来介绍常见的几种距离定义,它们适用于不同特点的数据。

距离函数必须满足以下条件:

1.三角不等式;

2.非负性,即距离不能是一个负数;

3.对称性,即A到B的距离和B到A的距离必须相等;

4.区分性,如果两点的距离为零,则两点必须相同;

满足上面4个条件的函数都可以用作距离定义。

常用的距离定义

欧式距离、Mahalanobis距离、Bhattacharyya距离。

使用欧式距离时应该尽量将特征向量的每个分量归一化,以减少因为特征值的尺度范围不同所带来的干扰。否则数值小的特征分量会被大的特征分量淹没。欧式距离只是将特征向量看做空间中的点,并没有考虑这些样本特征向量的概率分布规律。

Mahalanobis距离是一种概率意义上的距离,给定两个向量x和y以及矩阵S,它定义为:

要保证根号内的值非负,即矩阵S必须是半正定的。这种距离度量的是两个随机向量的相似度。当矩阵S为阶单位矩阵I时,Mahalanobis距离退化为欧氏距离。矩阵可以通过计算训练样本集的协方差矩阵得到,也可以通过训练样本学习得到,优化某一目标函数。

对于矩阵如何确定的问题有不少的研究,代表性的有文献[9-12],其中文献[9]提出的方法具有很强的指导意义和应用价值。文献[9]指出,kNN算法的精度在很大程度上依赖于所使用的距离度量标准,为此他们提出了一种从带标签的样本集中学习得到距离度量矩阵的方法,称为距离度量学习(Distance Metric Learning),我们将在下一节中介绍。

Bhattacharyya距离定义了两个离散型或连续型概率分布的相似性。对于离散型随机变量的分布,它的定义为:

其中xi,yi为两个随机变量取某一值的概率,它们是向量x和y的分量,它们的值必须非负。两个向量越相似,这个距离值越小。

距离度量学习

Mahalanobis距离中的矩阵S可以通过对样本的学习得到,这称为距离度量学习。距离度量学习通过样本集学习到一种线性变换,目前有多种实现。下面我们介绍文献[9]的方法,它使得变换后每个样本的k个最近邻居都和它是同一个类,而不同类型的样本通过一个大的间隔被分开,这和第8章将要介绍的线性判别分析的思想类似。如果原始的样本点为x,变换之后的点为y,在这里要寻找的是如下线性变换:

y=Lx

其中L为线性变换矩阵。首先定义目标邻居的概念。一个样本的目标邻居是和该样本同类型的样本。我们希望通过学习得到的线性变换让样本最接近的邻居就是它的目标邻居:

j~i

表示训练样本xj是样本xi的目标邻居。这个概念不是对称的,xj是xi的目标邻居不等于xi是xj的目标邻居。

为了保证kNN算法能准确的分类,任意一个样本的目标邻居样本要比其他类别的样本更接近于该样本。对每个样本,我们可以将目标邻居想象成为这个样本建立起了一个边界,使得和本样本标签值不同的样本无法入侵进来。训练样本集中,侵入这个边界并且和该样本不同标签值的样本称为冒充者(impostors),这里的目标是最小化冒充者的数量。

为了增强kNN分类的泛化性能,要让冒充者离由目标邻居估计出的边界的距离尽可能的远。通过在kNN决策边界周围加上一个大的安全间隔(margin),可以有效的提高算法的鲁棒性。

应用

kNN算法简单但却有效,如果能够定义合适的距离度量,它可以取得很好的性能。kNN算法被成功的用于文本分类[5-7],图像分类[8-11]等模式识别问题。应用kNN算法的关键是构造出合适的特征向量以及确定合适的距离函数

参 考 文 献

[1] Thomas M Cover, Peter E Hart. Nearest neighbor pattern classification. IEEE Transactions on Information Theory, 1967.

[2] James M Keller, Michael R Gray, James Givens. A fuzzy K-nearest neighbor algorithm. systems man and cybernetics, 1985.

[3] Thierry Denoeux. A k-nearest neighbor classification rule based on Dempster-Shafer theory. systems man and cybernetics, 1995

[4] Trevor Hastie, Rolbert Tibshirani. Discriminant adaptive nearest neighbor classification. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1996.

[5] Bruno Trstenjak, Sasa Mikac, Dzenana Donko. KNN with TF-IDF based Framework for Text Categorization. Procedia Engineering, 2014.

[6] J He, Ahhwee Tan, Chew Lim Tan. A Comparative Study on Chinese Text Categorization Methods. pacific rim international conference on artificial intelligence, 2000.

[7] Shengyi Jiang, Guansong Pang, Meiling Wu, Limin Kuang. An improved K-nearest-neighbor algorithm for text categorization. 2012, Expert Systems With Application.

[8] Oren Boiman, Eli Shechtman, Michal Irani. In defense of Nearest-Neighbor based image classification. 2008, computer vision and pattern recognition.

[9] Kilian Q Weinberger, Lawrence K Saul. Distance Metric Learning for Large Margin Nearest Neighbor Classification. 2009, Journal of Machine Learning Research.

[10] S. Belongie, J. Malik, J. Puzicha. Shape matching and obejct recognition using shape contexts. IEEE Transactions on Pattern Analysis and Machine Intelligence, 24(4):509-522, 2002.

[11] P. Y. Simard, Y. LeCun, I. Decker. Efficient pattern recognition using a new transformation distance. In S. Hanson, J. Cowan, and L. Giles, editors, Advances in Neural Information Processing Systems 6, pages 50-58, San Mateo, CA, 1993. Morgan Kaufman.

[12] S. Chopra, R. Hadsell, Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR 2005), pages 349-356, San Diego, CA, 2005.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KNN (K-Nearest Neighbors) 是一种常见的机器学习算法,它可以用于推荐系统中的图书推荐。下面是使用 KNN 进行图书推荐的一般步骤: 1. 收集数据集:收集一组图书数据集,包括每本书的属性和评分。 2. 处理数据集:将数据集划分为训练集和测试集。 3. 训练模型:使用训练集训练 KNN 模型。 4. 测试模型:使用测试集测试模型,并计算模型的准确度。 5. 预测推荐:使用模型预测每个用户可能喜欢的图书,并将推荐结果返回给用户。 下面是 Python 代码示例: ```python from sklearn.neighbors import NearestNeighbors # 收集数据集 books = [[1, 1, 1, 0, 0], [1, 0, 1, 0, 0], [0, 1, 0, 1, 1], [0, 0, 1, 1, 0], [0, 0, 1, 0, 1]] ratings = [5, 4, 3, 2, 1] # 处理数据集 X_train = books[:3] y_train = ratings[:3] X_test = books[3:] y_test = ratings[3:] # 训练模型 knn = NearestNeighbors(n_neighbors=2) knn.fit(X_train, y_train) # 测试模型 accuracy = knn.score(X_test, y_test) print(f"模型准确度为:{accuracy}") # 预测推荐 user = [0, 1, 0, 1, 1] distances, indices = knn.kneighbors([user]) recommended_books = [books[i] for i in indices[0]] print(f"推荐的图书为:{recommended_books}") ``` 在上面的示例中,我们使用了一个包含 5 本图书和评分的数据集。我们使用前 3 本图书作为训练集,最后 2 本图书作为测试集。我们使用 NearestNeighbors 类来实现 KNN 模型。在测试模型时,我们计算了模型的准确度。最后,我们使用模型预测了一个用户可能喜欢的图书,并将推荐结果返回给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值