• python的机器学习之路


    2018-04-1712:22:40

    这是python依靠计算机视觉进行的ocr手写字的识别。

    通过KNN训练数据

    kNN 可以说是最简单的监督学习分类器了。想法也很简单,就是找出测试数据在特征空间中的最近邻居。我们将使用下面的图片介绍它。

        Understanding kNN
    上图中的对象可以分成两组,蓝色方块和红色三角。每一组也可以称为一个 类。我们可以把所有的这些对象看成是一个城镇中房子,而所有的房子分别属于蓝色和红色家族,而这个城镇就是所谓的特征空间。(你可以把一个特征空间看成是所有点的投影所在的空间。例如在一个 2D 的坐标空间中,每个数据都两个特征 x 坐标和 y 坐标,你可以在 2D 坐标空间中表示这些数据。如果每个数据都有 3 个特征呢,我们就需要一个 3D 空间。N 个特征就需要 N 维空间,这个 N 维空间就是特征空间。在上图中,我们可以认为是具有两个特征色2D 空间)。
    现在城镇中来了一个新人,他的新房子用绿色圆盘表示。我们要根据他房子的位置把他归为蓝色家族或红色家族。我们把这过程成为 分类。我们应该怎么做呢?因为我们正在学习看 kNN,那我们就使用一下这个算法吧。
    一个方法就是查看他最近的邻居属于那个家族,从图像中我们知道最近的是红色三角家族。所以他被分到红色家族。这种方法被称为简单 近邻,因为分类仅仅决定与它最近的邻居。
    但是这里还有一个问题。红色三角可能是最近的,但如果他周围还有很多蓝色方块怎么办呢?此时蓝色方块对局部的影响应该大于红色三角。所以仅仅检测最近的一个邻居是不足的。所以我们检测 k 个最近邻居。谁在这 k 个邻居中占据多数,那新的成员就属于谁那一类。如果 k 等于 3,也就是在上面图像中检测 3 个最近的邻居。他有两个红的和一个蓝的邻居,所以他还是属于红色家族。但是如果 k 等于 7 呢?他有 5 个蓝色和 2 个红色邻居,现在他就会被分到蓝色家族了。k 的取值对结果影响非常大。更有趣的是,如果 k 等于 4呢?两个红两个蓝。这是一个死结。所以 k 的取值最好为奇数。这中根据 k 个最近邻居进行分类的方法被称为 kNN。

    ## https://www.cnblogs.com/Undo-self-blog/p/8449393.html
    import numpy as np
    import cv2
    
    #读取图片转为灰度图
    img = cv2.imread('D:opencv-3.4.1samplesdatadigits.png')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    #把图片分隔成5000个,每个20x20大小
    cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
    
    #再转成numpy数组
    x = np.array(cells)
    
    #一半用来训练的数组,一半用来测试的数组
    train = x[:,:50].reshape(-1,400).astype(np.float32)
    test = x[:,50:100].reshape(-1,400).astype(np.float32)
    
    #创建训练和测试的标签
    k = np.arange(10)
    train_labels = np.repeat(k,250)[:,np.newaxis]
    test_labels = train_labels.copy()
    
    #创建一个K-Nearest Neighbour分类器,训练数据,然后用测试数据测试它
    knn = cv2.ml.KNearest_create()
    knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)
    ret,result,neighbours,dist = knn.findNearest(test,k=5)
    
    #最终检查测试的精确度,比较结果,检查哪些是错误的,最终输出正确率
    matches = result == test_labels
    correct = np.count_nonzero(matches)
    accuracy = correct*100.0 / result.size
    print(accuracy)
    # save the data
    np.savez('knn_data.npz',train=train, train_labels=train_labels)
    
    # Now load the data
    with np.load('knn_data.npz') as data:
        print (data.files)
        train = data['train']
        train_labels = data['train_labels']

    2018-04-1712:22:44

    @青山不移,文笔不息。学习,坚持,梦想青春!
  • 相关阅读:
    saltstack
    python一个命令开启http服务器
    常用服务安装部署
    位置1
    linux中python3安装和使用
    Linux基础系统优化
    Shell基本命令
    linux系统目录结构
    远程连接linux服务器
    VMware和Centos安装使用
  • 原文地址:https://www.cnblogs.com/pengwenzheng/p/8863138.html
Copyright © 2020-2023  润新知