代码之家  ›  专栏  ›  技术社区  ›  Bor

用R加载MNIST数字识别数据集并查看任何结果

  •  0
  • Bor  · 技术社区  · 7 年前

    在书中“ Machine Learning - A Probabilistic Perspective" by Kevin P. Murphy 第一个任务为:

    练习1.1混合MNIST数据上的KNN分类器

    运行mnist1NNdemo 并验证错误分类率(在前1000次测试中 例)1-NN分类器的MNIST为3.8%。(如果您全部运行 所有10000个测试用例,错误率为3.09%。)修改代码以便 首先随机排列特征(训练列 和测试设计矩阵),然后应用 分类器。确认错误率未更改。

    我的简单理解是,这个练习是在加载文件后查找1-NN(R中的kNN())。

    文件:

    train-images-idx3-ubyte。gz:训练集图像(9912422字节)

    列车标签-idx1-ubyte。gz:训练集标签(28881字节)

    t10k-images-idx3-ubyte。gz:测试集映像(1648877字节)

    t10k-标签-idx1-ubyte。gz:测试集标签(4542字节)

    The MNIST DATABASE

    我找到了一个 popular template 加载文件:

    # for the kNN() function 
    library(VIM)
    load_mnist <- function() {
      load_image_file <- function(filename) {
       ret = list()
        f = file(filename,'rb')
        readBin(f,'integer',n=1,size=4,endian='big')
        ret$n = readBin(f,'integer',n=1,size=4,endian='big')
        nrow = readBin(f,'integer',n=1,size=4,endian='big')
        ncol = readBin(f,'integer',n=1,size=4,endian='big')
        x = readBin(f,'integer',n=ret$n*nrow*ncol,size=1,signed=F)
        ret$x = matrix(x, ncol=nrow*ncol, byrow=T)
        close(f)
        ret
      }
      load_label_file <- function(filename) {
        f = file(filename,'rb')
        readBin(f,'integer',n=1,size=4,endian='big')
        n = readBin(f,'integer',n=1,size=4,endian='big')
        y = readBin(f,'integer',n=n,size=1,signed=F)
        close(f)
        y
      }
      train <<- load_image_file("train-images.idx3-ubyte")
      test <<- load_image_file("t10k-images.idx3-ubyte")
       
      train$y <<- load_label_file("train-labels.idx1-ubyte")
      test$y <<- load_label_file("t10k-labels.idx1-ubyte")  
    }
    
    show_digit <- function(arr784, col=gray(12:1/12)) {
      image(matrix(arr784, nrow=28)[,28:1], col=col)
    }
    

    根据注释,在命令行中,这应该可以工作:

      # Error "Error in matrix(arr784, nrow = 28) : object 'train' not found"
      show_digit(train$x[5,])
    

    问题是如何使用show\u digit函数?


    编辑 删除额外问题

    1 回复  |  直到 5 年前
        1
  •  0
  •   Bor    7 年前

    我对这个问题的理解是:

    首先在R Studio或ESS中运行整个文件,然后调用 load_mnist() 从控制台。 之后执行 show_digit(train$x[3,]) 在控制台中,它再次工作。

    可以在整个数据集上查找KNN分类器: a <- knn(train, test, train$y) 但这将是一个非常缓慢的过程。

    对结果的预测如下 table(test$y, a) ,预测测试$y,a为实际结果。

    推荐文章