机器学习手记[6]---KNN算法

来源:互联网 发布:c语言中文网官网 编辑:程序博客网 时间:2024/06/15 16:57

KNN算法,是监督学习,

已知一组训练数据,知道多个特征对应值和所属类别,

然后添加测试数据,计算测试样本在多特征空间上到各类别训练数据的欧式距离,

距离那个类别训练数据集的距离小,就属于那个类别。


需要指出这个对于训练数据集的选择很重要,如果某类样本很多,另一类样本较少,这会对分类结果有影响。

另外KNN算法需要计算到每个训练数据的欧式距离然后叠加,计算量较大


# -*- coding: utf-8 -*-from numpy import *import operator#创建训练数据集,特征数组和对应类别def createDataSet():    point_set=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0]])    label_set=array(['A','A','B','B'])    return point_set,label_set#根据创建数据计算欧氏距离,进行分类def knn_classify(check_point, point_set, label_set, m_top_pk):    point_count=point_set.shape[0] #计算训练数据个数    #根据已有训练数据规模计算一个测试样本的矩阵,方便后面整体运算    diffMat=tile(check_point, (point_count,1))-point_set    sumSquareMat=(diffMat**2).sum(axis=1) #QQ    distMat=sumSquareMat**0.5  #求得到各训练数据欧氏距离的矩阵    sortedIndex=distMat.argsort()#按距离大小排序求得对应索引位置    pk_result={}    for i in range(m_top_pk):#以训练数据集的前n个数据判定测试数据最终类别        label_result=label_set[sortedIndex[i]]#距离第i近的数据对应的类别        pk_result[label_result]=pk_result.get(label_result,0)+1; #该类别的频数+1    class_result=sorted(pk_result.iteritems(),key=operator.itemgetter(1),reverse=True) # dict->list,  按值排序, 反序输出    return class_result[0][0] #输出最大数量类别


0 0