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('\t')                                                  #然后使用tab字符\t将上一步得到的整行数据分割成一个元素列表
        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:\Users\dzy520\Desktop\machinelearninginaction\Ch02\trainingDigits')
    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:\Users\dzy520\Desktop\machinelearninginaction\Ch02\trainingDigits/%s' %fileNameStr)     #将fileNameStr所对应的数据写到trainingMat这个矩阵的第i行
    testFileList = listdir(r'C:\Users\dzy520\Desktop\machinelearninginaction\Ch02\testDigits')
    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:\Users\dzy520\Desktop\machinelearninginaction\Ch02\testDigits/%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("\nthe total number of errors is:%d"%errorCount)
    print("\nthe total error rate is: %f"%(errorCount/float(mTest))) 
 
 
温馨提示:这里文件的路径是我机器上的,大家注意路径名,奥利给!
  以上所需文件大家自行下载,嘿嘿嘿~~

kNN.py源码及注释(python3.x)的更多相关文章

  1. 3.9 run_main.py源码(兼容python2和3)

    3.9 run_main.py源码(兼容python2和3) 以下代码在python2和python3上都跑通过,python3只需注释掉上面红色框框区域代码就行(最后一步发送邮箱代码,我注释掉了). ...

  2. robotlegs2.0框架实例源码带注释

    robotlegs2.0框架实例源码带注释 Robotlegs2的Starling扩展 有个老外写了robotleges2的starling扩展,地址是 https://github.com/brea ...

  3. Centos7下源码编译安装python3.6

    测试环境: 操作步骤: 1. 下载Python源码包(python3.6.0) 官网下载地址:https://www.python.org/downloads/ 搜狐下载地址:http://mirro ...

  4. eclipse/intellij idea 查看java源码和注释

    工作三年了,一直不知道怎么用IDE查看第三方jar包的源码和注释,惭愧啊!看源码还好些,itellij idea自带反编译器,eclipse装个插件即可,看注释就麻烦了,总不能去找api文档吧!现在终 ...

  5. 完美原创:centos7.1 从源码升级安装Python3.5.2

    (原创)完美原创:centos7.1 从源码升级安装Python3.5.2 下载Python3.5.2源码:https://www.python.org/downloads/release/pytho ...

  6. centos7.1 从源码升级安装Python3.5.2

    http://blog.csdn.net/tengyunjiawu_com/article/details/53535153 centos7.1 从源码升级安装Python3.5.2(我写的,请大家度 ...

  7. Django框架base.py源码

    url.py文件 from django.conf.urls import url from django.contrib import admin from app_student import v ...

  8. 【Eclipse+IntelliJ反编译】Eclipse/IntelliJ IDEA反编译查看源码及注释

    怎么用IDE查看第三方jar包的源码和注释,IntelliJ IDEA自带反编译器,Eclipse装个插件即可,不能看注释就麻烦了,总不能去找API文档吧,现在终于掌握了,下面给出解决方案,供大家参考 ...

  9. ExcelToHtmlTable转换算法:将Excel转换成Html表格并展示(项目源码+详细注释+项目截图)

    功能概述 Excel2HtmlTable的主要功能就是把Excel的内容以表格的方式,展现在页面中.Excel的多个Sheet对应页面的多个Tab选项卡.转换算法的难点在于,如何处理行列合并,将Exc ...

随机推荐

  1. Flask 教程 第二十三章:应用程序编程接口(API)

    本文翻译自The Flask Mega-Tutorial Part XXIII: Application Programming Interfaces (APIs) 我为此应用程序构建的所有功能都只适 ...

  2. 中山Day5——普及

    今天题目真是贼难呐...才38... 收获:树状数组单个修改 树状数组区间修改 T1:旅行 题意:有n个数,问;从中取任意个数,他们的和为质数的方案数是多少?(n<=50) 暴力模拟即可,这里不 ...

  3. 数字对象NSNumber的使用

    先简述下关于NSNumber的信息 NSNumber的存在就相当于java中的装箱与拆箱.只不过java中的装箱拆箱过程,使用的是对应的类型,比如基本数据类型是int.double类型,装箱时就得对应 ...

  4. scrollView嵌套

    需求:底部是一个scrollView,上面放着一小块的百度地图查看view.如果用户手指放在地图查看view上,就滚动地图查看view:如果是放在底部的scrollView上滚动,那就滚动底部的scr ...

  5. pytorch梯度下降法讲解(非常详细)

    pytorch随机梯度下降法1.梯度.偏微分以及梯度的区别和联系(1)导数是指一元函数对于自变量求导得到的数值,它是一个标量,反映了函数的变化趋势:(2)偏微分是多元函数对各个自变量求导得到的,它反映 ...

  6. F: Fabulous Race Between Tortoise And Rabbit 扩展欧几里得

    http://oj.jxust.edu.cn/contest/Problem?id=1561&pid=5 题目描述 经历了上次的惨败,兔子一直心怀不满,又策划了一场比赛,但这次不再是简单的跑步 ...

  7. WebGL 渲染管线

    WebGL 是以 OpenGL ES 2.0 为基础的 3D 编程应用接口. WebGL依赖GPU的图形渲染能力,即依赖硬件设备,所以其渲染流程和GPU内部的渲染管线是相符的.渲染管线的作用是将3D模 ...

  8. eclipse搜索类快捷键

    习惯的编辑器可以提高编程效率,熟悉的快捷键可以提高工作效率,本文更新eclipse中常用的搜索快捷键 打开资源快捷键:Ctrl+Shift+R 通过在搜索框中输入名字可以很方便的在项目或工作空间中找某 ...

  9. c++中比较好用的“黑科技”

    切入正题,上黑科技 一.黑科技函数(常用的我就不写了,例如sort函数) 1.next_permutation(a+1,a+1+n) a[1-n]全排列 2.reverse(a+1,a+1+n) 将a ...

  10. Unity3d fbx纹理不显示 原因

    Unity3d 导入fbx文件后纹理不显示(3ds Max中显示正常) 原因: 1.纹理图片没有导入fbx同一文件夹中 2.纹理图片没有在fbx文件之前导入(现导入纹理图片,再导入fbx文件)