首页 > 编程语言 > 详细

k-近邻算法

时间:2015-12-30 21:54:37      阅读:291      评论:0      收藏:0      [点我收藏+]

k-近邻算法

1,算法优缺点

优点:精度高,对异常值不敏感,无数据输入假定。

缺点:计算复杂度高,空间复杂度高。

适用数据范围:数值型,标称型。

 

2,k-近邻算法的一般流程

算法:

def classify0(inX,dataSet,labels,k):
   dataSetSize = dataSet.shape[0] #样本维度
   diffMat = tile(inX,(dataSetSize,1))-dataSet     #创建一个(dataSetSize维度)
   sqDiffMat = diffMat**2
   sqDistances = sqDiffMat .sum(axis=1)
   distances = sqDistances**0.5
   sortedDistIndicies = distances.argsort()   #返回distances 从小到大的index
   classCount = {} #分类
   for i in range(k):
       voteIlabel =labels[sortedDistIndicies[i]]  #取出排K的分类
       classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1  #error  dict[obj]    ‘int‘ object has no attribute ‘get‘
   sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse =True) #从大到小概率高的排序
   # classCount.iteritems()  #返回迭代器方法同items()
   #items()方法是将字典中的每个项分别做为元组,添加到一个列表中,形成了一个新的列表容器。如果有需要也可以将返回的结果赋值给新变量,这个新的变量就会是一个列表数据类型。
   print sortedClassCount   #[(‘B‘, 2), (‘A‘, 1)]
   return sortedClassCount[0][0]
   ‘‘‘
    a = [1,2,3] 
    >>> b=operator.itemgetter(1)      //定义函数b,获取对象的第1个域的值
    >>> b(a) 
    2 
    >>> b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值
    >>> b(a) 
    (2, 1)
    要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
    sorted函数
    Python内置的排序函数sorted可以对list或者iterator进行排序,官网文档见:http://docs.python.org/2/library/functions.html?highlight=sorted#sorted,该函数原型为:
    sorted(iterable[, cmp[, key[, reverse]]])
    
    参数解释:
    (1)iterable指定要排序的list或者iterable,不用多说;
    (2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:
          students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这样写:
          students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10)]
          sorted(students, key=lambda student : student[2])
    (3)key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下:
          sorted(students, key=lambda student : student[2])
          key指定的lambda函数功能是去元素student的第三个域(即:student[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。
    有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写:
    sorted(students, key=operator.itemgetter(2)) 
    sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写:
    sorted(students, key=operator.itemgetter(1,2))
    即先跟句第二个域排序,再根据第三个域排序。
    (4)reverse参数就不用多说了,是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列。
   ‘‘‘

 

 

1,收集数据:可以使用任何方法。

 

2,准备数据:距离计算所需的数值,最好是结构化的数据格式。

def creatDataSet():
     group = array([1.0,1.1],[1.0,1.0],[0,0],[0,0.1])
     labels = [A,A,B,B]
     return group,labels

3,分析数据:可以使用任何方法。

4,训练算法:此步骤不适用k-近邻算法。

5,测试算法:测试错误率。

6,使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续处理。

 

k-近邻算法

原文:http://www.cnblogs.com/Zidon/p/5089972.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!