zoukankan      html  css  js  c++  java
  • kNN.py源码及注释(python3.x)

    import numpy as np
    import operator
    from os import listdir
    def CerateDataSet():
       
        group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels = ['A','A','B','B']
        return group,labels
    def classify0(inX,dataSet,labels,k):                                             #inX是用于分类的输入向量
        dataSetSize = dataSet.shape[0]                                             #输入的训练样本集是dataSet,标签向量为labels
        diffMat = np.tile(inX,(dataSetSize,1)) - dataSet                       #最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。
        sqDiffMat = diffMat**2
        sqDistances = sqDiffMat.sum(axis=1)
        distances = sqDistances**0.5
        sortedDistIndicies = distances.argsort()
        classCount={}
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
            sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]
    def file2matrix(filename):                                                             #将文本记录转换Numpy的解析程序
        fr = open(filename)                                                                  #1.打开文件读取文件行数
        arrayOLines = fr.readlines()
        numberOfLines = len(arrayOLines)
        returnMat = np.zeros((numberOfLines,3))                               #创建返回numpy的矩阵
        classLabelVector = []
        index = 0
        for line in arrayOLines:                                                             #解析文件数据到列表
            line = line.strip()                                                                   #这一步将‘\n'(空行)转换为'',截取掉所有的回车字符
            listFromLine = line.split(' ')                                                  #然后使用tab字符 将上一步得到的整行数据分割成一个元素列表
            returnMat[index,:] = listFromLine[0:3]
            classLabelVector.append(int(listFromLine[-1]))
            index += 1
        return returnMat,classLabelVector 
     
    def autoNorm(dataSet):                                                                #这个步骤是因为海伦希望三个因素对约会系数计算相等,将数字特征转化为0到1区间
        minVals = dataSet.min(0)                                                         #将每列的最小值放在minVals中
        maxVals = dataSet.max(0)                                                       #将每列的最大值放在minVals中
        ranges = maxVals - minVals                                                     #计算范围
        normDataSet = np.zeros(np.shape(dataSet))   #创建矩阵
        m = dataSet.shape[0]
        normDataSet = dataSet -np.tile(minVals,(m,1))                       #numpy中的tile()函数将变量内容复制成输入矩阵同样大小的矩阵
        normDataSet = normDataSet/np.tile(ranges,(m,1))                 #注意这是具体特征值相除
        return normDataSet, ranges, minVals
    def datingClassTest():                                                                  #为了测试分类器的工作效率
        hoRatio = 0.10                                                                         #测试数据所占据比重
        datingDataMat,datingLabels = file2matrix('C:\Users\dzy520\Desktop\datingTestSet2.txt')
        normMat,ranges,minVals = autoNorm(datingDataMat)
        m = normMat.shape[0]
        numTestVecs = int(m*hoRatio)                                                #计算那些用于训练样本那些用于测试
        errorCount = 0.0
        for i in range(numTestVecs):
            classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],
                                         datingLabels[numTestVecs:m],3)
            print ("the classifier came back with:%d,the real answer is:%d" %(classifierResult,datingLabels[i]))
            if(classifierResult !=datingLabels[i]):errorCount+=1.0
        print("the total error rate is:%f" %(errorCount/float(numTestVecs)))
       
    def classifyPerson():                                                                                                                               #约会网站预测函数,即输入网上的数值测试符合海伦对象的函数
        resultList = ['not at all','in small doses','in large doses']                                                                      #三种情况,不喜欢,一般,喜欢
        percentTats = float(input("percentage oftime spent playing video games?"))                                    #输入玩游戏的占比
        ffMiles = float(input("frequent flier miles earned per year?"))                                                             #输入旅行距离的占比
        iceCream = float(input("liters of ice cream consumed per year?"))                                                    #输入吃冰激凌的数量  
        datingDataMat,datingLabels = file2matrix('C:\Users\dzy520\Desktop\datingTestSet2.txt')              
        normMat,ranges,minVals = autoNorm(datingDataMat)
        inArr = np.array([ffMiles,percentTats,iceCream])                                                                                #将上面三个数据整合成numpy数组
        classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)                                    #计算是否符合
        print("You will probably like this person:",resultList[classifierResult - 1]) 
     
       
        #接下来的是手写识别系统
    def img2vector(filename):                                                                                                                       #此函数是为了把图像格式化处理为一个向量。把一个32*32的矩阵转化为1*1024的向量
        returnVect = np.zeros((1,1024))
        fr = open(filename)
        for i in range(32):
            lineStr = fr.readline()                                                                                                                       #读取每一行
            for j in range(32):                                                                                                                            #读取每一行的每个数据
                returnVect[0,32*i+j] = int(lineStr[j])                                                                                             #将0或者1赋上去
        return returnVect
    def handwritingClassTest():
        hwLabels = []                                                                                                                                      #标签空列表
        trainingFileList = listdir(r'C:Usersdzy520DesktopmachinelearninginactionCh02 rainingDigits')
        m = len(trainingFileList)
        trainingMat = np.zeros((m,1024))                                                                                                        #创建m行1024列训练矩阵,每行数据存储一个图像
        for i in range(m):
            fileNameStr = trainingFileList[i]                                                                                                        #获取标签,也就是获取这个数字是几   
            fileStr = fileNameStr.split('.')[0]                                                                                                        #对文件名进行分割。就是2_45.txt,从 . 那个地方开始分割文件名,就得到2_45和txt两部分,[0]是取前面部分
            classNumStr = int(fileStr.split('_')[0])                                                                                               #再对上步骤处理好的前面部分再从 _ 这里分割,取前面数字
            hwLabels.append(classNumStr) 
            trainingMat[i,:] = img2vector(r'C:Usersdzy520DesktopmachinelearninginactionCh02 rainingDigits/%s' %fileNameStr)     #将fileNameStr所对应的数据写到trainingMat这个矩阵的第i行
        testFileList = listdir(r'C:Usersdzy520DesktopmachinelearninginactionCh02 estDigits')
        errorCount = 0.0                                                                                                                                                                             #初始化错误率为0
        mTest = len(testFileList)
        for i in range(mTest):
            fileNameStr = testFileList[i]
            fileStr = fileNameStr.split('.')[0]                                                                                                        #对测试数据进行分割
            classNumStr = int(fileStr.split('_')[0])
            vectorUnderTest = img2vector(r'C:Usersdzy520DesktopmachinelearninginactionCh02 estDigits/%s' %fileNameStr)
            classifierResult = classify0(vectorUnderTest, trainingMat,hwLabels,3)                                          #由于数据已经是0到1之间所以不需要用上面的autoNorm函数,这个步骤是为了,计算找到最相近的3个即最                                                                                                                                                                   开始函数的原理返回发生最多的标签
            print("the classifier came back with:%d,the real answer is %d" %(classifierResult,classNumStr))  
            if (classifierResult != classNumStr):
                    errorCount += 1.0
        print(" the total number of errors is:%d"%errorCount)
        print(" the total error rate is: %f"%(errorCount/float(mTest))) 
     
     
    温馨提示:这里文件的路径是我机器上的,大家注意路径名,奥利给!
      以上所需文件大家自行下载,嘿嘿嘿~~
  • 相关阅读:
    内置函数的补充
    python3 集合中的常用方法
    Salesforce: ISCHANGED在workflow中的使用
    Salesforce: setTreatTargetObjectAsRecipient的使用
    python实现用户登录次数太多账号"锁定"
    docker命令
    scrapy框架的安装
    分布式爬虫
    scrapy框架mongodb正规存储
    redis
  • 原文地址:https://www.cnblogs.com/Pigsss/p/12259593.html
Copyright © 2011-2022 走看看