kNN算法python实现和简单数字识别的方法
本文实例讲述了kNN算法python实现和简单数字识别的方法。分享给大家供大家参考。具体如下:
kNN算法算法优缺点:
优点:精度高、对异常值不敏感、无输入数据假定
缺点:时间复杂度和空间复杂度都很高
适用数据范围:数值型和标称型
算法的思路:
KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类。
函数解析:
库函数:
tile()
如tile(A,n)就是将A重复n次
a=np.array([0,1,2]) np.tile(a,2) array([0,1,2,0,1,2]) np.tile(a,(2,2)) array([[0,1,2,0,1,2],[0,1,2,0,1,2]]) np.tile(a,(2,1,2)) array([[[0,1,2,0,1,2]],[[0,1,2,0,1,2]]]) b=np.array([[1,2],[3,4]]) np.tile(b,2) array([[1,2,1,2],[3,4,3,4]]) np.tile(b,(2,1)) array([[1,2],[3,4],[1,2],[3,4]])`
自己实现的函数
createDataSet()生成测试数组
kNNclassify(inputX,dataSet,labels,k)分类函数
inputX输入的参数
dataSet训练集
labels训练集的标号
k最近邻的数目
#coding=utf-8 fromnumpyimport* importoperator
defcreateDataSet(): group=array([[1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]]) labels=['A','A','B','B'] returngroup,labels #inputX表示输入向量(也就是我们要判断它属于哪一类的) #dataSet表示训练样本 #label表示训练样本的标签 #k是最近邻的参数,选最近k个 defkNNclassify(inputX,dataSet,labels,k): dataSetSize=dataSet.shape[0]#计算有几个训练数据 #开始计算欧几里得距离 diffMat=tile(inputX,(dataSetSize,1))-dataSet sqDiffMat=diffMat**2 sqDistances=sqDiffMat.sum(axis=1)#矩阵每一行向量相加 distances=sqDistances**0.5 #欧几里得距离计算完毕 sortedDistance=distances.argsort() classCount={} foriinxrange(k): voteLabel=labels[sortedDistance[i]] classCount[voteLabel]=classCount.get(voteLabel,0)+1 res=max(classCount) returnres
defmain(): group,labels=createDataSet() t=kNNclassify([0,0],group,labels,3) printt if__name__=='__main__': main()