第51章 “感知机”的初次实战

业余黑客有个潜规则。

政府机关、金融系统、电子商务……这类网站的后台,是机密重地,通常有高手坐镇,没事最好别去溜达。

被网监或者安全专家盯上,十有八九落不了好。

而个人网站、小型办公网络、学校网站……

这种信息安全不太敏感的,仅仅是浏览或下载一些数据,一般不会有什么大问题。

比如从铁道部官网12306爬点数据,做个辅助订票系统什么的……

但无论任何地方,肆意破坏总是不被允许的,这是底线。

《原始数据表》的奇怪情况,身份证位数不对,侧面支持了这种可能性。

通过黑客手段获取数据,有时候会遇到一些匪夷所思的问题,比如数据格式特殊,下载的数据宽度受限……

有时候,甚至在后台数据库里,只能找到数据的一部分,而其余部分被保存在无法访问的文件里。

写后台程序的人,会基于各种各样的理由,写出可读性极差的代码。

比如:读写效率、数据安全、修补bug、系统健壮……

又或者不想被人继承代码,取代自己的位置,甚至单纯为了个人兴趣、编程风格……

都可能导致这些人,搞出种种令人费解的骚操作。

当然,也可能老高的技术还有缺陷,或者他是从虚拟内存、交换文件里挖掘出来的数据。

也有可能在“作案”过程中被人盯上,不得不提前断开连接……

总之,摆在江寒面前的,就是这么两张各有缺陷的表格,外加一个图片压缩包。

接下来,江寒首先要做的,是从《原始数据表》里,筛选出需要的记录,复制到《报名信息表》里。

这一步非常简单,只要用excel自带的VBScript编写一个小脚本,将两个表格按照姓名匹配,就可以得到每个考生在原始表里的行号。

当然,同名同姓是避免不了的,可能报名信息里一个“张三”,在原始数据里会找到一堆“张三”……这个一会儿再说。

脚本编程非常简单,江寒只用了二十分钟,就写完程序并调试无误。

按了一下预设的快捷键,脚本开始执行。

一边是3万多行的考生姓名,一边是10万多行的原始数据,脚本足足跑了八分钟,才得到了一个映射关系表。

接下来,是第二个脚本,参照映射关系表,将原始数据文件筛选出需要保留的行,其他行全都删除,然后按照《报名信息表》的序号,重新进行排序,得到临时文件1。

这个临时文件的行数,要比报名表多出几千行,这是因为江寒对重名进行了处理,将重名的人都编上了相同的二级序号。

接下来处理重名。

经过一番分析,江寒发现,原始数据表和报名信息表里的数据,排列顺序是有规律的。

其以地区为主关键字,所在学校为次要关键字,而所在班级则是第三关键字排序。

也就是说,一个学校里,一个班级的人,都挨在一起,学校、地区之间也没有混乱。

这样就好办了。

由于临时文件已经按序号排列,重名的人拥有同样的二级序号,自然就聚拢在了一起。

这时,只要看一下这些人的所在地区和学校,就能轻松分辨出哪些是多余的,那个才是真正对应于《报名信息表》的。

如果一个班级也有同名,就只能具体情况具体分析了,实在确定不了的,就先记下来,放在一边,以后再说。

一番整理后,临时文件1已经十分接近高老师希望得到的《报名信息表》。

联系电话、家庭住址,毕业学校、班级、民族、年龄、出生年月日都有了。

接下来是重头戏,通过照片判断每个学生的性别。

幸运的是,虽然《原始数据表》里的身份证号,残缺不全,导致性别信息不可用,可是《报名信息表》里还有部分残余的性别数据。

这就给江寒减少了许多负担。

接下来,先将照片.rar解压,然后观察了一下。

三万多张照片,按学校、班级分类,放入几千个文件夹中。

每个文件的大小,都在10KB至30KB之间。

像素只有210*120,不算特别清晰,但看清面部特征,还是没什么问题的。

其中,同班级里重名的情况,都在姓名后标记着数字1、2……

江寒猜想,这可能是输入报名表的顺序。

接下来要做的,就是在临时文件1里,找到每张照片对应的人。

这很简单,照片的文件名就是姓名,轻松就能和表格里的名字对上。

在解决了数量不算很多的同班重名问题后,就生成了一个照片索引,将每一张照片和报名序号一一对应上了。

然后,是判断性别,填入新《报名信息表》对应的单元格里。

这一步,按照高老师的想法,就是一个笨功夫,用眼睛去看,然后一个一个敲进去。

这十分麻烦,而且太没效率。

江寒希望能找个轻巧的办法,能更快、更好的完成这一步。

那么,这样的办法真的有吗?

是的。

江寒毕竟搞过机器学习,编程思维有点不一样。

高老师那样的普通程序员,也能做到刚才那些步骤。

但江寒接下来的操作,就是他的思维盲区了。

机器学习里,有多种算法,都可以辅助完成这样的任务。

其中江寒最擅长的,自然是人工神经网络。

人工神经网络也分为好多种类。

比如CNN,也就是卷积神经网络,是最擅长图形识别的;

而RNN,也就是循环神经网络,比较适合语音识别、自然语言理解……

如果采用人工神经网络,哪怕不出动CNN,只用多层神经网络,也就是所谓的“深度学习”,也可以非常完美地解决这个问题。

但江寒琢磨了一下,还是放弃了这个想法。

一旦泄露出去,他很可能会有麻烦。

因为这些技术的来源,他根本没法解释。

技术跨度太大了。

好吧,安全第一,先用“感知机”凑合一下。

哪怕准确率低点,也无所谓了。

江寒现在唯一可以拿出来的,就是“单层感知机”。

这种技术只能解决二分类问题,并且还要求线性可分。

好在当前所面临的问题,这两个要求正好都符合。

江寒重生前,做过一个实验,用“单层感知机”识别手写数字,应用场景与现在差不多。

效果也还过得去。

所以,看照片识别男女的任务,完全可以使用“单层感知机”解决。

说起来,这可能是神经网络技术,在这个世界的第一次实战?

江寒前几天写的论文里,就有“单层感知机”的代码,稍微改动了一下,就能用上了。

研究机器学习,首选语言是Python,语法简单,开发效率高,不容易出错,也不用关心底层如何实现。

不过,这篇论文的代码,实在太简单,用什么都一样。

所以,江寒使用了最熟悉的C++。

代码略……

(PS:绝对不是空白太小写不下。)