您当前位置:首页  >  都市言情

重生学神有系统

时间:2023-05-21  来源:  作者:一碗酸梅汤

    不一定。

    硬盘格式化,就安全了吗

    也难说。

    那么,重新分区呢

    很遗憾,只要有心,还是可以复原的,否则也不会有“x照门”了……

    那么,反复用垃圾数据涂抹、覆盖原始文件,这总行了吧

    理论上是可以的。

    不过,你得熟悉计算机存储系统的工作机制。

    对于不同类型,和不同介质的存储设备,要采取针对性的策略,才能彻底销毁数据。

    比如支持并开启trim的ssd,也就是固态硬盘。

    写入数据时,由芯片控制,数据均匀分布在每个区块里,以保证均衡使用全部的存储颗粒。

    系统在删除数据时,并不会向硬盘发出删除指令,只使用volume bitmap来记录被“删除”的信息所在的位置。

    而每次更新文件数据时,也会尽量写入新块,并把原本占用的区块,标记为“无效”。

    这样一来,实际上,被删除或顶替的数据,在物理上仍然存在。

    当且仅当所有空闲区块都占满时,才会在写入数据时,使用被标记为“无效”或“删除”的区块。

    也就是说,没有方法能够可靠地删除整个ssd上的内容,或者存放在ssd或者u盘上的特定文件。

    靠文件粉碎机制都很难彻底消除痕迹,就算格式化后,用垃圾数据把盘写满,也并不能万无一失。

    有些数据恢复高手,会有许多让你瞠目结舌的操作。

    可惜的是,高老师的这个u盘,可能只是一份拷贝,并不是原始数据盘。

    这样一来,数据还原软件也无能为力。

    经过一番研究,江寒发现,并没什么投机取巧的可能。

    也就是说,只能按照原定计划,重建信息表。

    高老师提供的《报名信息表》残缺不全。

    只有不到30%的行,还保留着性别、民族等寥寥几列。

    剩下的70%,除了姓名和序号,什么都没有了。

    住址、联系人、联系电话等等,一点也没剩下。

    至于《原始信息表》,的确如老高所说,除了身份证号缺了几位,其他数据都正常。

    那么,这种现象是怎么造成的呢

    江寒有个初步的猜想。

    &n




第52章 “感知机”的初次实战
    业余黑客有个潜规则。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    接下来处理重名。

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

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

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

    这样就好办了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



第53章 大功告成
    不过,在跑代码之前,还要对数据进行预处理。

    江寒先从报名信息表中,将性别信息仍然“健在”的行挑出来,只保留序号、姓名和性别,另存为label.xls。

    这些记录一共9527条,大约占三万多条数据总数的30%。

    它们对应着9527张真彩色照片。

    24位真彩色的图片,每个像素点在内存里,要占用3个字节的存储单元。

    每张照片有210x120个像素,这样读入一张照片,需要的内存空间就是210x120x3=75600个byte。

    9527条数据,共需要9527x75600=720241200b≈686.88m≈0.7g!

    这个内存开销,还是比较容易接受的。

    但是,“感知机”的算法,需要进行大量浮点乘法运算。

    对每个像素的每个rgb分量都算一遍

    没那个必要,也太浪费时间。

    所以,聪明的做法,是先把照片数据“压缩”一下。

    江寒给“感知机”的代码,添加了一个loaddata函数,用来读取和处理照片数据。

    在这个函数里,先定义一个二维的整形数组feature。

    然后从label.xls中读出序号、姓名信息,按照刚才建立的索引表,找到对应的照片文件。

    下一步,将照片读取到内存中,读取的同时,将每个像素二值化。

    具体做法是:色彩浓度在阈值以上的像素,取值为1,低于阈值就让它为0。

    这样一来,原本的真彩色照片,就被转换成了黑白轮廓图。

    然后,再将轮廓图中的0或者1的取值,按照从左到右、从上到下的顺序,重新编排成一行数据,存放到数组feature中。

    feature中的每一行,都存储了一张照片的二值化信息。

    一共9027张照片,就需要9027行。

    全部照片处理完毕后,就得到了一个巨大的二维数组feature。

    它有25200列、9027行!

    接下来,定义一个拥有9027个整形元素的一维数组label。

    从label.xls中读入性别信息,男生设为1,女生设为0,存放在数组label中。

    feature加上对应的label,就构成了训练数据集。

    训练“感知机”时,将一行行feature代入公式中,进行加权和运算,其结果再通过sign函数,转换为0或1,然后和对应的label值对照。

    如果不相符,就调整权重和偏置,然后重新计算。

    当每一个feature代入公式后,都能计算出正确的label时,就得到了一组权重和偏置。

    也就是说,构建出了一个可用的数学模型。

    依据这个模型,计算机就可以读入任何一张同尺寸、类型的照片,对其二值化的数据代入模型中运算,并根据运算结果判断分类归属。

    这就是典型的机器学习过程,计算机从数据中自己“学”到了某种规律。

    即使这种规律,人类并不一定完全理解,也不见得能用数学语言解释清楚……

    剩下的就比较简单了。

    接下来,江寒又添加了几个函数,用来输出运算结果、观察运行情况等。

    最后,从头调试了一遍,确认没啥bug后,将代码重新编译,然后运行了起来。

    屏幕上有一些数字,表示当前正在处理的数据,和训练进度的百分比。

    十分钟后,后一个数字才刚刚达到1.3%。

    这表示,完整训练一遍,大约需要13个小时……

    之所以这么慢,主要是江寒的程序,比较追求稳定性,以及调试的方便、快捷,并没特别讲究执行效率。

    当然,即使他用心优化,估计也需要8个小时以上,才能完成训练。

    虽然有点慢,但其实没什么关系,训练过程并不需要人工干预,挂机等着就行。

    第二天早晨,江寒起床后,先看了下训练进度,还差了大约13%才能完成,就先去班级上课。

    中午吃完饭回来,训练终于结束了。

    而存放权重和偏置参数的weight数组,也以内存映像的方式,保存在了一个二进制文件中。

    接下来就简单了。

    重建一个一模一样的感知机模型,加载上这个权重文件,就可以用它来判断剩余照片的性别了。

    江寒重新改写代码,然后运行。

    这次十分迅速,只用了不到20分钟,就将两万一千来张照片,全部处理完毕。

    这就是“感知机”,或者说“人工神经网络”的特点。

    训练起来特别耗时,一旦训练完成,工作起来非常快捷。

    至于正确率,江寒初步估计,大大超过99%,21000条未经训练的数据里,判断出错的,绝不超过10人。

    比人类肉眼的识别率低不到哪里去。

    事实上,“感知机”或者说“人工神经网络”的错误率,跟训练数据、测试数据的质量有很大关系。

    如果比较规范,达到100%的识别率都不算稀奇。
1...1920212223...197
猜你喜欢