机器学习实战-2-K近邻-3(归一化特征值,测试算法,使用算法,手写识别系统)

陌生函数总结
1.np.array.min()
<1>无参:所有元素最小值
<2>array.min(0):每列最小值
<3>array.min(1):每行最小值
2.file.readline(size=从文件中读取的字节数,option)
方法用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。
3.file.readlines()
readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。
如果碰到结束符 EOF 则返回空字符串。
如果碰到结束符 EOF 则返回空字符串。
4.os.listdir(path)
from os import listdir
返回指定路径下的文件和文件夹列表。

path = "/var/www/html/"
dirs = os.listdir( path )

# 输出所有文件和文件夹
for file in dirs:
    print (file)

5.string.split(‘符号/字符/数字’)
将string按string里面的 符号/字符/数字 分割,并删除该 符号/字符/数字 ,返回一个列表

 a='0_3.txt'
 filestr=a.split('3')
>>> filestr
['0_', '.txt']

归一化特征值
输入:dataSet特征值矩阵
输出:归一化的特征值矩阵newnorm=(old-min)/(max-min),每个特征的最大最小之差,每个特征的最小值
步骤:

  1. 得到每个特征的最大值,最小值,做差max-min
  2. 求出old-min
  3. 做矩阵除法
  4. 返回
def autoNum(array_x):
    "求出每列特征最大最小,shape=1*m"
    minArray_x=array_x.min(0)
    maxArray_x=array_x.max(0)
    ranges=maxArray_x-minArray_x
    "扩展最小最大行向量,为原始dataset.shape形状,N*m"
    mintile_x=np.tile(minArray_x,(array_x.shape[0],1))
    maxtile_x=np.tile(maxArray_x,(array_x.shape[0],1))
    rangeMatrix=maxtile_x-mintile_x
    "求归一化矩阵"
    normDataSet=np.zeros(array_x.shape)
    normDataSet=array_x-mintile_x
    normDataSet=normDataSet/rangeMatrix
    return normDataSet,ranges,minArray_x

"测试算法"
输入:归一化的特征值矩阵,标注矩阵
输出:分类器的错误率
步骤:

  1. 用file2matrix得到array_x, array_y
  2. 用autoNorm讲array_x归一化
  3. 设定0.1*N个数据为测试数据(化为整数)
  4. 设置循环,得到每一个测试数据的分类结果,并统计错误数量
  5. 得到错误率并返回
def datingClassTest():
    array_x,array_y=file2matrix('datingTestSet2.txt')
    norm_x,ranges,minArray_x=autoNum(array_x)
    testSetRat=0.1
    DataSize=array_x.shape[0]
    testSetNum=int(testSetRat*DataSize)
    errorCount=0
    for i in range(testSetNum):
        testResult=classify0(norm_x[i,:],norm_x[testSetNum:,:],array_y[testSetNum:],3)
        print("the test answer is: {}".format(testResult),"the real answer is: {}".format(array_y[i]))
        if(testResult!=array_y[i]):
            errorCount+=1
    errorRat=errorCount/testSetNum
    print("error rat is {}".format(errorRat))
    return errorRat

使用算法

1.a=float(input(“you can enter a float”))
将输入的浮点数存入a

输入:特征1,特征2,特征3
输出:分类结果
步骤:

  1. 讲输入的3个特征分别储存到变量,将变量储存为列表
  2. 将txt转换为特征矩阵及标注列表
  3. 特征矩阵归一化
  4. 将归一化后的输入数据,归一化特征矩阵,标注列表,k值传入classify0,得到最终结果
def classifyPerson():
    resultList=['not at all','in small doses','in large doses']
    x1=float(input("input x1"))
    x2=float(input("input x2"))
    x3=float(input("input x3"))
    array_x, array_y=file2matrix('datingTestSet2.txt')
    normDataSet, ranges, minArray_x=autoNum(array_x)
    newData=([x1,x2,x3]-minArray_x)/ranges
    newResult=classify0(newData, normDataSet, array_y, 3)
    print("new result = {}".format(resultList[newResult]))

手写识别系统
1.准备数据
将图像转换为测试向量(32* 32的txt文件转换为1*1024的向量)

def img2vector(filename):
    returnVect=np.zeros((1,1024))
    with open(filename) as txt:
        for i in range(32):
            lineStr=txt.readline().strip()
            for j in range(len(lineStr)):
                returnVect[0,32*i+j]=lineStr[j]
    return returnVect

2.测试算法
使用KNN算法识别手写数字
输入: testDataSet, trainingDataSet
输出: testDataSet分类错误率
说明: trainingdata在文件夹trainingDigits中,该文件夹包含m条txt格式样例(32* 32),testDataSet在文件夹testDigits中,该文件夹包含n条测试样例(32* 32)。所有文件命名格式均为:数字_该数字样例序号:0_0.txt
步骤:

  1. 将训练数据集文件名存入列表
  2. 将文件名每一行数据进行解析,解析出该文件对应数字(类别),构建出类别列表(array_y),将第i行文件名对应文件,转换为特征矩阵第i行样例,构建出特征矩阵。(由于像素点均为0/1,所以无需归一化)
    ---------此步骤得到array_x,array_y
  3. 将测试数据集文件名存入列表
  4. 将文件名每一行数据进行解析,解析出该文件对应数字(测试数据正确标注),将第i行文件名对应文件转换为(1* 1024)向量,传入KNN分类器:第i行向量,特征矩阵,类别列表,k值。得到分类结果,与正确标注进行对比,统计错误率,并输出。
import os
from os import listdir

def handwritingClassTest():
    traningList=os.listdir("trainingDigits")
    traning_y=[]
    traning_x=np.zeros((len(traningList),1024))
    for i in range(len(traningList)):
        iLabel=traningList[i].strip().split('_')[0]
        traning_y.append(iLabel)
        traning_x[i,:]=img2vector("trainingDigits\{}".format(traningList[i].strip()))

    testList=os.listdir("testDigits")
    errorCount=0
    for i in range(len(testList)):
        iTest_y=testList[i].strip().split('_')[0]
        i_x=img2vector(r"testDigits\{}".format(testList[i].strip()))
        i_testResult=classify0(i_x,traning_x,traning_y,3)
        if(iTest_y!=i_testResult):
            errorCount=+1
    errorRat = errorCount / len(testList)
    print("errorCount={}".format(errorCount), "errorrat={}".format(errorRat))

注意:
1.地址一定是要双引号括起来,若想方问当前文件夹内子文件夹:“子文件夹名\文件”
2.为什么我得到的错误数量是10,正确答案是11,求大神指点哪里错了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值