PCA+KNN用于mnist手写体数据集
俗话说(我就是俗话)实践是检验自己实现算法的唯一标准。今天简单实现一下PCA+KNN组合用于mnist分类。理论我就不分析了,网上一群大牛说的头头是道,哈哈,本篇博客附上数据处理代码和算法实现代码,如有雷同概不负责。
PCA+KNN之简单理解
PCA是一个对数据进行降维的算法,降维是提取高维数据的主要特征(特征提取)然后提出数据中的噪声和冗余信息,从而也实现提升数据处理速度的目的。KNN(k-邻近)是通过测量不同样本特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
#代码实现
(闲话不多说直接上代码,大神嘴下留情,代码都是东拼西凑的)
首先数据处理
我先将mnist数据读成csv格式的,文本内容如图所示:第一列是标签,其他的标签对应的图片中各个像素的像素值
然后代码实现
生成该文本的代码有两套:一套为从二进制文件中读取生成的(搬运工搬来的),另一套为从图片数据中去读生成的(原创),用得到的自行选择哈。
//从二进制文件中读取
def convert(imgf, labelf, outf, n):
f = open(imgf, "rb")
o = open(outf, "w")
l = open(labelf, "rb")
f.read(16)
l.read(8)
images = []
for i in range(100):
image = [ord(l.read(1))]
for j in range(28 * 28):
image.append(ord(f.read(1)))
images.append(image)
for image in images:
o.write(",".join(str(pix) for pix in image) + "\n")
f.close()
o.close()
l.close()
convert("/home/qyny/PycharmProjects/MobileNetv2/MNIST_data1111/train-images-idx3-ubyte", "/home/qyny/PycharmProjects/MobileNetv2/MNIST_data1111/train-labels-idx1-ubyte",
"mnist_train.csv", 60000)
convert("/home/qyny/PycharmProjects/MobileNetv2/MNIST_data1111/t10k-images-idx3-ubyte", "/home/qyny/PycharmProjects/MobileNetv2/MNIST_data1111/t10k-labels-idx1-ubyte",