下载相应的数据库http://yann.lecun.com/exdb/mnist/
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
其数据库有60000的训练库,可以将训练库取其中的几千条作为训练,随机抽一些其他的作为训练完后的测试实例
其中,images的文件格式为
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
简单点说,就是直接越过文件的前16个字节,之后,按照28*28字节的size,读取文件
labels文件的格式为
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
同样,跳过前8个字节,读取60000个byte,写入一个list中
实现代码如下:
def LoadMNISTData():
imagefile = "D:\\sciLearn\\train-images-idx3-ubyte\\train-images.idx3-ubyte"
labelfile = "D:\\sciLearn\\train-labels-idx1-ubyte\\train-labels.idx1-ubyte"
fpimg = open(imagefile, "rb")
fplab = open(labelfile, "rb")
fpimg.read(16)
imgvec = []
while True:
aimg = fpimg.read(28*28)
if len(aimg)<28*28:
break;
imgvec.append([aimg[i] for i in range(0, 28*28)])
fplab.read(8)
veclab = fplab.read(60000)
veclab = [veclab[i] for i in range(0, 60000)]
return imgvec,veclab
获取数据后,就可以进行数据训练了,代码如下
X_train,y_label=LoadMNISTData()
clf = knn()
clf = clf.fit(X_train[1:3000],y_label[1:3000])
训练完成后,取部分训练数据作为测试数据进行测试,
print("将要预测的结果是"+str(y_label[3000:3003]))
result = clf.predict(X_train[3000:3003])
print(str(result ))
至此,knn的机器学习即完成。
依托这个例子,可以自己构建其他文字识别的例子。