陌生函数总结
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),每个特征的最大最小之差,每个特征的最小值
步骤:
- 得到每个特征的最大值,最小值,做差max-min
- 求出old-min
- 做矩阵除法
- 返回
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
"测试算法"
输入:归一化的特征值矩阵,标注矩阵
输出:分类器的错误率
步骤:
- 用file2matrix得到array_x, array_y
- 用autoNorm讲array_x归一化
- 设定0.1*N个数据为测试数据(化为整数)
- 设置循环,得到每一个测试数据的分类结果,并统计错误数量
- 得到错误率并返回
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
输出:分类结果
步骤:
- 讲输入的3个特征分别储存到变量,将变量储存为列表
- 将txt转换为特征矩阵及标注列表
- 特征矩阵归一化
- 将归一化后的输入数据,归一化特征矩阵,标注列表,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
步骤:
- 将训练数据集文件名存入列表
- 将文件名每一行数据进行解析,解析出该文件对应数字(类别),构建出类别列表(array_y),将第i行文件名对应文件,转换为特征矩阵第i行样例,构建出特征矩阵。(由于像素点均为0/1,所以无需归一化)
---------此步骤得到array_x,array_y - 将测试数据集文件名存入列表
- 将文件名每一行数据进行解析,解析出该文件对应数字(测试数据正确标注),将第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,求大神指点哪里错了