zoukankan      html  css  js  c++  java
  • 分类算法——k最近邻算法(Python实现)(文末附工程源代码)

    kNN算法原理

    k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本中大多数属于某一个类别,则该样本也属于这个类别。

    kNN算法的步骤

    第一阶段:确定k值(指最近的邻居的个数),一般是一个奇数

    第二阶段:确定距离度量公式。文本分类一般使用夹角余弦,得出待分类数据点和所有已知类别的样本点,从中选择距离最近的k个样本:

    第三阶段:统计这k个样本点钟各个类别的数量

    kNN算法的Python实现

    第一阶段:可以利用NBayes中的初始化Nbayes_lib.py,点击这里查看

    第二阶段:实现夹角余弦的距离公式

    from numpy import *
    import operator
    from Nbayes_pre import *

    k=3
    #夹角余弦距离公式
    def cosdist(vector1,vector2):
        return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))

    第三阶段:kNN实现分类器

    #kNN分类器
    #测试集 testdata,训练集 trainSet,类别标签 listClasses,k k个邻居数
    def classify(testdata,trainSet,listClasses,k):
        dataSetSize=trainSet.shape[0]#返回样本集的行数
       
    distances=array(zeros(dataSetSize))
        for indx in xrange(dataSetSize):
            distances[indx]=cosdist(testdata,trainSet[indx])
        #根据生成的夹角余弦从大到小排序,结果为索引号
       
    sortedDistIndicies=argsort(-distances)
        classCount={}
        #获取角度最小的前k项作为参考项
       
    for i in range(k):
            votelIlabel=listClasses[sortedDistIndicies[i]]#按排序顺序返回样本集对应的类别标签
           
    classCount[votelIlabel]=classCount.get(votelIlabel,0)+1#为字典classCount按value重新排序
        #对分类字典classCount按value重新排序
        #sorted(data.iteritems(),key=operator.itemgetter(1),reverse=True)
        #该句是按字典值排序的固定用法
        #classCount.iteritems():字典迭代器
        #key:排序参数;operator.itemgetter(1):多级排序
       
    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reversed=True)
        return sortedClassCount[0][0]#返回序最高的一项

    #评估分类结果
    dataSet,listClasses=loadDataSet()
    nb=NBayes()
    nb.train_set(dataSet,listClasses)
    #使用之前贝叶斯分类阶段的数据集及生成的TF向量进行分类
    print (classify(nb.tf[3],nb.tf,listClasses,k))

    工程源代码
  • 相关阅读:
    成为数据科学家并不难
    大数据分析的众包平台—Kaggle
    如何写一份好的数据分析报告
    配置java环境时,java的path地址放在其他地址的前面还是后面?
    js:随记
    JS:JSP Servlet
    [swustoj 1088] 德州扑克
    [swustoj 1092] 二分查找的最大次数
    [swustoj 371] 回文数
    [swustoj 1097] 2014
  • 原文地址:https://www.cnblogs.com/kevinzhaozl/p/6626137.html
Copyright © 2011-2022 走看看