百度指数数据抓取Python+selenuim+OpenCV(三)

 可能有些人没有接触过机器学习的内容,但是我所用的是比较简单的最近邻算法,而且特征表达方式也是基于网上某位大牛的特征表达方式,比较简单,感兴趣的可以换其他方法,但就我目前实验数据表明,百度指数的数据用该方法基本可以达到100%(百度指数图片比较单一),下面介绍该部分内容:

(六)手动标注训练样本

所谓的训练样本,在最近邻分类器中就是用于比较的数据,来一个数字与那个数字最接近,就属于那个数。由于百度指数的图片
中的相同数字基本上区别不大,所以每个数字选大概10个图片,加上逗号一共有11个类别,整理成如下所示:

百度指数数据抓取Python+selenuim+OpenCV(三)_第1张图片

(七)提取属性值

所谓属性值,就是能够表示图片的一组变量,对于切割完的图片,借用网上大牛的属性表达方式:
百度指数数据抓取Python+selenuim+OpenCV(三)_第2张图片将一张图片划分为4个部分,计算每个部分中黑色
像素点的个数作为一个属性值,那样即可用一个4维的数组表示一张图片,下联给出代码:
  img = cv2.imread(path)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    rate = [0, 0, 0, 0]
    x = gray_img.shape[0]
    y = gray_img.shape[1]
    for i in range(x):
        if i < x / 2:
            a = 0
        else:
            a = 1
        for j in range(y):
            if j < y / 2:
                b = 0
            else:
                b = 1
            index = a * 2 + b
            if (gray_img[i][j] < 70):
                rate[index] += 1

(七)最近邻算法

该算法理论上十分简单,即使算测试数据与上诉样本数据距离最近的即是它相同的类型数据。所谓距离,我用的是欧氏距离。
也就是上述求到的两个4维向量的欧式距离。代码如下所示:;
  train = xlrd.open_workbook("./split/strain.xlsx")
    sheet = train.sheet_by_name("a")
    distance = []
    clas = []
    for i in range(64):#64是训练样本的个数
        attr1 = int(sheet.cell(i,0).value)
        attr2 = int(sheet.cell(i, 1).value)
        attr3 = int(sheet.cell(i, 2).value)
        attr4 = int(sheet.cell(i, 3).value)
        c = int(sheet.cell(i, 4).value)
        d = (k[0]-attr1)*(k[0]-attr1)+(k[1]-attr2)*(k[1]-attr2)+(k[2]-attr3)*(k[2]-attr3)+(k[3]-attr4)*(k[3]-attr4)
        d = math.sqrt(d)
        distance.append(d)
        clas.append(c)
    index = distance.index(min(distance))
    return clas[index]
上述过程也就完成了数字的识别,识别率基本上可以达到100%。

 由于第一次写博客,还有许多不足之处,如果有错误的欢迎大家指出,如果有疑问可以在下面留言我会及时回复。




你可能感兴趣的:(百度指数数据抓取Python+selenuim+OpenCV(三))