Python3.2 实现基于KNN算法的数据分类


1 前言

这几天在看《机器学习实战》一书,买这本书的最首要原因是它里面采用Python来实现,而我这段时间对Python的好感越来越强烈。拿到手后一看,果然很不错,书中对一些经典机器学习算法的解释与实现 阐述的都很通俗。今天把KNN算法看懂了,在些基础上用Python进行了实现,代码主要还是基于书中的示例,我在看明白后,加上了注释。

2 KNN算法的基本原理

KNN属于监督学习,要求事先准备好已知分类结果的数据集(即样本数据),其基本原理较为简单。对于待分类的数据集,将其各特征值与样本数据对应的特征值进行比较,然后提取出样本集中与待分类数据的特征最相近的k个数据所对应的分类结果标注,最后从中找出出现最多的那个标注作为待分类数据的最终分类结果。

3 一个简单的待解决问题

已有数据:

group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['a','a','b','b']

两组待分类数据:

[1.0,0.8]

[0.5,0.5]

求两组待分类数据分别属于哪一类

4 代码

from numpy import *
import operator

#已有数据,以及对应的标签
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['a','a','b','b']

'''
作用:将待分类数据集与已有数据集以其标签进行计算,从而得出待分类数据集最有可能所属的类别
参数:
inX:待分类数据集
dataSet:已有数据集,通过createDataSet()函数获取
labels:已有数据集对应的分类标签,通过createDataSet()函数获取
k:设置最小距离数
'''	
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0] #获取数据集的行数

    #计算距离
    #tile(a,(b,c)):将a的内容在行上重复b次,列上重复c次
    #下面这一行代码的结果是将待分类数据集扩展到与已有数据集同样的规模,然后再与已有数据集作差
    diffMat = tile(inX, (dataSetSize,1)) - dataSet 

    sqDiffMat = diffMat**2  #对上述差值求平方   
    sqDistances = sqDiffMat.sum(axis=1) #对于每一行数据求和
    distances = sqDistances**0.5 #对上述结果开方
    sortedDistIndicies = distances.argsort()  #对开方结果建立索引 

    #计算距离最小的k个点的Lable
    classCount={}  #建立空字典,类别字典,保存各类别的数目
    for i in range(k): #通过循环寻找k个近邻
        voteIlabel = labels[sortedDistIndicies[i]] #先找出开方结果索引表中第i个值对应的Label值
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 # 存入当前label以及对应的类别值

    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #对类别字典进行逆排序,级别数目多的往前放

    #返回结果
    return sortedClassCount[0][0] #返回级别字典中的第一个值,也就是最有可能的Label值

#进行分类
print(classify0([1.0,0.8],group,labels,3))
print(classify0([0.5,0.5],group,labels,3))


5 执行结果


评论关闭