毕业设计

毕业设计 · 圈子

5551 位酷友已加入

本圈子收集理工类毕业设计与毕业论文,本科、硕士、博士各阶段的都可以,上传时请尽量注明毕设的概述信息~加入圈子可以上传、下载资料,也可以使用提问来寻求资料或分享你认为有价值的站外链接~

关注推荐最新

热门标签

资源

[Java、Python 课程设计]基于人脸识别的员工考勤系统

[Java、Python 课程设计]基于人脸识别的员工考勤系统 目录 一、 需求分析 1. 产品描述 2. 产品需求分析 3. 产品预期目标 二、 总体设计 1. 基本思路 2. 遇到的问题与解决方案 3. 完整设计过程. 4. 流程图 三、 程序详细设计 1. 编写及测试环境 2. 程序依赖库 3. 调用函数清单 4. 函数调用关系 四、 程序运行结果测试与分析 1. 第一版程序(无 GUI 界面)展示 2. 第二版程序展示 五、 结论与心得 六、 程序源码及参考文献 1. 程序源码 2. 参考文献及资料 一、 需求分析 1. 产品描述 员工刷脸考勤系统。需要使用 Python 作为程序开发语言,能够通过摄像头添加员工信息并通过摄像头识别员工。另外拓展要求是能够导出每日考勤表。 2. 产品需求分析 程序要求使用 Python 作为编程语言,作为目前行业最流行的编程语言,使用 Python能够大大提高代码的可读性,提高编写效率,对于这种比较小的程序来说能够缩短开发周期。另外通过使用摄像头添加和识别员工,这就要求不能使用静态图片来添加信息而应该是实时监测,实时执行的系统。最后,扩展要求需要导出每日考勤表。这就需要程序具有读写表格的功能以及类似数据库的存储能力。 3. 产品预期目标 第一代版本应该具备调用摄像头实时监测人脸的能力,并且在用户的确认下能够自动为员工注册或签到,在后台数据库更新员工的签到状态,并能够手动或自动的导出考勤表。 第二代版本可以添加GUI界面使程序更易用,美观,降低学习成本和使用的复杂性。 二、 总体设计 基本思路 根据给出的要求,各个击破。首先要求使用摄像头收集信息,那么我们就使用OpenCV模块,利用该模块优秀的兼容性,我们能够通过函数调用任何笔记本的基础摄像设备从而提供视频流的输入。之后,我们考虑在人脸识别方面使用dlib库作为我们的基础识别工具,用于在摄像头开启的状态下对每一帧实时的检测人脸,得益于它的轻量化与易用性,这一项功能对系统的计算能力要求不高,可以应用于普通的嵌入式设备中。 关于接下来的员工注册环节,考虑到需要使用数据库或类似数据库的工具来保存员工信息,所以我们打算使用云端服务进行人脸的比对和数据库的建立。毕竟,如果数据库保存在本地有被篡改的风险,并且容量也是不容忽视的一点,经过多次比对,我们使用百度 AI 开放平台作为我们实现人脸比对+数据库功能的平台。云端加持,我们能够节省很多存储空间和运算能力,更加适合轻量化的设备。 遇到的问题与解决方案 a) 最初遇到的问题就是学习百度AI开放平台。我们最初担心学习成本比较高。但是在耐心阅读了相关开发文档后,我们发现百度人脸识别的接口简单易用,非常方便。另外,这个发开文档对于我们之后遇到的一系列疑问起到了很好的指导作用。 b) 第一个问题就是我们在测试百度 AI 平台人脸识别功能的时候,一直无法识别人脸图像。平台要求传入的图像必须是以 BASE64字符串或 URL 字符串或FACE_TOKEN 字符串的方式上传。我们选择了最普通的 BASE64 方式上传,但是传回的信息是:‘error_code:222203 image check fail’,在网上查找解决方案才了解到,我们使用的本地编码器得到的字符串不是 utf-8格式,云端无法扫描,于是我们添加了格式转换。问题解决。 c) 通过调用 dlib 库能够很好的实时监测人脸,起初我们打算在用户确认签到时将整个图像帧保存并上传,但是我们调用的云端功能只能识别一个人脸并与数据库比对,另外有一个多重比对的功能似乎并不能满足我们的需求,于是我们期望能够将确认的图像帧中所有的人头区域截取出来然后再依次上传。经过查阅,我们最后依据识别人脸提供的边框参数对图像进行裁剪然后记录下人脸数之后依次上传。并依次接收检测的参数。 d) 在后期想要加入 GUI 界面的时候我们使用的是 wxPython库,在网络上查看相关的设计代码的时候发现有的使用了类结构,有的直接上函数然后在主函数里画程序框,我们一开始不想封装成类,因为参数的修改工程浩大,但是在试验了后者(不使用类)的方法之后,我们发现不使用类无法满足设计要求,最后只能作罢。 e) GUI 界面制作好之后,我们开启摄像头的界面与主程序界面不是同一个,是另外弹出的。在指导老师的要求下,我们需要把图像嵌入在程序框中。这怎么嵌啊?搜索可行的方案之后才了解到,可以利用 OpenCV 在接受图片之后直接在程序框内画图像。多了这么一个过程,帧率比之前有所下降。 f) 在最后的程序优化中,有一处异常。在开启摄像头之前点击关闭摄像头会提示变量未定义,即抛出异常 AttributeError。这是因为类中的 camera 参数还没有被创建。那么我在这里就加了一个异常处理来规避这个问题。 g) 我们通过使用 os 库来获取文件的绝对路径,但是得到的字符串路径实际上是该文件所在文件夹的路径,要想对这个文件进行操作,仍需要手动在该路径后面添加文件名。 h) 如果人脸在程序中只有一半,但是用户仍然点击了注册,那么程序会报错。因为裁剪程序获取了推测的人脸边框数据,但是在裁剪的时候超出了边界,抛出异常 IndexError。为了处理这个异常,在检测到程序抛出 IndexError 异常后提示用户不要半张脸注册签到。 完整设计过程 首先拿到题之后我们根据前问所述的基本思路开始寻找能够使用的模块并依次对每一个模块进行测试,确保模块能够单独运行。首先考虑摄像头的问题,配置好 OpenCV 之后,测试了调用摄像头的代码,能够完美运行。 之后,开始测试百度 AI 开放平台提供的人脸识别接口。根据开发文档的指导,配置好了 baiduAPI 基础库,研究具体接口的用法。我们先在云端创建了一个人脸用户组,并且上传了一张我本人的照片作为测试。然后通过程序向云端发送另一张我的照片,在经历了上述的错误以及排错过程后,终于传回了SUCCESS 的信息。有趣的是,云端传回的处理结果是一个非常长的字典和列表多层嵌套的结构,我又专门复习了一遍字典的相关概念以及从这种结构中提取到想要的信息。最终我们提取的信息就是,识别状态,识别的人脸对应的名称。值得注意的是,员工在云端的人脸库注册的 ID 必须和本人姓名一致,否则在写入表格环节无法认证并修改签到状态。不过这是后话了。 接下来开始测试 dlib 库的人脸识别和人脸截取模块。网络上有一个可以参考的实时检测程序,他的代码很有借鉴意义,我简化了他的程序,仅仅是实时在画面中用方框标出人脸即可,这样既可以让用户很直观的看到程序识别出了人脸,而且简化了计算过程加快了。切割的代码是利用了dlib识别的时候返回的人脸的基本参数,然后利用 OpenCV 进行裁剪。测试的时候是输出到指定的目录。经测试,在单独运行之后能够在指定目录找到单独的人脸图像。 我们在这个时候打算先不做数据库及图表写入的模块,因为上述这些已经测试的模块,把它们整合起来的代码量已经不短了。于是,我们开始整合模块,写函数。 整个过程并不难,就是一些逻辑关系的判断和特定时候的调用。尤其需要注意的是部分语句的顺序,比如摄像头的开启和释放。 在完成之后就开始调试表格写入的功能了。在查阅了网上相关的 Python 操作Excel 表格的库,最终使用了 xlrd,xlwt,配合来读写 Excel 表格。首先在初始化程序的时候就联络云端数据库获取人脸库的 ID 列表然后创建表格并写入 ID。之后在每次注册成功之后,也就是云端传回 SUCCESS 的消息之后就在表格对应的 ID 后写入 Registered 以及从系统获取的当前时间。 这样,整个程序的所有模块就都已经整合了。开始添加一些优化的代码,添加了网络检查工具,因为整个程序必须需要网络环境,否则会报错。然后为了兼容所有设备,写了一个创建目录的函数,用于缓存图片文件和存储历史考勤日志,这个目录创建函数被作为初始化函数在程序打开时即运行并创建缓存目录。另外,我们还完善了员工的注册功能,如果有图像传到云端并识别失败,那么会展示为识别出人的头像,然后询问用户是否注册,如果用户注册,那么在用户输入这个人的姓名之后,自动上传图像为其注册。如果用户不注册,那么就将该图片上传至 guest 人脸图像组,ID 命名为检测时间。 这些全部做完之后,因为没有做 GUI 界面,所以还不太放心,于是开始在网上寻找 Python 相关的 GUI 模块。最终选定用 wxPython 模块制作图形界面。我们在网上找到了两种方法,一个是需要编写类的,这个类也是必须按照这个模块的格式来写,另一个就是不用编写类,直接在主函数里面画框。因为时间不多,我们选择了不使用类,因为如果用类的话,类内部的参数需要修改的地方太多了,直接编写更快一些,但是限制也颇多。向图形界面中融合了已经编写的内容之后,程序大体就完成了。 然后迎接老师的检查。最终老师给出的改进意见是把指令从图像上拿出来。原本在没有图形界面之前,我们的指令是嵌在摄像头的画面上的,为了融合图形界面,我们也就没有更改。另外一点,我们的图形界面点 open camera 的时候,摄像头程序框是单独再弹出来一个的,老师要求我们把这个摄像头框嵌入在程序里,不要再多弹出一个。根据老师的要求,我们具体做了如下的更改: a) 移除图像上的所有命令,把这些命令都转化为程序框中的按键。这可就有点麻烦了,因为我们没有用类,写按钮很麻烦。所以我们干脆一不做二不休,就使用了类。重新修改了所有参数,新写了一个类,在类中添加按钮方便多了。于是乎,我们把摄像头的开启,关闭,签到,注册以及使用说明都添加到了程序中。 b) 把视频流嵌入到程序中这个要求,经过网上的搜索,我们了解到,这个过程实际上是用 OpenCV 把获取的图像在程序框中一帧一帧的画一遍。经过一番研究之后终于在我们的程序上实现了这个功能。 c) 修补了程序中的一些逻辑漏洞。比如在没开摄像头的时候点关闭摄像头会提示,开启摄像头之后再点开启会提示。这里面的原理最开始是用简单的判断isOpend这样的函数返回值来确定是否开启或者关闭,但是后面就有一种情况发生,就是在没有打开摄像头的时候,这个类内部的camera变量还没定义,会有异常报出,提示变量未定义。于是我就在isOpend这个函数外面加上了异常处理,如果有未定义异常同样提示未开启,就完美解决了。 以上,便是我们程序设计的完整过程。 流程图 三、 程序详细设计 编写及测试环境 操作系统:macOS Mojave 10.14.6 IDE:PyCharm Professional 2019.01 Python 3.7 程序依赖库 除了注释标注的部分外,其余 import 的依赖库均是其本名,可以直接从 PyCharm 的集合库中搜索安装。 调用函数清单 (类)外部调用函数: 类内部调用函数: 函数调用关系 文字描述:以最后一个版本的代码为例。整个程序的基础就是 wx 模块框架。首先初始化运行类mainApp 然后调用该类的唯一函数 OnInit(self)运行 wx frame 基类(class face_emotion)执行__init__画出一个程序框和基础的按键布局。执行initialize(client)创建表格,执行 clear_images(path_save,path_cache)清除缓存路径下的文件方便进一步操作。然后等待用户操作。”Open Camera”执行learning_face(self, event),该函数创建多线程任务并开始执行_learning_face(self,event)开始主程序阶段。执行 makedir()创建基础路径,紧接着执行核心函数live_came_detect(separate_path, cache_path, self.userlist, self)开启摄像头并等待进一步操作。用户按下 confirm 键,开始执行 confirm_face(self, event)为其进行签到或注册,首先是face_separate(cc_path, sep_path, detector)函数,分割人脸图像,然后执行 face_recognize(client, read_path)进行识别签到,如果数据库中没有此人,则提示是否注册,如果是,调用 show_img(path)显示陌生人的头像,请求用户输入人命。然后开始运行 face_register(client,read_path,group_id,usr_name)进行注册。点击close camera 按钮执行close_face(self, event)关闭摄像头。点击 View Log 执行view_log(self, event)打开当前状态的考勤表。点击 about us 执行 about_us(self,event)弹出简介消息框。 四、 程序运行结果测试与分析 第一版程序(无 GUI 界面)展示 程序开启,左侧为控制台输出信息 根据提示,点击 C 键确认签到,注意左侧的输出信息(我是 bruce)提示签到成功 换了一个没有录入的信息的同学,检测到没有匹配的图像(留意输出信息) 给出照片图像并询问姓名 注册成功 程序结束后,自动弹出该日考勤表 第二版程序展示 五、 结论与心得 首先拿到这道题之后,基本的思路就已经想到了。因为面部识别比对在我的印象里可能需要一定的计算量,所以我一开始就打算用云端的服务实现这个功能。不过后来在学习了 dlib 的相关用法之后发现,计算量似乎也并没有那么大,其他的一些思路都是在一边编写程序的时候,一边继续扩展想法的。距离上一个学期学 Python 已经过了三个多月,一些东西或许会忘记,但是当我真正开始写代码的时候,开始在网上查阅开发文档的时候,当时学的记的内容就都想起来了。 经过本次课程设计,我对 Python 的编程技能又重新巩固加强了。在这个过程中,我逐渐认识到,软件编写的过程中,强调的是逻辑的连贯性和程序的模块化。逻辑的连贯性指的就是在编写的过程中,要对整个程序的整体架构有所了解,这样对于我们这次这样走一步想一步的方法非常有好处,因为当我们走完一步之后,下一个方向自然就会在脑中呈现,一些复杂的逻辑实现起来,也并不绕。而对于程序的模块化的理解,则是在比较中产生的。另外一个朋友也做课设,但是很多都是直接借鉴了网上的整套体系或 者方法,首先第一点就是很难吃透或是跟上它的逻辑,另外一点就是调试的时候,不能分开分段调试,造成工作量巨大。如果我们能够逻辑清晰的把每个模块都分开进行测试的话,会节省很多调试的思考量和时间。 关于在调试的是过程中发现的一些问题,一部分我在之前的部分也有所提及。比如超过列表界限的这个异常,最开始并不知道什么原因。因为当时我们只是偶然的发现会报出 IndexError 的异常,经过定位之后,确认报错的代码是在截取人脸部分的,再进一步理解这个异常的触发因素,最终确定是在截取的时候超过了图片的下表界限。那么能导致这个因素的,也就只有半张脸在图像内会导致了。这是一个很典型的调试纠错过程,本次课程设计我们也有多次这样的排错经历,更加丰富了我们的调试经验。 不难发现,我在本次课程设计中承担的是主要的程序编写工作:)收获当然是要比做实验要更多,让我更加熟悉在这个领域一些基础的编程思想和方法,比如关于考勤系统的编程逻辑,关于人脸识别的基础的原理算法和应用方法。通过网上查阅别人的经验或是第三方组织的开发文档对于解决问题十分有效,因为首先别人的经验都是前人踩过的坑,有助于少走弯路。第三方的开发文档在使用他们写的工具的时候能够帮助你快速定位出错部位的具体功能和调用关系,这样不仅能够解决问题,还能同时掌握这一块工具的具体使用,对于后面的程序或是日后再使用大有益。 因为时间关系,我们在最后做 GUI 界面的时候,一些美化的元素可能并不是太好,没有来得及改进。另外,在完成了老师提出的要求后,其实还有一些瑕疵,比如我们的确是把视频流嵌入到了程序框中,但是程序框的大小和视频流的分辨率不匹配,所以每次开启摄像头的时候,程序框的大小都会变化,从原始大小扩大到摄像头视频的分辨率大小。这一点值得进一步研究改进。还有关于考勤表的机制,我们就是直接利用了读写Excel 表格的想法,我们可以把表格也嵌入到程序框中,随时调用查看,随时关闭,压缩内存成本,这也是一点还未完成的地方。我想在这个方面使用 Java 或许会更轻松一些。当然还有其他很多功能的扩展功能。 六、 程序源码及参考文献 程序源码 该程序现已开源,可自行阅览:https://github.com/BrucePoki/Attendance-system 参考文献及资料 [1]. Davis E. King. Dlib-ml: A Machine Learning Toolkit[J]. Journal of Machine Learning Research 10, pp. 1755-1758, 2009 [2]. Noel Rappin, Robin Dunn. wxPython in action[M]. British: Manning Publications, 2006:1-552. [3]. coneypo.Python3 利用 Dlib 实现摄像头实时人脸检测和平铺显示,2019-1-24. [4]. conetypo.Python3 利用 Dlib 实现人脸检测和剪切,2018-1-24. [5]. monster_ygs.Python 创建目录文件夹,2017-3-18. [6]. 仿佛泣雪如画.如何在 Python 中创建 Excel 表格,2018-7-31. [7]. yanyingli.python 中的 wx 模块,2019-2-1. [8]. Baidu.百度人脸识别 Python SDK 文档,2019. [9]. zhuzaiming2004.将 opencv 的视屏流嵌入 wxpython 的框架中,2018-11-12. [10].inspurer.WorkAttendanceSystem,System,2018-9. 转载自https://github.com/BrucePoki/Attendance-system

资源

【毕业设计】基于监督学习的web入侵检测系统

算法描述 使用算法:SVM支持向量机 在样本数量过万的时候发现knn很吃力 但是在训练样本较少条件下KNN可以将精度提升到百分之百。 数据描述 使用了一千多条SQL注入样本 转载自:https://github.com/3riccc/graduation_design/blob/master/README.md

资源

BIM建筑模型图

BIM建筑模型图,包括建筑信息和材料信息

资源

【毕业设计】基于深度学习的甲状腺超声图像良恶性诊断算法研究

基于深度学习的甲状腺超声图像良恶性诊断算法研究 一、引言 1. 甲状腺超声图像自动良恶性诊断及其意义 超声图像 目前,在检测甲状腺结节中,超声成像(sonography)是最常用的方法。颈部的多数结构,包括甲状腺在内,都可以在高频超声波下很好地的显示出组织细节。医学超声成像主要是使用探头发射远超人耳可识别范围的超声波,捕捉经人体组织反射的回声,并形成图像。 医学超声成像的优势主要在于其成像的即时性,低成本,以及没有明显长期副作用。由于超声成像可以细致地显示脏器的结构,其已经成为甲状腺结节良恶性检测最不可替代的成像手段。 自动诊断 绝大多数检测出的甲状腺结节都是良性的。传统上,良恶性的分析往往依赖于医生的个人经验,这对医生是一个很大的考验。目前的良恶性分析标准尚不健全,不同回声模式也限制了医疗人员的判断能力。除此之外,逐渐发展的成像手段使得检测出的甲状腺结节日益增多,这也增加了医生的工作量。如此,一个可以基于甲状腺超声图像自动地进行良恶性分析的系统将能够将医生从这一繁重的工作中解放出来,为医生提供客观、可靠的诊疗意见,并降低误诊率。该系统还可以缓解患者的不确定情绪,避免不必要的医学影像测试。 2. 深度学习在甲状腺超声图像良恶性诊断中的应用 深度学习及其在医疗领域的应用概览 深度学习(deep learning)是目前机器学习中较为前沿的研究领域。在进行传统的机器学习时,往往需要人类设计并提供用以描述样本的特征。而深度学习则无需人类提供特征,可以自发地学习出适合问题的特征。 深度神经网络(deep neural network)以人工神经网络为基础,发展出了深度神经网络,卷积神经网络,递归神经网络等一系列框架,在图像、音频、自然语言等的处理中取得了广泛的应用。特别地,通过结合现代的成像技术,深度神经网络在医疗领域亦屡建殊勋。其中,较为显著的是卷积神经网络。 卷积神经网络(convolutional neural network)一般由多个卷积层组成,亦可包含一至多个全连接层。这样的结构使其可以充分利用数据的二维结构。因此,卷积神经网络尤其适合对图像的处理。目前,卷积神经网络在对医学图像的分割,目标的检测和分类中都发挥着重要的作用。 本文的实现思路 本文着眼于讨论现有的不同卷积神经网络架构对甲状腺超声图像分类这一任务的效果,同时考虑几种可能的图像增强方法,包括现有的方法和新提出的方法,并对它们进行比较和总结。 在神经网络架构上,考虑非深度的普通机器学习算法、普通的卷积神经网络、微调的GoogLeNet。图像增强方法上,首先对原始图像进行传统的图像增强,包括提取裁切、平滑、对比度提升等。之后再使用卷积神经网络或生成对抗网络生成新的示例。 二、理论部分 1. 数据集 本文使用数据集是由国际光学工程学会(Society of Photo-Optical Instrumentation Engineers)提供的一个开源的甲状腺超声图像数据集。该数据集包含480张甲状腺超声图像,分属390个个体,其中良性样本61个,恶性样本288个。除去无效的数据后,共有349张图像,分属298个个体。每个样例包含一张超声图像和以个可扩展标记语言格式的描述文件。描述文件包含样例的编号、年龄、性别、结节成分、回声反射性、边缘状况、有无钙化、TI-RADS评分等信息。其中决定了样例良恶性的信息是TI-RADS评分。 甲状腺影像报告和数据系统(Thyroid Imaging Reporting and Data System, TI-RADS)是一个评分的分类系统,旨在通过超声图像分析确定甲状腺结节为恶性肿瘤的风险。在TI-RADS系统中,1代表正常的甲状腺,2代表出现典型的良性特征,3代表无可疑的特征,4代表开始出现可疑的特征,包括不规则边缘、低回声反射性(反映在图像则为低亮度)、高度大于宽度、钙化。4A表示出现一个可疑特征,4B表示出现两个,4C表示出现3或4个。5代表出现了全部5个可疑特征。TI-RADS评分在2和3的甲状腺超声图像,在病理学报告中证实为恶性的概率分别为0.9%和2.9%。因此,本文中,以下凡言及甲状腺超声图像的真实值为“良性”,指的便是TI-RADS的评分在2,3当中。 2. 工作站环境 下记实验均在笔者的Dell Inspiron 15-7560移动计算机上实施,其装载有Intel (R) Core i5-7500低电压双核CPU,8192MB随机存储,NVIDIA GeForce 940MX显卡,6055MB独立显存,搭载了64位Microsoft Windows 10 Edu N操作系统。这里采用的机器学习框架是Tensorflow。Tensorflow是目前使用最广泛的机器学习框架之一,使用它可以方便地构建深度神经网络。它提供面向Python的高级编程结构,也提供面向C++,Java等其他语言的底层接口,应用十分灵活。实验所用的Tensorflow版本是带有GPU加速的1.13.1,使用的Python版本是3.7.3。截至本文成稿时,所使用的均为最新的稳定发布。 3. 预处理 原始数据是由480张560 $\times$ 360 的24位(3通道 $\times$ 8位)图像组成。每张图像除中央的超声图像外,还有大块黑色背景。左右两侧和右下角还有一些图像采集使用的标记。理论上,若这些背景和标记的分布是不受超声图像特征影响的,卷积神经网络应当可以“学习”到这些背景和标记对分类结果的作用很小。这里,为了排除不必要的干扰,先对图像做一步预处理,提取感兴趣区域。 预处理的第一步是裁切,将图像的四个边缘都裁去一定的宽度。接着是对图像进行灰度化得到单通道的图像,再对该图像进行高斯平滑。然后,再对平滑后的图像进行二值化。二值化后再取图像中的最大联通区域。原图像中对应的该区域即为感兴趣区域。如此得到的图像经过尺寸调整便可作为网络的输入了。最终输出的图像大小统一调整为128 $\times$ 128的3通道图像,保留了原始数据的色彩特征。同时,128$\times$128的尺寸减少了运算量,也有利于之后在对抗生成网络中进行上采样。 此外,还从数据集中随机取出了30个示例作为测试样例。 4. 传统机器学习:非卷积神经网络 在引入卷积神经网络之前,可以先尝试使用传统机器学习方法对甲状腺超声图像进行分类。 5. 神经网络:简单的卷积神经网络 这里使用的神经网络结构共四个卷积层,每一层使用尺寸为3$\times$3的卷积核,线性整流激活函数。每两层之后进行一次最大池化,随之再进行一次随机失活,目的是防止过拟合。之后是两个全连接层,第一层采用线性整流激活函数,最后一层暨输出层采用指数归一化激活,有两个输出。这里的损失函数采用的是多分类的交叉熵函数。这样处理,主要是考虑可以进行后续的拓展。特别地,若分类任务不再局限于良恶性分析,而是需要更多的分类标准,那么逻辑回归就不合适了。这样的卷积神经网络可以使用梯度下降法进行训练。 在机器学习框架Tensorflow中,既可以使用高级编程接口快速实现神经网络的结构,也可以借由底层编程接口,对神经网络的结构细节进行把控。这里分别用了两种方法对简单的神经网络进行实现,其结果的比较见下。理论上,两种构建方式的实验结果应当相近。 6. 迁移学习:微调GoogLeNet Inception v3模型 迁移学习(transfer learning)是指将已有问题的解决模型应用在新的相关问题上。目前,在机器学习领域,迁移学习是一个相当热门的方向。而将机器学习应用于医学图像处理也是一个较新的思路。(TN Classification in Ultrasound Images by Fine-Tuning Deep CNN)一文首先提出在针对甲状腺超声图像分类时使用迁移学习。其使用了一个预训练的模型(即GoogLeNet)提取甲状腺超声图像的特征,再基于这些特征进行分类。由于预训练的模型在一个包含很多自然图像的庞大数据集ImageNet上具有良好的效果,可以认为其已经包含许多图像特征提取的知识,因此将其应用到甲状腺超声图像时,可以不用从零开始训练,只需“微调”(fine tuning)某些特定的参数即可。由于许多知识无需再从超声图像数据集中学习,这也缓解了对数据集的依赖。 该文献声称其微调了深度神经网络GoogLeNet。然而,GoogLeNet是一系列使用了类似核心架构(称为Inception结构)的神经网络的统称。谷歌的研究人员在2014年首次提出这样的架构,并于当年取得了ImageNet挑战赛的第一名。如今,Inception经过数个版本的发展,已臻完善。第一个版本Inception v1采用模块结构,提高模型的深度和宽度;第二个版本Inception v2提出了批量正则化(batch normalization);第三个版本Inception v3提出了卷积分解(factorization),将一个二维卷积分解为两个一维卷积;最近的版本Inception v4则结合了残差网络。由于文中没有提到使用的是何版本的GoogLeNet,因此,本文实验时采用了Inception v3的GoogLeNet。 实验时,首先调取在ImageNet上预训练的GoogLeNet网络的权重。去掉顶层的全连接后,加入适宜本问题的分类逻辑,锁定原GoogLeNet的权重后,进行一小段时间的训练。之后再将模型的前段保持锁定,解开模型的后端,使用较小的学习率进行一系列微调。 7. 图像增强:简单的卷积神经网络 图像增强是甲状腺超声图像良恶性自动分析问题的关键。其一,具有良好标记的数据集较小,容易造成过拟合现象;其二,数据集中的图像质量亦参差不齐。(An Image Augmentation Method Using CNN for TN Classification by Transfer Learning)一文中首先提出,除了传统的图像增强方法,还可以使用卷积神经网络进行图像增强。该文献使用的神经网络的输入是两张具有同样标记的样本图像,即6个通道的输入,唯一的隐藏层包含16个通道,输出是一张3通道的“生成图像”。这样的网络理论上可以提取两张图像中的主要特征,生成一张具有这些特征的图像。如果某一类样本的数量为$N$,则理论上可以生成的图像数量为$N^2 - N$。 文献当中针对神经网络的使用很有启发性。然其损失函数的描述似有不妥。其实验结果见下部,关于其可靠性笔者按下不表。其与笔者所做实验结果的可比较性亦存疑。其使用的深度残差网络与迁移学习的方法也与笔者前述出入较大。 8. 图像增强:生成对抗网络 (An Image Augmentation Method Using CNN for TN Classification by Transfer Learning)一文使用了深度神经网络进行图像增强。其在论文末尾提到将来可使用对抗生成网络进行图像增强。笔者针对这一点展开了拓展思考和实验,并对其可行性进行了如下分析。 对抗生成网络(Generative Adversarial Network)是深度学习领域较新的一个方向,是一种无监督的学习方法。生成对抗网络实际上包含两个部分,一是生成模型(Generator),一是判别模型(Discriminator)。生成模型通过学习和模仿输入的特征,对一系列随机噪声进行升维,生成假样本。判别模型则试图对假样本和真样本进行判别。如此,两个模型相互博弈形成均衡。最终使生成模型的输出能够在一定程度上体现原样本的特征。生成对抗网络在深度学习样本增强中已经有了良好的应用,针对甲状腺超声图像良恶性分析的应用尚无。 笔者主要探讨生成对抗网络在甲状腺超声图像增强中应用的可行性。这里使用的生成对抗网络是被称为DC-GAN的深度卷积生成对抗网络,其专门用于生成图像样本。其生成器的输入为长度为100的随机噪声,经过全连接、形状调整后可得到16$\times$16的128通道的图像,三次上采样、卷积、批量正则化、线性整流激活后可以得到一张128$\times$128的64通道图像。最后再经过一次卷积可得到一张和原始输入相同的图像。最后一层输出使用的是双曲正切激活(tanh activation)而不是线性整流激活(ReLu activation),主要原因是双曲正切函数的输出具有一个确定的范围,可以方便地转换为图像地像素值。而线性整流激活函数,及其变体带泄露的线性整流激活函数(leaky ReLu)都不具有这样的性质。判别器的输入为原始图像的大小,经过四次卷积、带泄露的线性整流激活、随机失活、批量正则化、全连接层和逻辑激活后形成一位输出,即对样本真假的判断。 生成模型的主要目的是使判别模型识别其生成的模型为真。因此其损失函数为判别模型的输出与全真向量的二值交叉熵。判别模型的主要目的有二,其一是将真样本识别为真,另一是判断假样本为假,因此其损失函数是真样本的输出与全真向量的二值交叉熵和假样本的输出与全假向量的二值交叉熵之和(或平均值)。训练时,对生成模型和判别模型交叉进行优化。 via:https://github.com/pascalpha/thyroid-classification

资源

酒店社区建筑模型图

花园酒店社区建筑模型图,包括周遭建筑,周围交通线路,景区布局,动线规划。

资源

【毕业设计】基于Docker的分布式应用控制系统

研究目的 环境搭建与部署是产品实际开发过程中的第一步,其操作过程极易产生错误,如:在若干不同版本操作系统、不同配置的机器上搭建无差异化开发,测试环境难度高;产品研发环境与发布环境往往不同,正式上线通常会出现难以预料的问题,产品发布风险较高。项目扩大的过程中,参与人员流动性较大,每个人都要部署自己的开发环境,着实浪费时间。而且人为操作存在不可避免的失误,改正这些失误需要消耗更多的时间,代价较大,而Docker的出现,则解决了这些让人头疼的问题的。 Docker的所有操作都只能在Linux系统下进行,环境部署发布需要记忆复杂的Linux命令,对于不清楚Docker运行原理的开发和运维需要大量的时间理清其原理,同时,使用起来也非常吃力,如果存在一个Docker可视化管理工具,那就事半功倍了,无需Linux基础,无需记忆复杂的Linux命令,只需简单的鼠标和键盘即可完成一项操作。 研究方法 1.了解Docker相关的基本知识及其基本工作原理和工作流程,在此基础上,熟悉Docker Remote API,根据PHP curl编程实现向Docker Server发送POST/GET/DELETE等请求,从而远程对容器和镜像进行操作。 2、学习类似系统(如shipyard)展现方式和风格,并作出对比,最后制定出适合公司内部最优方案。 3、进行系统总体设计,如整个系统框架结构,开发需要使用的技术。 4、进行系统详细设计,如系统功能模块设计,数据库设计等。 5、根据总体设计和详细设计,实现对应系统功能。 6、系统测试,包括安全测试和功能测试。 研究结论 系统开发完成后还需要进行良好的测试工作才能保证系统在线上正常运行,因此,本文结尾处书写了系统主要功能的测试用例。系统的完成大大减少了运维和开发Docker管理的操作时间,提高了各自的工作效率。 目录 第1章 绪论 1 1.1 选题研究的目的和意义 1 1.2 国内外选题相关研究现状 1 1.3 选题目标 1 1.4 选题实施方案 2 1.5 本章小结 2 第2章 应用控制系统相关技术 3 2.1 系统后台开发技术 3 2.1.1 开源容器引擎Docker 3 2.1.2 Dcoker Remote API 3 2.1.3 CURL编程 4 2.1.4 后台开发框架ThinkPHP 4 2.2 系统前端开发技术 4 2.2.1 前端开发框架Angular 4 2.2.2 前端样式框架Bootstrap 5 2.2.3 前端代码模块化Require 5 2.2.4 前端工程构建工具Gulp 5 2.3 本章小结 5 第3章 应用控制系统需求分析 7 3.1术语约定 7 3.2 需求概述 7 3.3系统业务需求分析 7 3.4系统用户需求分析 7 3.5系统功能需求分析 8 3.5.1 主机管理 8 3.5.2 容器管理 12 3.5.3 镜像管理 16 3.5.4 系统日志 18 3.5.5 用户管理 18 3.6 系统非功能性需求 19 3.7 本章小结 20 第4章 应用控制系统概要设计 21 4.1 系统架构设计 21 4.2 数据库设计 22 4.2.1 数据库环境设计 22 4.2.2 命名规则 22 4.2.3 实体 23 4.2.4 实体之间的关系 24 4.2.5 表设计 25 4.3 本章小结 27 第5章 应用控制系统详细设计与实现 28 5.1 总体设计 28 5.1.1 开发环境 28 5.1.2 系统架构 28 5.2 主机管理详细设计与实现 28 5.2.1 主机管理模块设计 28 5.2.2 创建主机 29 5.2.3 删除主机 31 5.2.4 查询主机 32 5.2.5 创建主机分组 33 5.2.6 删除主机分组 34 5.2.7 查询主机分组 35 5.2.8 更改主机所在分组 36 5.3 容器管理详细设计与实现 37 5.3.1 容器管理模块设计 37 5.3.2 创建容器 38 5.3.3 操作容器 39 5.3.4 查询容器日志 41 5.3.5 查询容器进程 41 5.3.6 查询容器列表 43 5.3.7 查询容器详细信息 44 5.3.8 重命名容器 45 5.4 镜像管理详细设计与实现 46 5.4.1 镜像管理模块设计 46 5.4.2 创建镜像 46 5.4.3 查询镜像 48 5.4.4 删除镜像 49 5.5 系统日志管理详细设计与实现 50 5.5.1 系统日志管理模块设计 50 5.5.2 查询系统日志 50 5.6 用户管理详细设计与实现 51 5.6.1 用户管理模块设计 51 5.6.2 用户登录 52 5.6.3 退出系统 53 5.6.4 获取用户列表 53 5.4 本章小结 54 第6章 应用控制系统测试 55 6.1 测试环境 55 6.2 测试原则 55 6.3 功能性测试 55 6.3.1 主机管理模块 55 6.3.2 容器管理模块 59 6.3.3 镜像管理模块 64 6.3.4 用户管理模块 65 6.3.5 系统日志管理模块 65 6.4 兼容性测试 66 6.5 测试过程中发现的问题总结与分析 67 6.6 本章小结 67 结论 68 致谢 69 转载自:https://github.com/chaishi/DockerVisualization

资源

【毕业设计】在iOS上使用OpenCV实现图片中的文字框选

在iOS上使用OpenCV实现图片中的文字框选 准备工作 首先,需要去OpenCV官网下载iOS的framework,下载好后拖入新建的工程中即可,由于OpenCV库是使用C++编写,所以swift无法直接使用,需要使用OC做桥接,需要使用swift的同学可以看下这篇文章Using OpenCV in an iOS app。 实验流程 根据OpenCV入门笔记(七) 文字区域的提取中提供的思路,我实现了OC版本的代码,通过测试,清晰的文字截图识别没有问题,但是在复杂的拍照场景中几乎无法识别任何内容,例如下图 这张是相机拍摄的屏幕上的文字,有清晰的竖纹及屏幕反光,在该算法下,最终的框选区域是整个图片,无法识别文字区域,说明这个处理流程还是不完善的,我们先来看一下他的处理过程: 将图片转为灰度图 形态学变换的预处理,得到可以查找矩形的图片 查找和筛选文字区域 用绿线画出这些找到的轮廓 根据前面得到的识别结果,我们大致可以猜测问题出在了第二步,由于竖纹影响将全部文字区域连城一片,导致整图被框选。 那么在第二步中都做了哪些操作呢? 实际上上面的流程一共做了4步操作,二值化->膨胀->腐蚀->再膨胀,这个流程对于正常的白底文本截图的识别没有问题,一但图片中出现了噪点,噪点在第一次膨胀的之后被放大,对整个图像产生不可逆的污染,我们先来看一下二值化后的图像 文字还是很清晰的,但是竖纹一样明显,接着第二步膨胀,看下会怎样 一片白,不用往下看了吧。 既然如此,就需要我们修改一下在第二步的处理流程了 在反转图像(由黑白变为白黑)之前,需要对图像进行降噪处理,因为OpenCV是对亮点进行操作,在黑白图像中降噪更容易处理(去除杂乱黑点),降噪使用的方法仍然是上面的膨胀和腐蚀法 看一下经过两次降噪之后的图像是怎么样的 竖纹基本上不见了,仍然还有一部分黑点,但是已经不影响后面的识别了,这里降噪只能适度,过度处理可能会使文字部分丢失。 做完二值化反转之后是上面这个样子的,接下来再对图片做膨胀->腐蚀->膨胀处理 处理的结果图如下: 最终的框选效果 其他调试结果 当然调试过程中不止用了这一张图片,毕竟结果要有一定的普适性,下面是其他几种情况下的识别结果 来源https://github.com/zlyBear/BearOCR

资源

基于协同过滤的推荐系统算法研究

协同过滤算法研究 [摘要] 随着“大数据”的出现,人们在庞大的数据面前更是显得束手无策。信息过载的问题成为了让人们头疼的事情。社会信息超过了个人或系统所能接受、处理或有效利用的范围,并导致故障。当前要解决这个问题主要有两个途径:一类是使用搜索引擎,比如谷歌、百度、搜狐等,但是这类方法需要用户的需求明确,用户也得十分清楚的表达出自己的意向,其搜索结果的质量很大程度上依赖于用户对需求描述的准确度;另一类就是基于推荐系统,这种推荐系统不需要用户十分明白清楚自己的需求,它通过用户的历史行为数据来预测推断出用户的需求以及兴趣,通过建立模型和数据挖掘,为用户准确推荐。因此,推荐系统更符合当今时代的节奏和需求。 本文主要研究了利用用户行为数据,基于邻域的算法。分别在 User-based 和 Item-based 下实验相似度的修正和改进,不同相似度对协同过滤计算方法评测数值的影响。讨论因子K值(与用户兴趣最相近用户数)对算法的 Precision、Recall、Coverage、Popular 的影响。UserCF 和 ItemCF 的综合比较。 实验结果表明,K值和算法的各项评测指标也不完全成正相关或负相关,选择合适的K值获得最高精准度是非常重要的。 关键词:推荐系统;协同过滤;用户相似度; UserCF; ItemCF 目 录 绪 论 i.本课题的研究意义及必要性 ii.相关领域国内外应用的现状及发展趋势 iii.推荐系统及协同过滤简介 a.推荐系统 b.协同过滤 2.实验设计和算法测评 i.引言 ii.数据集 iii.实验设计 iv.算法测评 3.基于用户的协同过滤算法 i.引言 ii.基础算法 iii.相似度算法的改进 4.基于物品的协同过滤算法 i.引言 ii.基础算法 iii.用户活跃度和物品相似度关系 5.UserCF 和 ItemCF 的比较 i.引言 ii.UserCF 和 ItemCF 的综合比较 6.参考文献 1 绪 论 1.1 本课题的研究意义及必要性 上个世纪末以来,互联网得到了飞跃式的发展,网络上的信息量呈指数增长,更随着互联网技术的进一步发展,海量的信息如潮水般涌现在人们眼前,在购物网站上琳琅满目的物品、Netflix 上数以万计的电影资源。人们在巨大的信息海洋面前变得束手无策,这就出现了“信息过载”的重要问题。 为了解决“信息过载”,人们提出了“个性化服务”的概念,“个性化服务”使得信息更加具体有用的呈现在用户面前,为不同用户提供不同的服务或信息内容。个性化推荐系统(personalized rcoommcndcrsystems)是当今私人订制化服务研究领域重要的一点,所谓的个性化推荐系统是在海量数据挖掘基础上的一种预测性的平台,它可以帮助网站为目标用户提供完全个性化的推荐,自动完成目标用户可能的个性化选择。被推荐的物品可以是任意物品,衣服,鞋子,家具,书籍、电影甚至可以是楼房、景区等等。这个系统有赖于目标用户的过去的行为数据,通过一定的算法,预测出目标用户感兴趣的物品。 当今,对于信息超载问题的最常用的解决方案之一就是信息检索系统,这些检索系统的代表比如 Google、Baidu 等,它们在为用户分流处理信息方面有着重要的作用。但搜索引擎的关键字相对于的搜索结果是单一的,死板的。这样单一死板的信息处理方式,不能满足现今信息的多样化,传播方式的多样化,所以搜索引擎仍然无法很好地解决信息超载问题。 推荐系统可以做出个性化的推荐,把用户最可能喜欢的,需要的东西推荐出来,将有用的信息提炼出来,帮助用户阅读信息,做出判断。推荐系统被很好的应用在商业领域,其具体表现在:(1)电商推荐方面,它可以帮助销售商找到用户的潜在需求,提高利润,指引销售策略。 (2)个人娱乐方面,可以为目标用户推荐最有可能喜好的影视作品,提高网站服务的用户粘性。 (3)提供内容服务的网站方面,个性化新闻内容服务帮助用户方便快捷的浏览新闻资讯。 (4)大众服务,提供极为个性化的旅行方案,问题咨询等等。 推荐系统现有的算法和技术已有十几年了,但是它的研究还是很火热,因为 Web 已经成为了我们日常生活的必备,大量的数据我们已经仅凭人力难以消化,我们需要算法和技术的更新。 1.2 相关领域国内外应用的现状及发展趋势 推荐系统的研究,国外比国内很早就开始了。上世纪末时 Resnick&Varian 正式定义了电子商务推荐系统。 自从 1999 年,计算机协会 ACM(Association for Computing Machinery)在每年都召开一次电子商务主题的研讨会,会议中,有很多就是关于推荐系统的论文;数据挖掘特别兴趣组 SIGKDD(Special Interest Group on KDD)和信息检索兴趣小组 SIGIR(Special Interest Group on Information Retrieval)是该协会下两个研究小组,它们也分别在 1999 年和第 24 届的研究会议上,将推荐系统单独列为一个研讨的方向。在商业巨头与学术会议的激励下,推荐系统的研究也如日中天,机器学习和数据挖掘技术的飞速发展为协同过滤算法的实现提供了新的思想,协同过滤算法以数据矩阵为训练集,在机器学习和建模以后,作出智能的推荐预测。 相对而言,国内对推荐系统的研究晚一些。受到国外先进水平的影响,国内的研究也慢慢发展起来。现在国内在推荐系统的理论和应用方面也到得了一定成果。国内和国外对推荐系统的研究水平还是差距很大的。为了提高推荐系统在国内的研究水平,推荐系统高峰论坛于2011 年 3 月在北京地大国际会议中心举行,很多相关方面的学者参加了此次峰会。到会的各位专家都展示了自己平台的推荐系统,并积极探讨了推荐系统的技术难点问题以及将来的发展方向。这次峰会很好推动了国内的推荐系统研究和发展。另外,为了进一步激发高校对于推荐系统的研究热情,中国科技大学与人民大学统计学院筹备了“第一届全国大学生数据挖掘邀请赛”并在 2011 年 3 月举行。此次比赛的主题是社交网站的会员推荐算法的研究,面向国内所有高校和研究所的在校学生。比赛的平台是为某大型的婚恋网站研发更高效的智能推荐系统,增加匹配的成功率。此次比赛增加了高校学生对推荐系统的了解和学习,大大带动了整个推荐系统研究的发展。这种激励性的活动,让推荐系统在国内的研究也发展的火热。 1.3 推荐系统及协同过滤简介 1.3.1 推荐系统 如果你想买一双足球鞋,你可以走进一家鞋店,看到货架上的所有球鞋,转一圈找到自己喜欢的球鞋,然后买单。你也可以打开淘宝,在搜索框里输入足球鞋三个字,然后你会看到很多足球鞋,找到喜欢的球鞋,然后付款,等待送货上门。这都是用户明确知道自己需求的情况,知道自己要找怎么的足球鞋。但是,要是用户没有十分明确的需求时呢?例如图1.1,你想看一本书,但你面对偌大的书架,面对浩瀚的书海,你不知所措。这时候需要一个人或者一个工具来帮助你,给你一些选择方面的建议。但是,不总是刚好有人帮助你做选择,你需要一个了解你的自动化工具帮助你,它知晓你的兴趣,历史行为,帮你从琳琅满目的各类图书中选出符合你兴趣的书来——它就是推荐系统。 图 1.1 推荐系统 要想明白推荐系统是怎样工作的,我们可以参考在现实生活中我们遇到不知如何选择时是如何求助的。 我们会向我们的朋友去咨询,我们该如何选择。这种社会化的推荐,我们期望好友会给我们恰当的建议。 我们会去在搜索引擎上寻找我们喜欢的书籍,或者喜爱的作者,然后看看我们没看过的,感兴趣的。例如,我非常喜欢鲁迅,于是就去谷歌搜索鲁迅的作品,看到自己还没有看过的作品,就会去买一本读读。这种方法是寻找到和自己以前阅读过的书籍相似的书籍。推荐系统可以根据我们的历史数据,推测出我们可能喜爱的书籍。 我们还可能去参考热门书籍的排行榜,看看大家都在读什么书,什么书的评论比较好,然后比较选择出自己感兴趣的书。如果可以找到和自己的历史兴趣相一致的用户,参考他们喜欢的书籍,也许可以得出比热门排行榜更准确的推荐。这种方法就被称为基于协同过滤的推荐。 图 1.2 三种推荐方法 我们可以看出,推荐算法的最根本的问题在于把物品和用户通过某种计算方法联结在一起,而联结的方法是多种多样的。个性化的推荐系统已经得到了广泛的实战,最著名的例子就是被称为“推荐系统之王”的亚马逊。在国内像淘宝,豆瓣等都有很好的推荐系统。 图 1.3 淘宝足球鞋推荐 1.3.2 协同过滤 协同过滤一词是九十年代中期提出的,在后来得到了更深入的研究和广泛的应用。协同过滤讲的是:两个用户甲和乙具有相似的历史行为(比如购物,阅读,观影),那么他们在某些项目上具有相似的兴趣。通常,协同过滤技术都会有一个用户历史数据库,需要整合和处理历史数据,然后来预测用户的兴趣,给用户给出合理的推荐。 基于协同过滤的推荐(Collaborative Filtering recommendation)已经成为一项很受欢迎的技术。早期基于内容过滤是分析物品的内容属性,再进行推荐,但是这样的算法需要全面的了解推荐物品的各项信息,过于繁重和复杂。而协同过滤是分析出用户兴趣,在目标用户的用户群中匹配到相似(兴趣)用户,综合评估相似用户对某一信息的评价,然后预测出目标用户对物品的喜好。 协同于其他物品或者用户,给用户做出推荐,这正是信息时代的巨大优势,我们利用好用户的数据,就可以得到更准确的预测和推荐。 2 实验设计和算法测评 2.1 引言 推荐系统的实验法有很多种,最为主要的有 3 种:离线实验、用户调查和在线实验。 此次设计主要采用的是离线实验的方法,它不需要用户直接的参与到实验中,只要有数据就可以进行,可以高速的计算,测试很多不同的算法。下面将从数据集、实验设计、算法测评三个方面来介绍。 2.2 数据集 实验采用的是 GroupLens 所提供的 MovieLens 数据集,MovieLens 是推荐系统都会用的测评数据集。在这个数据集中,用户对自己以前所看过的电影进行打分,分值设为 1--5。此次实验所用的是 2016 年 1 月更新的最新数据包,由 700 个用户基于 10000 部电影的 100000 评级和 6100 个标签的应用程序,大小为 1M。 2.3 实验设计 此次协同过滤算法的研究就采用离线实验的方法。 通过用户日志系统可以获得用户的行为数据,直接采用 GroupLens 所提供的 MovieLens 数据集。 把数据集按照一定的方法划分为训练集和测试集。在训练集上对数据集合模拟训练,然后得到用户的兴趣模型,最后通过测试集进行预测。按照离线实验,分析推荐算法的系统性能评测指标,在测试集上计算出算法的结果和性能。推荐系统的离线实验基本都是基于离线的数据集,它不依赖实时的系统来为它提供算法实验的平台和数据,只需要从历史的数据库中提取的用户行为数据集就行。离线实验的最大的好处是:不需要真实用户的参与,它可以更方便快捷的计算出结果,可以更加快速,方便的运算大量的不相同的算法。第一,我们可以把用户的数据平均的随机给划分为 M 个小的数据集,然后随机的挑选出一个成为实验的数据集,那么没有成为实验数据集的就成为了训练集。接下来,我们就要在训练集上计算出用户的兴趣模型,在测试集上对目标用户的行为进行预测,最后得出推荐算法评测指标。 为了结果的科学性,我们需要进行多次实验,并且使用大量不同的测试集,把多次实验计算出的评测指标取其平均值,将平均值作为最后的评测结果。代码每次选用了不同的 K 值,seed 是随机数,M 次实验就可以得到 M 个不同的训练集和数据集,分别进行各自的实验,取最后的均值,很好的防止了实验结果的过拟合。 2.4 算法测评 基于协同过滤的推荐算法我们使用 Precision、Recall、Coverage、Popular 等来定性的描述算法的性能。 准确率 对于推荐系统算法来说,这可能是最重要的指标,它标识这个推荐系统算法预测用户行为准确性的能力,从推荐系统出现开始,可以说 100% 的推荐系统都要首先考虑这个问题。 简单来说就是训练集上计算的预测行为和测试集上用户的实际行为的重合度。重合度越高,那么推荐算法的准确度也就越高。 召回率 召回率和准确率似乎很相似,但是两者是有区别的。Recall 也叫查全率,查全率是“推荐到相关的物品”比“推荐到相关的物品与未推荐但相关的物品之和”,当然越大越好。而准确率是“推荐相关的物品”比“推荐相关的物品与推荐的不相关的物品之和”。从这里看两者似乎没什么联系,但是在实际应用中,两者存在着相互制约的关系。 覆盖率 就字面意思来讲,Coverage 就是被推荐出来的物品占物品总数的比例。这一指标是商家会关注的,他们得关注自己的产品是否被推荐给了用户。比较热门推荐物品的 Coverage 是比较低的,因为热门的物品很容易被推荐,而热门物品在整个产品中所占的比值总是不是很大。推荐系统的 Matthew effect 也是现在所要解决的主流问题。 流行度 推荐物品的流行度测量的是推荐结果的新颖度,要是被推荐出来的物品都是热门的物品,那么就意味着推荐算法的新颖度相对较低,相反,则算法的新颖度比相对较高。但这个评测是比较粗略的,因为具体用户是否知道这个东西是不确定的,需要进一步的对用户做具体调查。 3 基于用户的协同过滤算法 3.1 引言 基于用户的协同过滤算法是推荐系统诞生以来历史最悠久的算法,此算法被提出于 1992 年,最早期用于邮件的过滤使用,在 1994 后被应用于新闻的过滤。基于用户的协同过滤算法在推荐系统的历史舞台中扮演有重要的角色,下面就从基础算法开始分析。 3.2 基础算法 在每当我们要学习一门课程的时候,我们总会问老师或者师哥一些问题,例如“我学习这门课程该看哪些参考书啊”,“有什么关于这门课程学习的网站没”等等,这时候,被问者总会给我们一些推荐,这就是一个个性化推荐的典型案例。我们在碰到这类问题时,所寻找的人总是和我们有相似的研究目标或者兴趣。因此,在推荐系统当中,当用户甲需要个性化推荐的时候,我们往往可以寻找和他有着相似爱好或者行为的别的用户,然后把那些用户喜欢的、但是不在甲的历史记录范围的物品推荐给甲,这样的方法就是基于用户的协同过滤算法。 其实,基于用户的协同过滤算法就是两个步骤: 寻找出和推荐需求用户的兴趣相似的用户群。 匹配出这个用户群中用户喜欢的,但是推荐需求用户没有听过的物品并推荐给用户。这里最为重要的就是计算两个用户的兴趣相似度,用户行为的相似度是协同过滤主要的参考指标。这里我们假设出 u 和 v 两个用户,用 N(u)指代 u 所有过良性反馈的物品集合,用 N(v)指代 v 所有过良性反馈的物品集合。那么,我们就可以使用余弦相似度的计算公式计算 u 和 v 的兴趣相似度: 以下图的用户历史行为记录,来简单计算用户之间的兴趣相似度。可以看出 A 对物品{a, b, d}有过历史行为,B 对物品{a, c}有过历史行为,利用余弦相似度公式计算 A 和 B 的兴趣相似度为 图 3.1 用户兴趣表 同理,我们可以计算出 A 和 C、D 的相似度: 这种计算方法的时间复杂度是平方级的,很耗费资源。由于很多用户之间并没有对共同的相似行为,余弦相似度的分子是零。因此,我们可以先对矩阵进行优化,排除掉分子为零的情况,这样就可以优化计算时间。 我们可以建立物品到用户的倒排表,对于每个物品来说我们都只保存对该物品产生过行为的用户即稀疏矩阵 C[u][v]两个用户历史行为的交集。如果 u 和 v 都是倒排表 K 个物品所对应的用户列表,就有 C[u][v]=K。我们去遍历每个物品它所对应的用户列表,把两两用户对应的 C[u][v]加 1,就能够排除掉为零的情况。 首先,我们得建立物品—用户的倒排表。接下来,建立一个 4×4 的用户相似度矩阵 W,对于物品 a,我们把 W[A][b]和 W[B][a]加 1,对于物品 b,我们把 W[A][c]和 W[C][a]加 1,按照这样的计算方法。把所有的物品扫描完后,我们就得到了最后的 W。这个 W 是余弦相似度中的分子,将 W 除以分母我们就可以得到最终的用户兴趣相似度。 图 3.2 物品用户倒排表 计算出了用户之间的相似度值后,User-based 算法就会推荐出和用户兴趣最相似的 K 个用户他们所喜欢物品。 这里的 S(u, K)是包含和用户 u 的兴趣最接近的 K 个用户,N(i)是对物品 i 有过行为的用户集合,Wuv 是用户 u 和用户 v 的兴趣相似度,Rvi 代表用户 v 对物品 i 的兴趣。选取 K=3,用户 A 对物品 c、e 没有过行为,因此可以把这两个物品推荐给用户 A。根据 UserCF 算法,用户 A 对物品 c、e 的兴趣是: UserCF 算法有一个重要的参数值 K,K 为选取的和目标用户兴趣最相似的用户个数,然后推荐这 K 个用户感兴趣的物品,在不同的 K 值下,算法的性能也有很大的区别。我们可以发现,K 值的调整对算法的每一项指标都会产生一定的影响。 图 3.3 UserCF 算法在不同 K 值参数下的性能 Precision 和 Recall 推荐系统的 Precision 和 Recall ,并不是和 K 值成简单的线性关系。在我所选用的数据集中,当 K 值在 40 左右的时候 Precision 和 Recall 达到了峰值。适合的 K 值对推荐系统有着重要的影响。 Popular 可以看出推荐结果的的流行度随着 K 值的增长都在增大,K 值是参考的兴趣相似用户人数,人数越多,结果中的热门物品也就自然越多。 Coverage 可以看出随着 K 值的增大,算法的覆盖率在降低,覆盖率的降低是因为 UserCF 的推荐在 K 值增大时越来越趋于热门物品,那么相对的长尾物品自然推荐率降低,覆盖率也就降低了。 3.3 相似度算法的改进 前面我们在计算用户的相似度的时候简单的使用了余弦相似度,但是这样计算的准确度不够高。例如,两个用户都购买了《中华字帖》,这不是很能说明他们的兴趣相似,在中国,我们很多人都会购买《中华字帖》。但是,两个用户都购买了《推荐系统实践》这本书,那么他们两个兴趣相似度就比都买《中华字帖》的要高。有人提出了对相似度进行惩罚: 公式中的对数运算惩罚了用户的相似兴趣集合热门物品对相似度的影响。 在这里将算法改进前后的推荐系统的性能作比较,选取 K 值为 80,我们可以看到,改进后的个性性能的数据都有所提升。 图 3.4 UserCF 算法和 User-IIF 算法的对比 4 基于物品的协同过滤算法 4.1 引言 基于物品的协同过滤算法是当前应用最为广泛的算法,无论是推荐系统鼻祖的亚马逊,还是国内推荐体验很好的豆瓣,都是基于这种的推荐算法。下面先从基础算法开始介绍,然后分析算法的改进,以及基于数据集测评推荐性能。 4.2 基础算法 基于用户的协同过滤算法被应用于实践中,但是存在有一些比较突出的缺点。在数据越来越庞大的今天,用户的历史行为数据越来越多,用户兴趣相似度矩阵将变得无比庞大,难以计算,其运算的时间复杂度和空间复杂度骤增。还有就是基于用户的协同过滤算法有一个盲点,它不能够对推荐结果做出解释。在这样的情况下,亚马逊公司首先提出了这个算法——基于物品的协同过滤算法。 基于物品的协同过滤算法会把用户之前喜欢的相似物品推荐给目标用户,就例如,你购买过《唐诗三百首》它就会把和《唐诗三百首》相似的《宋词一百篇》推荐给你。ItemCF 并不是基于计算物品内容属性的相似度,而是计算分析用户行为从而计算出物品的相似度。比如,贝克汉姆和罗纳尔多具有很大的相似度,是因为喜欢贝克汉姆的人大多也喜欢罗纳尔多。在淘宝、京东等页面的底部的“猜你喜欢”就是这样推荐出来的。 图 4.1 京东书籍推荐 基于物品的协同过滤算法也可以被分为两步: 计算出物品之间的相似度。 依据物品的相似度以及目标用户的历史行为数据得出目标用户的推荐集合。 物品的相似度可以简单的定义为: 这里的分母是对物品 i 喜欢的用户,分子是同时对物品 i 和 j 喜欢的用户。这个公式可以理解为简单比例问题。但这种定义方法存有缺陷,比如说喜欢贝克汉姆的人很多,贝克汉姆就是热门,使用该公式就使得任何物品和贝克汉姆都具有很大的相似度,这不利于挖掘长尾物品信息。可以使用下面的公式惩罚热门物品的权重: 在基于物品的协同过滤推荐算法中,两个物品相似度的产生是因为他们被多个用户共同喜欢,目标用户的历史行为和兴趣都是计算物品相似度的参考。 类似于 User-based 算法,Item-based 算法也同样也能够建立一个倒排表,每个用户建立一个他所喜欢的物品集合,接下来,将他的物品集合列表中的物品两两相加。 下图是一个简单计算物品之间相似度的例子。从左到右是模拟实现计算的过程。例如,第一行就表示用户喜欢 a,b,d,将物品两两加 1,最后将这些矩阵相加得到最终的结果矩阵,一个数组就表示同时喜欢行标物品和列标物品的用户。 图 4.2 物品相似度计算的例子 ItemCF 算法在计算过程中不会有任何内容属性的比较,但是结果可以看出相似的物品在存在有一定内容的相似性。下面的公式可以计算出某一用户对某一物品的兴趣: 此公式表示,在用户历史行为表现出感兴趣的物品与其越相似的物品,被优先推荐。 下面举一个简单的例子,《C++Primer 中文版》和《编程之美》是一个用户喜欢的两本书,推荐算法会找出和它们相似的 3 本书,然后计算出每本书的用户感兴趣的程度。 图 4.3 一个简单的基于物品推荐的例子 我们可以看出,对用户推荐是可以根据用户的历史行为为依据,也就是说可以解释推荐。下图是离线实验的各项指标,K 值在 10 左右得到的评测结果最优。 Precision 和 Recall ItemCF 的推荐的 Precision 和 Recall 同 UserCF 一样,都不和 K 值成完全的线性关系,K 值的选择就成为了相当重要的指标。 Popular Popular 在 K 值增加的情况下逐渐升高,但到一定的临界值时就不会有太大浮动的改变。 Coverage K 值和推荐系统的 Coverage 成反比。 图 4.4 ItemCF 算法离线实验的结果 4.3 用户活跃度和物品相似度关系 在协同过滤中,每个用户的历史兴趣集合都对物品的相似度产生影响,但是每个用户所产生的影响是不同的。假如一个鞋店老板他进货购买了 1 万只鞋子,但是这一万只鞋子并不都是他感兴趣的,而这些鞋子覆盖了很多的种类,这个老板的对于其他物品的相似度 远不如一个只购买足球鞋的青年。这就存在了相似度失真的问题。 上面的算法抑制了活跃用户对相似度的影响,用活跃度对数的倒数来修正物品相似度。使得计算更加精准。 在现实的计算中,这种惩罚的力度不够,为了躲避相似度矩阵太巨大这种不良情况,通常我们会直接忽略不计他的历史数据,不让参与到相似度的计算中。 为了便于比较,直接选取修正前的最佳 K 值 10,由图可知,算法修正前后的精度很接近,但修正后的推荐结果的覆盖率得到了很大的提升,流行度有所下降,可以说修正后的推荐性能得到了提高。 图 4.5 ItemCF 算法和 ItemCF-IUF 算法的对比 5 UserCF 和 ItemCF 的比较 5.1 引言 User-based 和 Item-based 都是协同过滤的经典推荐系统算法,协同过滤的优点就是能够整合数据,参考历史的、已知的推测出未知的。UserCF 在推荐系统中是比较早的推荐算法,早在上世纪 90 年代就被应用于电子邮件中,后来又被 GroupLens 应用于新闻的推荐。ItemCF 相对来说是近期的算法了,亚马逊对 ItemCF 应用也得到了企业级的肯定。但两者的优劣如何呢?下面我们就讨论下。 5.2 UserCF 和 ItemCF 的综合比较 从这两个算法的来看,User-based 推荐的是和他有着相似兴趣的人喜欢的物品,Item-based 推荐是和他之前喜欢的物品相似的物品。前者主要参考了同兴趣者的爱好,后者主要借鉴了用户自己的历史兴趣。前者是社会化,群体化的推荐,反映了类似群体的喜好特征,而后者是更加个性化的推荐,反映了用户自己的兴趣历史。 例如在新闻中,很多人都喜欢看的是热门的新闻,范围比较广的。新闻的热门度,时效性都是推荐系统重点要考虑的,而比较深度的个性化在这里不是很强调。User-based 就可以推荐出社会性,小群体性的新闻,大家就了解到小圈子内关注的热点,也保证了相对的个性化推荐。相对于算法的运算性能来说,User-based 需要维护的是用户相似性表,不像 Item-based 要维护一张物品的相关度表,在新闻中,物品的更新度比用户快的多。 而在 ItemCF 中,多用于图书,电子商务,电影网站等。在这些领域中,用户的兴趣有很强的针对性,比较稳固。要对一个资深的技术人员推荐书籍,就更要依赖于他的历史兴趣,更好的发掘长尾物品,因为技术人员的书籍不会是太热门的大众书籍,需要更好的个性化推荐,ItemCF 则能满足这样的需求。这些网站需求的个性化推荐是帮助人们发现和他熟悉、感兴趣的领域相关的物品,网站内容的物品不会更新太快,更有利于挖掘用户的兴趣点。 性能 UserCF 适合用户数量不是很多的场合,在这样的情况下,用户的相似度矩阵的更新代价不会太大。 ItemCF 适合于物品数少的场合,要是物品太多,相应的物品相似度矩阵太庞大,计算复杂度高。 领域 UserCF 时效性好,在不是很强调个性化的领域。 ItemCF 长尾物品的推荐,需要很强的个性化推荐的领域。 实时性 UserCF 用户的新行为不会立竿见影的左右推荐结果。 ItemCF 用户的行为对推荐结果的影响很迅速。 推荐理由 UserCF 没有明确的和让人信服的推荐解释。 ItemCF 可以提供合理的推荐解释,让用户信服。 参考文献 [1] 马卓.协同过滤推荐算法的研究与改进[D].燕山大学.2015 [2] 张娜.电子商务环境下的个性化信息推荐服务及应用研究[D].合肥工业大学, 2007 [3] Dietmar Jannach,Markus Zanker,Alexander Felfernig.Recommender Systems[M].蒋凡译.人民邮电出版社.2013 [4] Resnick,Varian。推荐系统[J] .ACM通讯,1997,40(3):56-58 [5] 项亮.推荐系统实践[M].人民邮电出版社.2012 [6] Magnus Lie Hetland.Python 基础教程[M].司维等译.人民邮电出版社.2014 [7] 刘青文.基于协同过滤的推荐算法研究.中国科学技术大学[J].2013 [8] 曾春,邢春晓,周立柱.个性化服务技术综述[J].软件学报.2002.13(10):1952—196l [9] 邓爱林,朱扬勇,施伯乐.基于项目评分预测的协同过滤推荐算法[J].软件学报,2003,14(9):1621-1628 [10] 曾伟.推荐算法与推荐网络研究[D]. 电子科技大学 2015 [11] 秦利静.推荐系统模型与学习算法研究[D]. 清华大学 2014 [12] 邓爱林.电子商务推荐系统关键技术研究[D]. 复旦大学 2003 [13] 杨海涛.一个基于搜索结果的个性化推荐系统[D]. 郑州大学 2006 [14] 张雪文.智能推荐系统中协同过滤算法的研究[D]. 上海交通大学 2008 [15] 韩慧俊.电子商务个性化推荐系统的研究[D]. 上海交通大学 2007 转载自https://github.com/AlenQi/Research-on-Collaborative-Filtering-Algorithms

资源

【毕业设计】面向高考招生咨询的问答系统设计与实现

InfomationGet:完成领域知识的获取和数据库构建工作 1、Infomation:存储获取到的信息 (1)、九校联盟:C9数据--表格型(招生计划、录取分数(分省、分专业)) (2)、大学:大学学科字段(百度百科)、常用问题集(C9常用问题集.csv) 2、py文件 (1)、CreateFolder.py(创建文件夹--九校联盟) (2)、InternetConnect.py(网络连接) (3)、GetDictionaryData.py(获取相关词典数据) (4)、GetPlanInfo.py(获取招生计划数据) (5)、GetScoreInfo.py(获取录取分数数据) (6)、MysqlOperation.py(MySQL数据库操作) (7)、Neo4jOperation.py(Neo4j数据库操作) (8)、InsertAdmissionData.py(MySQL数据库插入数据) (9)、GetFrequentQuestion.py(获取高考网常用问题集数据) FileRead:获取招生数据过程中的文件读取 1、py文件 (1)、FileNameRead.py(读取文件名) (2)、ImageRead.py(读取图片) (3)、PDFRead.py(读取PDF(表格、文字)) (4)、XLSRead.py(读取excel表格) HanLP:中文自然语言处理工具 1、py文件 (1)、HanLPTest.py(HanLP测试) LTP:中文自然语言处理工具 1、ltp_data:LTP模型库+自定义词典文本 2、py文件 (1)、LTPInterface.py(LTP使用接口) (2)、XFYunWebAPI.py(讯飞云网络接口) QuestionAnalysis:自然语言问句分析 1、py文件 (1)、QuestionPretreatment.py(自然语言问句预处理(关键词:(年份、学校、专业、地区)识别与预处理)) (2)、KeywordNormalize.py(关键词正则化) SimilarityCalculate:相似度计算 1、py文件 (1)、SemanticSimilarity.py(语义相似度计算,需要api) TemplateLoad:模板加载 81、Template:模板文件 2、py文件 (1)、QuestionTemplate.py(问题模板的创建与加载) QuestionQuery:自然语言问句查询 1、py文件 (1)、MysqlQuery.py(MySQL表(admission_plan、admission_score_pro、admission_score_major)查询(可缺省关键词)) SystemUI:自动问答系统设计 1、images:UI图片 2、py文件 (1)、QASystem.py(自动问答系统界面设计(自动问答+可选数据库目录查询)) Log:日志系统 1、py文件 (1)、Logger.py(自定义日志类(all.log+error.log,all.log可按时间每日切分)) 转载自:https://github.com/SangYuhiter/Knowledge-Map-and-Question-Answer

资源

【毕业设计】基于Android的人脸门禁系统

基于Android的人脸门禁系统 一、研究目的 传统的门禁系统以钥匙作为验证手段,便捷程度低,丢失钥匙之后会导致极大的安全问题。人脸是一种极易获得的生物特征,具有唯一性、稳定性的特点,并且使用时设备无需与人脸接触,因此可以作为新一代的门禁验证手段。近年来,随着Android移动设备性能的不断提升,使得在移动设备上进行人脸识别成为可能。本repo设计并开发了一个基于Android平台的人脸识别门禁系统,并解决了在实际运用中可能遇到的光照变化,人脸姿态变化等情况。 二、研究内容及实验结果 1)基于双眼检测的正脸判断算法研究。人脸识别中,人脸的姿态变化会导致识别率降低。首先研究实现了基于Haar特征的Adaboost人脸检测算法,检测定位出人脸的框架和双眼的位置。然后通过人脸与双眼的位置关系,提出了一个正脸判断的方法。实验表明,该方法有效地降低了人脸姿态问题对于整个识别系统的影响。 2)基于LBP+PCA的人脸识别算法研究。首先分析了局部二值模式LBP和主成份分析PCA的原理,研究了LBP与PCA相结合的特征提取方法。相对于单独使用PCA方法,该组合方法能够有效地降低光照变化对人脸识别准确度的影响。然后,采用支持向量机对特征进行分类,并利用置信度计算方法,来有效地表示人脸和分类结果的隶属程度。实验表明,该算法对于光照变化情况下的人脸识别,准确率有了明显的提升。 3)Android平台上人脸识别门禁系统的设计与实现。分析了系统的需求,设计了具有用户注册、人脸检测与识别、门禁开关、管理员模块、通知模块等功能模块的人脸识别门禁系统。然后在Android平台上,利用Java语言和计算机图像视觉库Opencv,按照软件工程逻辑完成了系统的整体开发。整个系统经过测试运行,能够满足典型环境中的使用需求。 三、部分系统界面 用户主界面 识别界面 识别成功界面 用户管理页面 via:https://github.com/CommissarMa/FaceAccessControl

资源

【毕业设计】基于SpringBoot及thymeleaf搭建的疫情信息管理系统

基于SpringBoot及thymeleaf搭建的疫情信息管理系统 简介 基于SpringBoot及thymeleaf搭建的疫情信息管理系统 疫情信息管理系统旨在通过信息化手段记录跟踪本地区密切接触者、受感染者、危重症病人、治愈者以及死亡者,以密切接触者为开始一直到感染者治愈或者死亡,记录其基本信息、感染源、核算记录以及发病情况等信息,在通过信息化可视化手段展示本地区疫情发展情况,统计各个人群的数量,每个人群所占比例。 本系统的技术环境为: JDK1.8 SpringMvc SpringSecurity SpringBoot Mysql Mybatis Thymeleaf echarts 系统功能模块 疫情信息管理系统应当具备两种对象,疫情管理员对象可以对确诊患者、密切接触者、死亡患者、治愈患者的信息进行管理操作,系统管理员对象在疫情管理员对象的功能基础上可以对系统登录用户进行增删改查。针对需求分析设计了具体模块,系统功能模块图如下图所示。 抗疫管理员登录后可以进行确诊患者管理、密切接触者管理、死亡管理、治愈管理,同时可以看到数据面板的数据变化与动态图。系统管理员除了拥有抗疫管理者的权限,还可以对抗疫管理员进行管理。 密切接触者可以转换成确诊患者;确诊患者可以转换成死亡患者或者治愈患者,业务流程图如下图。 系统界面 登录界面 系统管理员可以通过登录界面输入登录账号和登录密码,点击登录按钮即可进入系统界面,如下图所示。 数据面板界面 进入到系统之后的首页即是数据面板页面,数据面板页面罗列了目前确诊人数、累计确诊人数、治愈人数、治愈率、现存隔离人数、累计隔离人数、死亡人数、死亡率等信息,可以点击各模块的更多信息进入相关页面。下方则有疫情发展趋势图与比例图展示各个时间段疫情状况与各个人群的比例关系,如下图所示。 确诊患者管理界面 确诊患者管理界面将当前确诊患者列出显示其基本信息,左下角显示共有多少确诊患者,并可选择每页显示多少条数据,数据右侧则是对相应确诊患者进行管理操作,可以查看详情,查看确诊患者详情信息、将当前确诊患者转为治愈、将当前确诊患者转为死亡,如下图所示。 患者详情界面 患者详情界面详细的展示了患者的基本信息如下:姓名、年龄、性别、身份证等,治疗信息如下:感染源、是否重症、住院时间、发病症状、诊治医院、信息备注,以及相应的核酸检测及ct检测历史,如下图所示。 系统管理员界面可查看管理员信息、添加管理员、对管理员进行删除、将普通管理员设置为系统管理员操作,如下图所示。 新建密切接触者界面 新建密切接触者界面包含两部分,一是添加密切接触者的基本信息如下图所示,点击下一步则跳转到添加隔离信息界面如下图所示。 via:https://github.com/SanleyPan/Coronavirus

资源

推荐系统论文归类总结

推荐系统论文归类总结 本文主要记录较新的推荐系统论文,并对类似的论文进行总结和整合。 目录 推荐系统论文归类总结 综述 协同过滤理论 矩阵分解 因子分解机 基于内容的推荐 基于DNN的推荐 基于标签的推荐 基于自编码器 Item2Vec 上下文感知模型 基于视觉的推荐 基于RNN的推荐 基于图的推荐 基于树的推荐 公司的推荐系统的发展历程 数据集 参考资料 版权声明 综述 《Deep Learning based Recommender System: A Survey and New Perspectives》 《Use of Deep Learning in Modern Recommendation System: A Summary of Recent Works》 这几个综述比较全面,介绍了目前的深度学习在推荐系统中的应用。 协同过滤理论 1.《Application of Dimensionality Reduction in Recommender System - A Case Study》推荐系统的维度下降技术。 这是发表于2000年的“古老”论文,该文是最早探讨如何解决协同过滤数据量很大时的问题。这个论文提出了使用传统的SVD降维的技术。 这个文章提出推荐系统可以分为两部分:预测、推荐。预测可以使用加权和,推荐使用TopN。可能因为这个文章特别早吧,他认为推荐系统面临的主要问题是三个:稀疏,规模,“同义词”。当数据集稀疏的时候,皮尔逊近邻算法可能根本无法使用。规模很好理解。这个同义词的意思是两个相似的物品名字不同,推荐系统不能发现他们之间的隐相关性。同义词问题没看到这个文章怎么解决的,事实上我也没看到其他论文上如何解决这个问题,甚至已经不认为这是推荐系统要解决的问题了。 该文认为SVD的任务有两个: 1.捕捉用户和商品的隐层关系,允许我们计算用户对商品打分的预测值。 2.对原始的用户和商品关系进行降维,并且在低维空间计算邻居。 该传统的SVD是一种矩阵分解方法,这种方法的缺点是需要先把评分矩阵缺值补足,是一种线性代数里的求解析解的方法。这种方法可以研究的一个点就是如何进行缺失值填补,不同的填充方法,对结果产生不同的影响。另外就是SVD降维是代表维度k值的选取,这个需要使用实验获得。另外,真正的预测是放在线下运行的,可以在用户的访问时迅速做出推荐。 总体而言,这个文章介绍了SVD如何在推荐系统中使用,并通过实验说明了如何做预测和推荐。因为该矩阵分解方法和后来的矩阵分解差异已经很大,所以不放入后面的矩阵分解篇幅中。 2.《Amazon.com Recommendations Item-to-Item Collaborative Filtering》亚马逊发表的基于物品的协同过滤 在 User-based 方法中,随着用户数量的不断增多,在大数量级的用户范围内进行“最近邻搜索”会成为整个算法的瓶颈。Item-based 方法通过计算项之间的相似性来代替用户之间的相似性。对于项来讲,它们之间的相似性要稳定很多,因此可以离线完成工作量最大的相似性计算步骤,从而大大降低了在线计算量,提高推荐效率。 在 Item-based 方法中,要对 A 和 B 进行项相似性计算,通常分为两步:1)找出同时对 A 和 B 打过分的组合;2)对这些组合进行相似度计算,常用的算法包括:皮尔森相关系数、余弦相似性、调整余弦相似性和条件概率等。伪代码如下: 3.《Item-Based Collaborative Filtering Recommendation Algorithms》影响最广的,被引用的次数也最多的一篇推荐系统论文。 文章很长,非常详细地探讨了基于Item-based 方法的协同过滤,作为开山之作,大体内容都是很基础的知识。文章把Item-based算法分为两步: (1)相似度计算,得到各item之间的相似度 基于余弦(Cosine-based)的相似度计算 基于关联(Correlation-based)的相似度计算 调整的余弦(Adjusted Cosine)相似度计算 (2)预测值计算,对用户未打分的物品进行预测 加权求和。用户u已打分的物品的分数进行加权求和,权值为各个物品与物品i的相似度,然后对所有物品相似度的和求平均,计算得到用户u对物品i打分。 回归。如果两个用户都喜欢一样的物品,因为打分习惯不同,他们的欧式距离可能比较远,但他们应该有较高的相似度 。在通过用线性回归的方式重新估算一个新的R(u,N)。 文章很经典,没有太难理解的部分,可以看别人的笔记:https://blog.csdn.net/huagong_adu/article/details/7362908 矩阵分解 1.《Matrix Factorization Techniques for Recommender Systems》矩阵分解,推荐系统领域里非常经典、频繁被引用的论文。 这个论文是推荐系统领域第一篇比较正式、全面介绍融合了机器学习技术的矩阵分解算法(区别于传统的SVD矩阵分解)。矩阵分解是构建隐语义模型的主要方法,即通过把整理、提取好的“用户—物品”评分矩阵进行分解,来得到一个用户隐向量矩阵和一个物品隐向量矩阵。 在得到用户隐向量和物品隐向量(如都是2维向量)之后,我们可以将每个用户、物品对应的二维隐向量看作是一个坐标,将其画在坐标轴上。虽然我们得到的是不可解释的隐向量,但是可以为其赋予一定的意义来帮助我们理解这个分解结果。比如我们把用户、物品的2维的隐向量赋予严肃文学(Serious)vs.消遣文学(Escapist)、针对男性(Geared towards males)vs.针对女性(Geared towards females),那么可以形成论文中那样的可视化图片: 这种矩阵分解方法区别于传统的SVD,这种方法不仅不需要进行缺失值填补,而且相比于线性代数里的奇异值分解,该方法从问题的描述上就是一个最优化问题。给出目标损失函数,然后优化它。所以已经和SVD没什么关系了。 矩阵分解算法具有的融合多种信息的特点也让算法设计者可以从隐式反馈、社交网络、评论文本、时间因素等多方面来弥补显示反馈信息不足造成的缺陷,可以根据需要很容易的把公式进行改变。比如考虑到时间变化的用户、项目的偏差,可以对预测评分函数改写成: 2.《Feature-Based Matrix Factorization》从公式推导到优化方法,到参数更新策略讲得非常详细的一篇工程实践论文。 非常好的一篇文章,把矩阵分解讲的特别详细,强烈推荐一看。提出了基于特征的矩阵分解模型。其实这个模型并不是一个新的大的改变,只不过是对于已有的很多矩阵分解的变体进行了一个统一的形式定义。该文章把矩阵分解分为了用户特征、物品特征、全局特征,对这三个特征都有相应的系数矩阵。这个模型很容易地可以加上Pairwise方法,时间系数,邻域信息,层次信息等。本文也给出了优化矩阵分解模型选用的方法,参数更新公式,计算加速的方法等非常详细的说明。总体的框架如下图。 这个矩阵分解的速度可以很快,有点类似FM,不过比FM多了全局偏置。值得一看,一定会对矩阵分解有更深的认识。这个文章是偏向于工程实践的,所以循序渐进地引出来每个式子。和普通的论文的佶屈聱牙相比,绝对能看懂。唯一可惜的是没有看到公开的代码,如果发现了再补到这里。 3.《Probabilistic Matrix Factorization》PMF是对于基本的FunkSVD的概率解释版本,殊途同归 本文要提出一个解决非常系数和不平衡的数据集的模型,解决了很多在NetFlix数据集上运用矩阵分解失败的两个原因: 1.没法适用于大规模数据集 2.对于冷门的用户很难做推荐 它假设评分矩阵中的元素Rij是由用户潜在偏好向量Ui和物品潜在属性向量Vj的内积决定的,并且服从以下的正态分布: 同时,假设用户偏好向量与物品偏好向量服从于均值为0以下的正态分布: 对正太分布取log,之后会发现后面的正则化项和超参与数据集分布有关,是不变的。所以可以得到了要优化的目标方程: 所以,绕了一圈之后会发现,如果假如评分、用户、物品的向量是正太分布的话,那么就能通过数学方法推导出和SVD基本一致的目标方程,所以标题才直接取名概率矩阵分解机。这个思路很清奇,文章的后面又基于这个基本的目标方程进行了两种改进。 4.《Regression-based Latent Factor Models》基于回归的隐因子模型 这个论文其实就是对《Probabilistic Matrix Factorization》进行了改进。 本文也是基于高斯先验,但是把正太分布的均值从0-均值改成了基于特征的回归方法来计算,使得模型假设更有说服力。 优点是三个: 1.一个模型同时解决了冷热启动问题; 2.减少了使用共现物品或用户的相关性; 3.给预测提供了附加信息,提高了准确度。 5.《Collaborative Filtering with Temporal Dynamics》加入了时间变量的协同过滤 这个论文的想法是显然易见的:用户给物品的打分是随着时间变化而变化的。因此,该文在以前模型的基础上加入了时间因素。文中对两种推荐方法:基于邻域的模型、隐因子模型都做了相应的改进。主要的公式是: 实际应用的模型是基于SVD++改进的。本文基于这样的思想:用户和物品的偏置都会随着时间变化,用户的隐因子也会改变,但是物品的隐因子认为是不变的。另外在思考这个问题的时候也要考虑到把时间分箱时要兼顾到粗细粒度,本文还综合考虑了用户喜好随着时间的渐变和突变。因为这个文章比较全面系统,我觉得可以多看几遍。 6.《Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model》近邻方法+因子分解 这个文章自称是第一篇把近邻方法和因子分解方法融合到一起的论文。难点其实在于把近邻方法转换为因子分解方法相似的通过迭代更新参数进行求解的方式,而传统的近邻方法是基于原始数据集统计求解的、不需要迭代。 文章对最近邻模型只做出了多个改进:模型参数通过训练得到,加入了隐式数据,用户偏置项使用学习得到,对邻域个数进行了归一化。对因子分解方法主要采用了SVD++方法。最后的融合模型如下图,使用梯度下降更新参数。这个模型相当于三层模型的累加:基准模型+因子分解模型+最近邻模型。 这篇解读相当不错:https://blog.csdn.net/fangqingan_java/article/details/50762296 7.《Leveraging Long and Short-term Information in Content-aware Movie Recommendation》几个模型的融合 这个文章简直好大全。MF,LSTM,CNN,GAN全都用上了。 本质是学习得到用户和电影的隐层向量表示。学习的方式是最小化能观测到的电影评分预测值和真实评分值的方根误差。即MF的公式是: 另外,矩阵分解不能学到关于时间变化的用户口味的变化,所以本文用到了LSTM。文章整体的架构如下。 因子分解机 1.《Factorization Machines》大名鼎鼎的FM FM模型是一个可以用于大规模稀疏数据场景下的因式分解模型,这个模型的求解是线性时间复杂度的,他可以使用原始数据直接求解而不需要像SVM一样依赖支持向量。另外FM是个通用的模型,可以在任何实数数据上使用,可以做分类和回归甚至能做排序等任务。 FM的思想是在线性回归的基础上,增加了两个特征的线性组合,求解线性组合的方式是使用了矩阵分解的方式。因为如果数据本身就很稀疏,于是两个变量的共现数据极少,但是矩阵分解使得不同的特征对不再是完全独立的,而它们的关联性可以用隐式因子表示,这将使得有更多的数据可以用于模型参数的学习。目标函数如下: 上面的二次项矩阵可以通过数学进行优化,使得时间复杂度降为O(kN)。 2.《Field-aware Factorization Machines for CTR Prediction》大名鼎鼎的FFM FFM是对FM的改进,添加了Field的概念,也就是说每个特征归于哪一类。假设Field有f个。那么每个特征都要有f个隐向量。当两个特征做交叉的时候,使用每个特征与另外一个Field对应的向量求点积。这样的话,就能保证相同Field对同一个特征的作用是相同的,而不同Field的特征对同一个特征的作用是不同的。 另外,FFM不能向FM那样使用数学优化了,所以时间复杂度是O(kN^2). 3.《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》FM的深度学习版本 这个模型基于wide & deep做了改进,首先模型包括FM和DNN部分,是个并联结构,FM和DNN共享相同的输入(embedding)。每个Field独立地embedding到相同的维度,大大减少了网络参数。Field到embedding层的映射向量恰好是FM层学习到的向量。 deep FM的优点: 1)不需要任何预训练 2)学习到了低维和高维特征交叉 3)一个特征embedding的共享策略来避免特征工程 基于内容的推荐 《Content-Based Recommendation Systems》 基于内容做推荐的综述文献。 这个文章是篇综述,没有很深的理论。文章分析了数据分为了结构化的数据和非结构化的数据,然后介绍了常见的机器学习算法,如决策树,线性模型,kNN方法,朴素贝叶斯等等方法。很适合作为推荐系统及其相关机器学习方法的入门教材。 基于DNN的推荐 《Deep Neural Networks for YouTube Recommendations》谷歌神作,字字珠玑 Youtube推荐系统的比较老的解决方案,使用候选集生成网络和排序网络两部分。特征是用户embedding和视频embedding,加入了视频的曝光时间等特征作为训练。本来听起来是简单的解决方案,其实里面把推荐系统工程化的问题都一一介绍了,让我们更清楚地知道,线下模型训练的过程和线上服务过程分别怎么做的,多分类问题怎么加速等。值得仔细思考里面的每一步做法的用意。 推荐系统架构: 候选集生成网络: 王喆对这篇文章进行了更详细的解读,并探讨了工程化的问题:https://zhuanlan.zhihu.com/p/52169807 基于标签的推荐 《Tag-Aware Recommender Systems: A State-of-the-art Survey》综述。 原本以为基于标签的推荐很简单,其实我错了,这个综述我就没看太懂。不过基于标签的推荐在实践里还是挺重要的,比如用户给主播打的标签可以用作推荐。 文章指出标签的作用: 1.反映用户的喜好 2.表达了物品的语义信息,来帮助评估潜在的用户质量 3.标签之间的重复出现的情况表现了用户的社区和物品的聚类情况。 因此,标签可以帮助解决冷启动问题。 1.基于网络的模型 2.基于张量的模型 3.基于主题的模型(LDA) 基于自编码器 《AutoRec: Autoencoders Meet Collaborative Filtering》 《Training Deep AutoEncoders for Collaborative Filtering》NVIDIA的文章,偏向于工程实现 《Deep Collaborative Autoencoder for Recommender Systems:A Unified Framework for Explicit and Implicit Feedback》 《Collaborative Denoising Auto-Encoders for Top-N Recommender Systems》对推荐系统的归纳很好,公式很详细。 这几篇文章的思想基本一样,本质都是协同过滤。优化的目标在自编码器的基础上稍作修改,优化目标里只去优化有观测值的数据。 Item2Vec 《Item2Vec: Neural Item Embedding for Collaborative Filtering》微软的开创性的论文,提出了Item2Vec,使用的是负采样的skip-gram 《Item2Vec-based Approach to a Recommender System》给出了开源实现,使用的是负采样的skip-gram 《From Word Embeddings to Item Recommendation》使用的社交网站历史check-in地点数据预测下次check-in的地点,分别用了skip-gram和CBOW 固定窗口的skip-gram的目标是最大化每个词预测上下文的总概率: 使用shuffle操作来让context包含每个句子中所有其他元素,这样就可以使用定长的窗口了。 上下文感知模型 《A Context-Aware User-Item Representation Learning for Item Recommendation》 这个文章提出,以前的模型学到的用户和物品的隐层向量都是一个静态的,没有考虑到用户对物品的偏好。本文提出了上下文感知模型,使用用户的评论和物品总评论,通过用户-物品对进行CNN训练,加入了注意力层,摘要层,学习到的是用户和物品的联合表达。更倾向于自然语言处理的论文,和传统的推荐模型差距比较大。 基于视觉的推荐 1.《Telepath: Understanding Users from a Human Vision Perspective in Large-Scale Recommender System》京东最近公开的推荐系统,通过研究商品的封面对人的影响进行推荐 这个文章参考大脑结构,我们把这个排序引擎分为三个组件:一个是视觉感知模块(Vision Extraction),它模拟人脑的视神经系统,提取商品的关键视觉信号并产生激活;另一个是兴趣理解模块(Interest Understanding),它模拟大脑皮层,根据视觉感知模块的激活神经元来理解用户的潜意识(决定用户的潜在兴趣)和表意识(决定用户的当前兴趣);此外,排序引擎还需要一个打分模块(Scoring),它模拟决策系统,计算商品和用户兴趣(包括潜在兴趣和当前兴趣)的匹配程度。兴趣理解模块收集到用户浏览序列的激活信号后,分别通过DNN和RNN,生成两路向量。RNN常用于序列分析,我们用来模拟用户的直接兴趣,DNN一般用以计算更广泛的关系,用来模拟用户的间接兴趣。最终,直接兴趣向量和间接兴趣向量和候选商品激活拼接在一起,送往打分模块。打分模块是个普通的DNN网络,我们用打分模块来拟合用户的点击/购买等行为。最终这些行为的影响通过loss回馈到整个Telepath模型中。在图右侧,还引入了类似Wide & Deep网络的结构,以增强整个模型的表达能力。 2.《Visually Explainable Recommendation》可视化地可解释推荐模型 这个文章放在基于视觉的推荐的原因是,比较新奇的地方在于提取了商品封面的特征,并融合到了推荐和推荐解释之中。本文的基础模型使用商品的封面通过预训练好的VGG网络转化为图像向量。对特征进行加权求和之后的结果与商品的向量merge,再与用户的向量内积求总的向量结果,把该结果进行和用户是否购买的真实数据求交叉熵,优化该Loss.文章指出该模型最后训练的结果可以用推荐,也可以用注意力权重来做推荐解释。 本文还提出了进一步的模型Re-VECF。该模型使用商品的用户评论结合图像、用户和商品作单词预测训练GRU。加入用户评论的好处是可以提高推荐的表现、文本评论可能隐含着用户对商品封面重要的偏好。该模型能更好的做出推荐结果和推荐解释。 基于RNN的推荐 《Session-based Recommendations with Recurrent Neural Networks》 2016年的文章,GRU4Rec,使用每个会话中用户的行为记录进行训练。 《Recurrent Neural Networks with Top-k Gains for Session-based Recommendations》2018年的新文章,对上文进行了优化;原理相同的。 基于RNN的推荐也是源于一个朴素的假设:对于用户的行为序列,相邻的元素有着相近的含义。这种假设适合基于会话的推荐系统,如一次电子商务的会话,视频的浏览记录等。相对于电影推荐,基于会话的推荐系统跟看中短期内用户的行为。 论文想法在于把一个 session 点击一系列 item 的行为看做一个序列,用来训练一个 RNN 模型。在预测阶段,把 session 已知的点击序列作为输入,用 softmax 预测该session下一个最有可能点击的item。 这个文章里用的是GRU,目标是优化pair-wise rank loss。 有一个不错的论文解读文章:http://www.cnblogs.com/daniel-D/p/5602254.html 基于图的推荐 《Pixie: A System for Recommending 3+ Billion Items to 200+ Million Users in Real-Time》社交网站的图推荐,2017年 本文介绍了 Pinterest 的 Pixie 系统,主要针对他们开发的随机游走和剪枝算法,此外系统本身基于 Stanford Network Analysis Platform 实现。 基于树的推荐 《Learning Tree-based Deep Model for Recommender Systems》淘宝的推荐系统,2018年最新发布 基于树的推荐是一种比较新奇的一种推荐算法,其设计的目的主要是解决淘宝的巨大的数据问题,给出了一种能线上服务的实时推荐系统的模型。此外,本文证明了此模型在MovieLens-20M和淘宝自己的用户数据上的准确、召回、新奇性都比传统方法好。 采用的数据是隐式反馈,本模型提供几百个候选集,然后实时预测系统会进行排序策略。 树的作用不仅仅是作为索引使用,更重要的是把海量的数据进行了层次化组织。训练过程是如果用户对某个物品感兴趣,那么最大化从该物品节点到根节点的每个节点的联合概率。该路径上的每个节点都和用户有相关性,树的结构从底向上表现出了用户物品的相似性和依赖性。 如下图所示,左侧的三层全连接学习到用户的向量表示,右侧的树结构学到了节点的表示,最后通过二分类来训练出用户是否对该节点感兴趣。训练的损失函数是最小化一个用户对每个采样了的节点的交叉熵。(树结构类似于Hierarchical softmax,也同样使用了负采样等。) 公司的推荐系统的发展历程 《Related Pins at Pinterest: The Evolution of a Real-World Recommender System》Pinterest的推荐系统发展历程 这个推荐系统主要用到的是随机游走的图算法,Pin2Vec,Learning to Rank等方法。只介绍了思想,没有公式和算法。可以直接看解读:http://blog.csdn.net/smartcat2010/article/details/75194918 2013年的时候,推荐系统主要基于Pin-Board的关联图,两个Pin的相关性与他们在同一个Board中出现的概率成正比。 在有了最基本的推荐系统后,对Related Pin的排序进行了初步的手调,手调信号包括但不局限于相同Board中出现的概率,两个Pin之间的主题相似度,描述相似度,以及click over expected clicks得分。 渐渐地,发现单一的推荐算法很难满足产品想要优化的不同目标,所以引入了针对不同产品需求生成的候选集(Local Cands),将排序分为两部分,机器粗排和手调。 最后,引入了更多的候选集,并且提高了排序部分的性能,用机器学习实现了实时的个性化推荐排序。 数据集 《Indian Regional Movie Dataset for Recommender Systems》提供了印度本土的电影观看数据集 参考资料 『我爱机器学习』FM、FFM与DeepFM Factorization Machines 学习笔记 转载自https://github.com/fuxuemingzhu/Summary-of-Recommender-System-Papers

  • 1
  • 19
  • 20
  • 21
  • 27
前往