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 最近邻的数目1#coding=utf-82fromnumpyimport*3importOperator45defcreateDataSet():6group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])7labels = ['A','A','B','B']8returngroup,labels9#inputX表示输入向量(也就是我们要判断它属于哪一类的)10#dataSet表示训练样本11#label表示训练样本的标签12#k是最近邻的参数,选最近k个13defkNNclassify(inputX, dataSet, labels, k):14dataSetSize = dataSet.shape[0]#计算有几个训练数据15#开始计算欧几里得距离16diffMat = tile(inputX, (dataSetSize,1)) -dataSet1718sqDiffMat = diffMat ** 219sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加20distances = sqDistances ** 0.521#欧几里得距离计算完毕22sortedDistance =distances.argsort()23classCount ={}24foriinxrange(k):25voteLabel =labels[sortedDistance[i]]26classCount[voteLabel] = classCount.get(voteLabel,0) + 127res =max(classCount)28returnres2930defmain():31group,labels =createDataSet()32t = kNNclassify([0,0],group,labels,3)33PRintt3435if__name__=='__main__':36main()37
kNN应用实例手写识别系统的实现数据集:两个数据集:training和test。分类的标号在文件名中。像素32*32的。数据大概这个样子:
方法:kNN的使用,不过这个距离算起来比较复杂(1024个特征),主要是要处理如何读取数据这个问题的,比较方面直接调用就可以了。速度:速度还是比较慢的,这里数据集是:training 2000+,test 900+(i5的CPU)k=3的时候要32s+
1#coding=utf-82fromnumpyimport*3importoperator4importos5importtime67defcreateDataSet():8group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])9labels = ['A','A','B','B']10returngroup,labels11#inputX表示输入向量(也就是我们要判断它属于哪一类的)12#dataSet表示训练样本13#label表示训练样本的标签14#k是最近邻的参数,选最近k个15defkNNclassify(inputX, dataSet, labels, k):16dataSetSize = dataSet.shape[0]#计算有几个训练数据17#开始计算欧几里得距离18diffMat = tile(inputX, (dataSetSize,1)) -dataSet19#diffMat = inputX.repeat(dataSetSize, aixs=1) - dataSet20sqDiffMat = diffMat ** 221sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加22distances = sqDistances ** 0.523#欧几里得距离计算完毕24sortedDistance =distances.argsort()25classCount ={}26foriinxrange(k):27voteLabel =labels[sortedDistance[i]]28classCount[voteLabel] = classCount.get(voteLabel,0) + 129res =max(classCount)30returnres3132defimg2vec(filename):33returnVec = zeros((1,1024))34fr =open(filename)35foriinrange(32):36lineStr =fr.readline()37forjinrange(32):38returnVec[0,32*i+j] =int(lineStr[j])39returnreturnVec4041defhandwritingClassTest(trainingFloder,testFloder,K):42hwLabels =[]43trainingFileList =os.listdir(trainingFloder)44m =len(trainingFileList)45trainingMat = zeros((m,1024))46foriinrange(m):47fileName =trainingFileList[i]48fileStr = fileName.split('.')[0]49classNumStr = int(fileStr.split('_')[0])50hwLabels.append(classNumStr)51trainingMat[i,:] = img2vec(trainingFloder+'/'+fileName)52testFileList =os.listdir(testFloder)53errorCount = 0.054mTest =len(testFileList)55foriinrange(mTest):56fileName =testFileList[i]57fileStr = fileName.split('.')[0]58classNumStr = int(fileStr.split('_')[0])59vectorUnderTest = img2vec(testFloder+'/'+fileName)60classifierResult =kNNclassify(vectorUnderTest, trainingMat, hwLabels, K)61#print classifierResult,' ',classNumStr62ifclassifierResult !=classNumStr:63errorCount +=164print'tatal error',errorCount65print'error rate',errorCount/mTest6667defmain():68t1 =time.clock()69handwritingClassTest('trainingDigits','testDigits',3)70t2 =time.clock()71print'execute',t2-t172if__name__=='__main__':73main()74
机器学习笔记索引
来自为知笔记(Wiz)