Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 237|回复: 0

[默认分类] 机器学习:KNN-近邻算法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-4-27 14:16:01 | 显示全部楼层 |阅读模式
    一、理论知识
    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. 1 from sklearn import neighbors
    2. 2 from sklearn import datasets
    3. 3
    4. 4 knn = neighbors.KNeighborsClassifier()
    5. 5 iris = datasets.load_iris()
    6. 6
    7. 7 knn.fit(iris.data, iris.target)                          # 建立KNN模型,输入特征值和分类结果
    8. 8 predictedLabel = knn.predict([[6.3, 1.2, 5.2, 1.6]])
    9. 9
    10. 10 print("predictedLabel is :"+ str(predictedLabel))
    复制代码



    1. predictedLabel is :[1]
    复制代码


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

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


      
    三、参考资料
      《机器学习》—— 周志华
      《机器学习实战》—— Peter Harrington
      
    ps:本人初学者,有错误欢迎指出。感谢。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-25 08:17 , Processed in 0.449212 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表