K-近邻算法

算法描述:

k-近邻算法主要就是采用测量不同特征值之间的距离方法分类。原理:存在一个数据集合即训练样本,并且样本中的数据都存在标签,也即我们知道每个样本数据和所属分类的对用关系,输入没有标签的新数据之后,将新数据的每个特征和样本集数据中数据对应的特征进行比较,然后算法提取样本数据集中特征最为相似(最近邻)的数据的标签。若过一个样本在特征空间的k个最相似的样本属于一个类别,那么该样本也属于这个类别,也即k-近邻算法。一般k值不大于20;
对应于一个k-近邻的小例子:判断一部电影到底是爱情片,还有动作片(采取的特征主要就是接吻镜头和打斗镜头)

数据采集:

电影的镜头及类型
电影名称打斗镜头接吻镜头电影类型
California man3104爱情
he is not really into dudes2100爱情
beautiful woman 190爱情
窃听风云1032动作
精武英雄1401动作
纵横四海972动作
2102

未知电影并不清楚是什么类型的电影,但是也根据其他的电影计算出距离(具体方法见下)
已知与未知电影的距离
电影名称距离
California man20.5
he is not really into dudes18.7
beautiful woman 19.2
窃听风云115.3
精武英雄117.2
纵横四海118.9
根据距离,找到k个最近距离电影,假设k=3,距离最近的3个分别是前三个电影,然而这三个电影都是爱情片,故此判断未知电影的类型也是爱情片。

k-近邻算法的一般流程:

(1)收集数据
(2)准备数据
(3)分析数据
(4)训练算法,此步骤不适合k-近邻算法
(5)测试算法,计算误差率
(6)使用算法    分类

实施KNN算法的伪代码:

对应于未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点的距离
(2)按照距离递增排序
(3)选取与当前距离最小的k个点
(4)确定前k个点所在类别出现的频率
(5)返回前k个点频率最高的类别作为当前点的类别

python简单实现kNN小例子:
__author__ = 'XD'
from numpy import *
import operator
def createDataset():
    group = ([1.0,1.1],[1.0,1.0],[0.0,0.0],[0.0,0.1]) #训练样本
    lables = ['A','A','B','B']                      #目标变量
    return group,lables

def classify0(inx,dataset,lables,k):
    datasetsize = len(dataset)                      #维度
    diffMat = tile(inx,(datasetsize,1))-dataset     #计算距离
    sqDiffMat = diffMat**2
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance**0.5
    sortedDistIndicies = distance.argsort()         #输出每个元素排序的序号
    classCount = {}
    for i in range(k):
        voteIlable = lables[sortedDistIndicies[i]]
        classCount[voteIlable] = classCount.get(voteIlable,0)+1
        sortedclassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)   #排序  倒排以第二个元素为准
        return sortedclassCount[0][0]
'''
实施kNN时需要,inx为输入向量【0,0】dataset为上面函数的group,lables函数也是由上面函数求出,k的值取3
'''
#此小例子的输出结果是B


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值