1.简介

K-近邻算法(K-Nearest Neighbor, KNN),属于监督学习,是一中基本分类与回归方法。k 近邻法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类, k 近邻法假设给定一个训练数据集,其中的实例类别已定,分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。

2.基本要素

  ①K值的选择

  ②距离量度

  (1)欧氏距离

    

 

 

  (2)曼哈顿距离

    

 

 

  ③分类决策规则

3.实现knn算法的代码实现

 

from numpy import *
import operator
 
#训练样本集以及对应的类别
def createDateSet():
    group = array([[3,53],[2,48],[1,49],[101,10],[99,5],[98,2]])
    labels = [‘西苑’,’西苑’,’西苑’,’万人’,’万人’,’万人’]
    return group,labels
 
def classify(inX, dataSet, labels, k):
    #dataSetSize是训练样本集数量
    dataSetSize = dataSet.shape[0]
 
    #距离计算——欧式距离公式
    #tile函数,把inX变成能与dataSet相减的二维数组
    diffMat = tile(inX, (dataSetSize, 1)) – dataSet
    sqDiffMat = diffMat ** 2
    #axis=1是列相加求和,即得到(x1-x2)^2+(y1-y2)^2的值
    sqDistances = sqDiffMat.sum(axis = 1)    
    distances = sqDistances ** 0.5
 
    #按照距离递增次序排序,返回下标
    sortedDistIndicies = distances.argsort()
 
    #选择距离最小的k个点
    classCount = {}
    for i in range(k):
        voteILabel = labels[sortedDistIndicies[i]]
        classCount[voteILabel] = classCount.get(voteILabel,0) + 1
 
    #按照字典里的关键字的值排序,reverse=True降序排序
    sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
   
    #返回类别最多的标签
    return sortedClassCount[0][0]
 
测试算法:
i = 0
print(“训练样本集”)
group, labels = createDateSet()
for item in group:
    print(‘食堂%c:一楼%3d次  二楼%3d次  食堂选择: %s’%(chr(ord(‘A’)+i),item[0],item[1],labels[i]))
    i += 1
 
print(“\n测试数据集”)
myTests = array([[18,90],[20,66],[50,23]])
myLabels = []
for i in range(3):
    myLabels.append(classify(myTests[i], group, labels, 3))
    print(‘食堂%c:一楼%3d次  二楼%3d次  食堂选择: %s’%(chr(ord(‘A’)+i),myTests[i][0],myTests[i][1],myLabels[i]))
 
测试结果:

 

原文地址:http://www.cnblogs.com/Moonee/p/16830658.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性