热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习:KNN-近邻算法

一、理论知识1、K近邻(k-NearestNeighbor,简称KNN)学习是一种常用的监督学习。工作机制:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后

一、理论知识

1、K近邻(k-Nearest Neighbor,简称KNN)学习是一种常用的监督学习

     工作机制:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个的信息来进行预测。且通常使用“投票法”。

 

2、以电影类型举例,现在已知部分电影的属性和分类,想要预测未知电影的分类。

      

  我们可以计算未知电影和其它电影的属性距离,这里直接采用几何距离(Euclidean Distance),即把每个属性化为不同维度的坐标,再利用距离公式

             

  计算结束后,递增排序,可以找到k个最近的样本。因为要采用“投票法”,即满足少数服从多数原则,所以K的取值一般为奇数。这里假设k=3,则最靠近的3个都为爱情电影,所以判断未知电影为爱情电影。

       

 

3、KNN算法伪码描述:

  (1) 计算已知类别数据集中的点与当前点之间的距离;

  (2) 按照距离递增次序排序;

  (3) 选取与当前点距离最小的k个点;

  (4) 确定前k个点所在类别的出现频率;

  (5) 返回前k个点出现频率最高的类别作为当前点的预测分类

 

4、优点:简单易于理解;通过对K的选择可具备丢噪音数据的健壮性

   缺点:(1)需要大量空间储存所有已知实例

      (2)算法执行效率低(需要比较所有已知实例与要分类的实例

           (3)当其样本分布不平衡时,比如其中一类样本过大(实例数量过多)占主导的时候,新的未知实例容易被归类为这个主导样本,因为这类样本实例的数量过大,但这个新的未知实例并未接近目标样本。

     

    缺点(3)的意思是,如图中的Y点,黑圈代表其k的取值,即黑圈内的点都是要进行投票的数据点。通过观察会发现Y显然与红点更近,然而因为紫色点在这个圈里数目更多,Y点就会被认为是紫色。对于这个缺点,通常我们用权重的方法改善,根据距离d改变权重,例如1/d,这样就能让离目标点近的数据点的权重更大一点,优化算法。

  

 

二、代码实现

  调用sklearn库中KNN算法分析著名的iris数据

 1 from sklearn import neighbors
 2 from sklearn import datasets
 3 
 4 knn = neighbors.KNeighborsClassifier()
 5 iris = datasets.load_iris()
 6 
 7 knn.fit(iris.data, iris.target)                          # 建立KNN模型,输入特征值和分类结果
 8 predictedLabel = knn.predict([[6.3, 1.2, 5.2, 1.6]])
 9 
10 print("predictedLabel is :"+ str(predictedLabel))
predictedLabel is :[1]

  有现成的库调用起来很方便,当然也可以自己写对应的算法,下面是KNN的算法。

 1 def classify0(inX, dataSet, labels, k):                  # KNN算法
 2     dataSetSize = dataSet.shape[0]
 3     diffMat = tile(inX, (dataSetSize,1)) - dataSet       #计算两个点的空间距离
 4     sqDiffMat = diffMat**2
 5     sqDistances = sqDiffMat.sum(axis=1)
 6     distances = sqDistances**0.5
 7     sortedDistIndicies = distances.argsort()
 8     classCount={}
 9     for i in range(k):                                   #选择距离最小的k个点
10         voteIlabel = labels[sortedDistIndicies[i]]
11         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
12     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 按照第二个元素进行从小到大排序,最后返回发生频率最高的标签
13     return sortedClassCount[0][0]

 

三、参考资料

  《机器学习》—— 周志华

  《机器学习实战》—— Peter Harrington

 

ps:本人初学者,有错误欢迎指出。感谢。


推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 非线性门控感知器算法的实现与应用分析 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 机器学习中的标准化缩放、最小-最大缩放及鲁棒缩放技术解析 ... [详细]
author-avatar
mobiledu2502862777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有