zoukankan      html  css  js  c++  java
  • 机器学习算法(KNN)

    KNN简介

    KNN(k-NearestNeighbor)算法的思想总结一下:就是在数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

    1.计算测试数据与各个训练数据之间的距离,选用欧式距离,计算每个点到数据集(训练集)的所有距离,

    distance=((x1-x2)**2+(y1-y2)**2)**0.5

    2.按照距离的递增关系进行排序,使用argsort(distances.argsort())函数,返回数据集从小到大排列的数据下表,
    3.选取距离最小的K个点,与输入k值有关,使用for函数遍历k
    4.确定前K个点所在类别的出现频率,class_count[label]=class_count.get(label,0)+1

    5.返回前K个点中出现频率最高的类别作为测试数据的预测分类,sorted_class=sorted(class_count.items(),key=operator.itemgetter(1),reverse=True),sorted_class[0][0]。

    代码如下:我们把收入工资和年龄作为数据集,进行判别某个年龄和对应收入,有没有资格谈恋爱!

     1 #!/usr/bin/python
     2 # -*- coding:<utf-8> -
     3 
     4 import numpy as np
     5 import operator
     6 
     7 def createDateset():
     8     group=np.array([[5000,25],[2200,32],[7000,32],[26000,29],[20000,35]])
     9     labels=('没有资格谈恋爱','有资格谈恋爱','没有资格谈恋爱','有资格谈恋爱','有资格谈恋爱')
    10     return group,labels
    11 
    12 def classfy(input,dataSet,labels,k):
    13 
    14     datasize=dataSet.shape[0] #计算数组集的行数,numpy中shape[0]返回数组的行数,shape[1]返回列数
    15     diffdata=np.tile(input,(datasize,1))-dataSet#np.tile(input,(datasize,1)),对测试数据进行横向复制,使其拥有与其数据集一样的维度
    16     squrdata=diffdata**2#计算相减后的平方,欧式距离,distance=((x1-x2)**2+(y1-y2)**2)**0.5
    17     sum_squr_data=squrdata.sum(axis=1)
    18     distances=sum_squr_data**0#.欧式距离:distance=((x1-x2)**2+(y1-y2)**2)**0.5
    19     print('测试的数据距离数据集的距离分别是:',distances)
    20 
    21     sorted_distance=distances.argsort()
    22     print('距离从小到大的下标为:',sorted_distance)
    23 
    24     class_count={}
    25     for i in range (k):
    26         label=labels[sorted_distance[i]]
    27         class_count[label]=class_count.get(label,0)+1#a[b]=a.get(b,0)+1,对字典a赋值,当在字典a中找到
    28         #key为b的键值的时候,取1,找不到的时候取0并加1,即等号坐标为key,右边为value
    29         print('class_count:',class_count)
    30     sorted_class=sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)##key=operator.itemgetter(1)根据字典的值进行排序
    31     #key=operator.itemgetter(0)根据字典的键进行排序
    32     print('sorted_class:',sorted_class)
    33     return sorted_class[0][0]
    34 
    35 if __name__ == '__main__':
    36     group,labels=createDateset()
    37     test=(6000,36)
    38     test_class=classfy(test,group,labels,5)
    39     print(test_class)
    #运行结果如下:
    测试的数据距离数据集的距离分别是: [1 1 1 1 1] 距离从小到大的下标为: [0 1 2 3 4] class_count: {'没有资格谈恋爱': 1} class_count: {'没有资格谈恋爱': 1, '有资格谈恋爱': 1} class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 1} class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 2} class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 3} sorted_class: [('有资格谈恋爱', 3), ('没有资格谈恋爱', 2)] 有资格谈恋爱 Process finished with exit code 0

    KNN算法的优点:

    1.KNN理论简单,容易实现,简单,有效。

    2、KNN是一种在线技术,新数据可以直接加入数据集而不必进行重新训练

    KNN算法缺点:

    1.KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。

    2.对于样本容量大的数据集计算量比较大。

    3.样本不平衡时,预测偏差比较大。如:某一类的样本比较少,而其它类样本比较多。

    4.KNN每一次分类都会重新进行一次全局运算。

    5.k值大小的选择。



  • 相关阅读:
    (OK)(OK) running two Android-x86 in VirtualBox, they connect to NS3(MANETs) via "ethernet bridge"
    (OK) running two Android-x86 in VirtualBox, they connect to "ethernet bridge"
    (OK) virtualbox — VBoxManage internalcommands — with UUID already exists
    (OK) netcat transfer file to android from fedora23
    Setting VirtualBox to use it's built-in VNC server (ver. >= 4.2 I think)
    (OK) Android 6.0 (Marshmallow) Install apk
    netcat——Useful netcat examples on Linux
    Android下pm 命令详解
    (OK) Ubuntu 15.10: KVM vs. Xen vs. VirtualBox Virtualization Performance
    Virtualization solutions on Linux systems
  • 原文地址:https://www.cnblogs.com/ConnorShip/p/9867744.html
Copyright © 2011-2022 走看看