毕设报告-2015-03-10
Tim Chen(motion$) Lv5

毕业设计完成情况

我的感受

  • 写论文绝不是一件轻松的工作,特别是如果你选的题目和你现在的水平相差甚远时。自从上一次的毕业论文中期检查之后,我实习了一个月,然后回家过了个年,所以把时间分配到做毕设的也不多,而且我现在明白到了做理论这一块的论文,特别是面对一连串关数学的推导,一大片难懂的公式,那就更是不知所云。不过就像我的指导老师易老师说的那样,写论文不是简单的拼凑文章,而是需要大量的去阅读前人在你的这个领域范围内的文章,去慢慢吸收里面的知识,然后可以通过自己的话来描述清楚一个问题。“读书千遍,其义自见”这句谚语的个中滋味我也终有领会。特别是偏理论的问题,读第一遍,不知所云,读第二遍,不知所云,读第三遍,不知所云。。。然后突然再读下一遍,就发现自己找到了头绪,那感觉就好像身陷死角里摸不着头了好久,然后突然看到了一线光明一样,整个人都开朗了起来。

完成情况概述

  • 我的毕设规划是分两个路线进行,一个是理论学习路线,一个是系统实现路线。
  • 上次的完成情况如下图:
  • 现在的完成进度则如下:
  • 所以到目前为止,还是注重于理论这一块的学习,因为这一块的难度比重是占的比较大的。

做了哪些工作

阅读了以下优秀的博客文章:

翻译了一下国外优秀的文章:

草拟了论文目录框架

利用pygame实现系统的UI,完成了模块的划分

利用scikit-learn软件包实现了SVM算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#-*- coding: utf-8 -*-
### Support Vector Machine for Handwritten Digit Recognition

import csv
import numpy as np
from sklearn import svm, datasets, cross_validation
from sklearn.grid_search import GridSearchCV
from time import gmtime, strftime

print "1- Start 载入训练数据"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

### Load Training data
trainTargetArray = []
trainDataArray = []
with open('./train.csv', 'r') as trainFile:
trainReader = csv.reader(trainFile, delimiter = ',')
for row in trainReader:
trainTargetArray.append(row[0])
trainDataArray.append(row[1:])

print "1- End 载入训练数据"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "2- Start 删除列头"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

### Delete Column Headers
del trainTargetArray[0]
del trainDataArray[0]
trainData = np.array(trainDataArray)
trainTarget = np.array(trainTargetArray)
trainData = trainData.astype(np.float)/255.0
trainTarget = trainTarget.astype(np.float)

print "2- End 删除列头"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "3-Start 载入测试数据"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
### Load Testing data
testDataArray = []
with open('./test.csv', 'r') as testFile:
testReader = csv.reader(testFile, delimiter = ',')
for row in testReader:
testDataArray.append(row)

print "3- End 载入测试数据"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "4 -Start 删除列头"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
# Delete column Headers
del testDataArray[0]
testData = np.array(testDataArray)
testData = testData.astype(np.float)/255.0

print "4-End 删除列头"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "5-Start 设置分类器并训练模型"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
# Set up classification and fit he model data
svc = svm.SVC(gamma=0.128, C=1)
svc.fit(trainData, trainTarget)

print "5-End 模型训练完成"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "6- Start 利用模型预测测试数据中的手写数字"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
# Predict / Determine Value of New images
prediction = svc.predict(testData)

print "6-End 预测"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())

print "7- Start 保存输出文件"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
# Save output to file
output = open('./output.csv', 'w')
for x, value in np.ndenumerate(prediction):
output.write(str(int(value)))
output.write("\n")
output.close()

print "7- End 结束!"
print strftime("%Y-%m-%d %H:%M:%S", gmtime())
  • 本次SVM的实现是利用了网上比较健全的开源机器学习工具—scikit-learn,Scikit-Learn是基于python的机器学习模块,基于BSD开源许可证。这个项目最早由DavidCournapeau 在2007 年发起的,目前也是由社区自愿者进行维护。
  • scikit-learn的SVM说明,也是我翻译了一篇文章Support Vector Machines-scikielearn-翻译-毕设系列
  • 然后本次的数据是Kaggle上的数字识别的数据Digit RecognizerKaggle是一个数据建模和数据分析竞赛平台。企业和研究者可在其上发布数据,统计学者和数据挖掘专家可在其上进行竞赛以产生最好的模型。这一众包模式依赖于这一事实,即有众多策略可以用于解决几乎所有预测建模的问题,而研究者不可能在一开始就了解什么方法对于特定问题是最为有效的。Kaggle的目标则是试图通过众包的形式来解决这一难题,进而使数据科学成为一场运动。Kaggle的Wiki简介
  • SVM的训练日志:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    log-1

    1- Start Load Training data
    2015-03-09 14:15:33
    1- End Load Training data
    2015-03-09 14:15:37

    2- Start Delete Column Headers
    2015-03-09 14:15:37
    2- End Delete Column Headers
    2015-03-09 14:15:51

    3-Start Load Testing data
    2015-03-09 14:15:51
    3- End Load Testing data
    2015-03-09 14:15:55

    4 -Start Delete column Headers
    2015-03-09 14:15:55
    4-End Delete column Headers
    2015-03-09 14:16:05

    5-Start Set up classification and fit he model data
    2015-03-09 14:16:05
    5-End Set up classification and fit he model data
    2015-03-09 15:40:12

    6- Start Predict / Determine Value of New images
    2015-03-09 15:40:12
    6-End Predict / Determine Value of New images
    2015-03-09 15:57:34

    7- Start Save output to file
    2015-03-09 15:57:34
    7- End Save output to file
    2015-03-09 15:57:34

  • 由日志可以看出,用时最长的是在第5步,有开始到结束共用时1小时10秒。这一步是利用训练数据训练SVM模型,也即是通过支持向量机训练出一个手写数字识别的分类器模型的过程。
  • 第七步是利用生成的模型来对新的数据进行预测,即是对新的手写数字进行识别。用时17分22秒。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
log-2

1- Start 载入训练数据
2015-03-10 02:43:27
1- End 载入训练数据
2015-03-10 02:43:45

2- Start 删除列头
2015-03-10 02:43:45
2- End 删除列头
2015-03-10 02:43:59

3-Start 载入测试数据
2015-03-10 02:43:59
3- End 载入测试数据
2015-03-10 02:44:21

4 -Start 删除列头
2015-03-10 02:44:21
4-End 删除列头
2015-03-10 02:44:30

5-Start 设置分类器并训练模型
2015-03-10 02:44:30
5-End 模型训练完成
2015-03-10 04:04:19

6- Start 利用模型预测测试数据中的手写数字
2015-03-10 04:04:19
6-End 预测
2015-03-10 04:21:18

7- Start 保存输出文件
2015-03-10 04:21:18
7- End 结束!
2015-03-10 04:21:18

  • 第二次训练,模型生成的时间是1小时19分39秒。预测用时16分59秒。

遇到了那些问题?那些问题已经解决了,哪些没有解决?

  • 梳理SVM流程如下
  • 上图中涉及的理论较繁,而且理解难度不小。对于各方面还需要多加理解。

下一步的计划

  • 下一步的计划从以下三个路线出发
    • 手写数字识别这个问题的描述
    • SVM如何应用到手写数字识别
    • pygame实现手写数字识别系统
 评论