Python实现颜值预测

thbcm阅读(236)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python对照片中人脸进行颜值预测!!!

至于结果的可靠性…….

本人概不负责!!!

对结果不满意或者因为结果分数过低而想不开者,请自行联系xxxPh.D.。也就是此颜值预测算法的提出者!!!本人只是部分复现了他的算法!!!

以上和以下内容纯属玩笑,如有雷同,不甚荣幸。

相关文件

网盘下载链接: https://pan.baidu.com/s/1E_fc7PNaBHfMXNz3xLb12A

密码: 7nhm

所需工具

Python版本:3.5.4(64bit)

相关模块:

opencv_python模块、sklearn模块、numpy模块、dlib模块以及一些Python自带的模块。

环境搭建

(1)安装相应版本的Python并添加到环境变量中;

(2)pip安装相关模块中提到的模块。

例如:

若pip安装报错,请自行到:

http://www.lfd.uci.edu/~gohlke/pythonlibs/

下载pip安装报错模块的whl文件,并使用:

pip install whl文件路径+whl文件名安装。

例如:

(本人已在相关文件中提供了编译好的用于dlib库安装的whl文件——>因为这个库最不好装)

参考文献链接

【1】xxxPh.D.的博客

Computer Vision for Predicting Facial Attractiveness

【2】华南理工大学某实验室

http://www.hcii-lab.net/data/SCUT-FBP/EN/introduce.html

主要思路

(1)模型训练

用了PCA算法对特征进行了压缩降维;

然后用随机森林训练模型。

数据源于网络,据说数据“发源地”就是华南理工大学某实验室,因此我在参考文献上才加上了这个实验室的链接。

(2)提取人脸关键点

主要使用了dlib库。

使用官方提供的模型构建特征提取器。

(3)特征生成

完全参考了xxxPh.D.的博客。

(4)颜值预测

利用之前的数据和模型进行颜值预测。

使用方式

有特殊疾病者请慎重尝试预测自己的颜值,本人不对颜值预测的结果和带来的所有负面影响负责!!!

言归正传。

环境搭建完成后,解压相关文件中的Face_Value.rar文件,cmd窗口切换到解压后的*.py文件所在目录。

例如:

打开test_img文件夹,将需要预测颜值的照片放入并重命名为test.jpg

例如:

若嫌麻烦或者有其他需求,请自行修改:

getLandmarks.py文件中第13行。

最后依次运行:

train_model.py(想直接用我模型的请忽略此步)

getLandmarks.py

getFeatures.py

Predict.py

使用演示




Python预测NBA比赛结果

thbcm阅读(271)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python简单地预测一下NBA比赛结果。。。

这大概就叫蹭热度吧。。。

毕竟貌似今天朋友圈都在刷NBA相关的内容。。。

虽然我并不能看懂。。。

但这并不妨碍我瞎预测一波。。。

So,

以下内容纯属瞎玩,如有雷同,算我倒霉。。。

NBA忠实球迷请自动忽略不好结果。。。

相关文件

网盘下载链接: https://pan.baidu.com/s/1EwdkonbYY54AxnIgqx9yYA

密码: 1n93

主要思路

(1)数据选取

获取数据的链接为:

https://www.basketball-reference.com/

获取的数据内容为:

每支队伍平均每场比赛的表现统计;

每支队伍的对手平均每场比赛的表现统计;

综合统计数据;

2016-2017年NBA常规赛以及季后赛的每场比赛的比赛数据;

2017-2018年NBA的常规赛以及季后赛的比赛安排。

(2)建模思路

主要利用数据内容的前四项来评估球队的战斗力。

利用数据内容的第五项也就是比赛安排来预测每场比赛的获胜队伍。

利用方式为:

数据内容的前三项以及根据数据内容的第四项计算的Elo等级分作为每支队伍的特征向量。

Elo等级分介绍(相关文件中有):

为方便起见,假设获胜方提高的Elo等级分与失败方降低的Elo等级分数值相等。

另外,为了体现主场优势,主场队伍的Elo等级分在原有基础上增加100。

(3)代码流程

数据初始化;

计算每支队伍的Elo等级分(初始值1600);

基于数据内容前三项和Elo等级分建立2016-2017年常规赛和季后赛中每场比赛的数据集;

使用sklearn中的LogisticRegression函数建立回归模型;

利用训练好的模型对17-18年常规赛和季后赛的比赛结果进行预测;

将预测结果保存到17-18Result.CSV文件中。

开发工具

Python版本:3.5.4

相关模块:

pandas模块、numpy模块、sklearn模块以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

使用演示

在cmd窗口运行Analysis_NBA_Data.py文件即可:

结果:

更多

文章的初衷是为了让公众号推送的关于Python的小项目涉及的应用领域更加丰富多彩。从而激发部分Python初学者的学习热情,仅此而已。

这篇文章的技术含量并不高,模型简单,数据处理方式也比较随意。。。

可以优化的地方大概包括:

增加训练数据(如多利用几年数据);

优化训练模型(如sklearn中其他机器学习方法或者利用深度学习框架搭建相应的网络进行模型训练)。

Python实用教学:如何用Python玩转各大网站

thbcm阅读(168)

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

Hi~,各位小伙伴,Python是目前编程语言中的主流语言之一,也是公认最容易入门的编程语言,因为Python语言近几年的火爆,有很多小伙伴都开始学习这门语言。

编程语言学习,最重要的是“多看代码,多敲代码”,这样才是学习编程的王道。

这次给各位小伙伴带来就是Python中比较好玩的几个实用教学,分两大块,分别是:
爬虫技术
机器学习,这次实用教学是使用
Python3版本。

其中爬虫技术处于进阶的课程,学完基础和微课后,就可以自己动手去爬取各大网站的数据。

而机器学习则属于比较高阶的知识,需要有一定的Python专业知识。


温馨提示:本次教学属于进阶教学,建议各位小伙伴最好先通过本站的Python视频课程与教程手册掌握基础部分后,再结合微课的练习,来进行挑战。
Python3教程手册
点击链接进入学习模式


Python3微课
点击链接进入学习模式
Python3零基础入门到爬虫实战:
点击链接学习视频课程

学习过程中遇到任何问题,你都可以点击右侧链接提交你的疑问:
https://www.w3cschool.cn/question/  你也可以在你的云笔记中上传代码:
https://www.w3cschool.cn/my/note


热门实用小项目:

如何用Python查看微信撤回消息


如何用Python抓取购物网站妹纸们bra的信息
Python批量下载抖音视频


Python制作王者荣耀出装小助手

爬虫类:

(一)微信

如何用Python查看微信撤回消息

(二)抢火车票

教你如何用Python实现抢火车票功能(上)

教你如何用Python实现抢火车票功能(中)

教你如何用Python实现抢火车票功能(下)

(三)网易云

教你如何用Python爬取网易云音乐评论

利用Python制作网易云音乐下载器

Python批量下载网易云课堂视频

(四)豆瓣

教你如何使用Python爬取豆瓣读书数据

(五)直播平台

Python获取斗鱼弹幕数据实战教程

Python获取PandaTV弹幕数据

(六)美团、猫眼、百度

Python爬取美团美食板块商家数据

教你如何使用Python抓取猫眼电影数据

Python净化百度搜索结果

(七)抖音

Python批量下载抖音视频

【Python】百行代码批量下载抖音视频

(八)腾讯

Python制作王者荣耀出装小助手

Python爬取QQ空间信息(上)

Python爬取QQ空间信息(下)

(九)音乐

Python制作酷狗和QQ音乐下载器

Python下载音悦台MV

(十)B站

【Python】下载B站视频实战课程

综合类:

Python制作音乐下载器

利用Python制作音乐下载器

【更新】使用Python制作视频下载器

爬虫类:

Python抓取并分析天气数据

利用Python爬取房价信息并分析

用Python抓取某东购买记录并统计MM的bra大小(附代码)

【Python】分析鱼C论坛热帖

Python爬取并简单分析鱼油数据

深度/机器学习类:

学会利用Python实现“美颜”功能

Python简单品读小说

Python实现颜值预测

Python预测NBA比赛结果

Python制作AI且mini版飞机大战

Python实现简单的换脸术

Python+OpenCV实现猫脸检测

【Python】分析个人音乐收藏

【Python】垃圾邮件识别

Python玩CartPole(DQN)

Python实现简单的机器翻译模型

学会Python实现学写作

【Python】RNN实现文本生成

Python简单实现图像风格迁移

【Python】FCN+滤波器实现细胞检测

【Python】利用GAN生成MNIST数据集

【Python】利用GAN生成动漫头像

python学画画(上)

python学画画(下)

利用Python绘制了一些有意思的图案

python来画画第二弹!

Python实现地理信息可视化

Python实时监控CPU使用率

Python简单分析高考数据

【Python】利用邮件远程控制自己电脑

游戏类:

python制作小游戏(一)

python制作一个类似八音符的小游戏

python制作拼图小游戏

Python制作简单的滑雪游戏

Python制作仿“经典90坦克大战”的小游戏

Python制作仿“FlappyBird”的小游戏

Python实现AI版贪吃蛇


Python实现AI五子棋【初版】

其他类:

Python处理手写笔记

Python制作简易浏览器
Python实现浪漫表白

Python制作简易SSH登录工具
Python简单实现隐写术
Python实现简单的车牌检测
【Python+VBA】在Excel中生成小姐姐

(未完待续)

Python制作AI且mini版飞机大战

thbcm阅读(217)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

大家新年快乐呀~~~

T_T

大年三十终于偷得半日清闲想起来有些日子没更公众号了~~~

So,来更一波文章hhhhh~~~

之前貌似水了好几篇以Python能干嘛为主要目的的文章,那么就再来水一篇吧~~~

这篇文章的技术含量依旧不高,算是AI入门级的内容,idea源自于(T_T我也忘了)。。。

纯Python实现,不依赖于任何深度学习框架。。。

算了,直接进入正题吧!

相关文件

百度网盘链接: https://pan.baidu.com/s/1UIV51eSD3ixqAuVqRC7z8g

密码: fmtv

参考文献

(1)neuro-evolution

https://en.wikipedia.org/wiki/Neuroevolution

主要思路

游戏思路:

让我方飞机自动躲避屏幕上方飞来的敌机。

实现方式:

(1)利用简单的神经网络来决定飞机的行动方式;

(2)利用neuro-evolution算法来提高神经网络的性能,该算法核心类似于达尔文的进化论,随机生成种群后选择优秀个体进行杂交变异获得新的种群,如此反复循环。

具体思路和实现方式详见源代码。

开发工具

Python版本:3.5.4

相关模块:

win_unicode_console模块、pygame模块以及一些Python自带的模块。


环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。


使用演示

在cmd窗口运行main.py文件即可:

若效果不佳,请自行修改NeuroEvolution.py文件中相关参数,如下图所示:

当然你也可以修改main.py文件中敌机的生成位置:

飞机最后会在不生成敌机的位置区域运动:

更多

算法真的真的写的很简陋且丑。。。

So,

没有任何实际使用价值。。。

有兴趣的小伙伴可以进一步优化和扩展这个AI游戏,当然也欢迎后台留言交流。。。

可优化的内容举例:

(1)优化新基因的生成方式;

(2)相关参数随着进化过程不断改变等。


Python+遗传算法拟合图像

thbcm阅读(186)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

日子真是…

发现不知不觉又好多天没发文章了。

恰巧看到一个关于遗传算法的很有意思的应用,利用遗传算法拟合图像,于是过来分享一波。

让我们愉快地开始吧~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1VMyY7u2C9Zq0vlMJZE1GSw

密码: ec77

开发工具

Python版本:3.6.4

相关模块:

PIL模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

参考资料

50个半透明多边形重现蒙娜丽莎:

http://alteredqualia.com/visualization/evolve/

科学松鼠会《遗传算法》:

http://songshuhui.net/archives/10462

原理简介

改编参考资料中的故事:

很久很久以前,海岸边生活着一群扇贝,它们衣食不愁,有房有车。但好景不长,人类的到来打破了它们原本无忧无虑的生活。

每隔一段时间,人类就会挖走它们之中的一部分。不过,这些人不喜欢贝壳花纹长得像哈士奇的扇贝,所以他们总是选择那些长得比较不像哈士奇的扇贝

这种状况持续了好几万年。这个时候,神奇的事情发生了:所有的扇贝贝壳上都印着哈士奇

遗传算法——元启发式算法之一:

首先致敬一波达尔文?

简单而言,遗传算法模拟了大自然中种群在选择压力下的演化过程,从而得到了对应问题的近似解。

具体而言,就是生物体长什么样子很大程度上是由染色体上的基因决定的。如果我们利用n个多边形组成一只哈士奇的话,我们同样也可以认为哈士奇长什么样子由这些多边形的具体位置和颜色决定,也就是说这些多边形可以被看作是哈士奇的“基因”。

当然,需要注意的是,这个算法得到的只是问题的近似解而非精确解,且存在基因过早同一化等问题。

来自http://xkcd.com/534/的冷笑话:

算法设计:

遗传算法只是一个框架,对于具体问题当然需要设计具体的算法。

时间关系,本次算法设计一切从简。

Step1:

随机生成100幅与原始图像大小相同的噪声图像。

Step2:

种群变异(变异概率50%),即在100幅生成的图像上加一些随机噪声。

Step3:

计算与原始图像的差异度。计算公式为:

Step4:

保留与原始图像差异度较低的生成图像,并让它们交叉融合生成新的图像以使得种群的数量保持不变。

Step5:

循环执行Step2-4。

具体实现过程详见相关文件中的源代码。

使用演示

在cmd窗口运行Genetic.py文件即可。

部分参数解释:

以chrome浏览器图标(大小为30×30)为例:

【图像较大的话时间花销比较大T_T】

可以看到还是有那么点意思的。

有兴趣的同学可以多跑几轮,看看几万轮之后的结果是什么,时间关系我就不继续跑了。

更多

参考资料中的第一个链接是一个遗传算法拟合蒙娜丽莎的在线测试系统。

其最终的结果为:

当然还有其他图案的:

emmm,比我的结果好很多的样子。

有空再优化我自己写的东西吧~~~


Python+OpenCV实现猫脸检测

thbcm阅读(275)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

导语

利用Python+OpenCV实现猫脸检测。

使用的是OpenCV内置的Viola-Jones目标检测框架来实现猫脸检测,感觉挺有意思的。

让我们愉快地开始吧~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1AZ8t49wtG1GpDb4fj7XGQA

密码: v55f

开发工具

Python版本:3.6.4

相关模块:

cv2模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

为了进一步提高公众号的文章质量,我决定来简单地讲一讲Haar分类器,也就是Viola-Jones识别器。

详细的原理说明可参考相关文件中的两篇论文:

Rapid Object Detection using a Boosted Cascade of Simple Features;

Robust Real-Time Face Detection.

(1)Haar-like特征

Haar-like矩形特征是用于物体检测的数字图像特征,由两个或者多个相邻的黑白矩形组合而成,矩形的特征值是白色矩形的灰度值之和减去黑色矩形的灰度值之和。一般地,我们认为矩形特征对一些简单的图形结构(线段、边缘)等较为敏感:

具体到猫脸检测而言,我们认为把这样的矩形放到一个非猫脸区域后获得的特征值与放到一个猫脸区域后获得的特征值是不同的

利用上述基于特征的检测算法,不仅能够编码特定区域的状态,而且效率高于基于像素的检测算法。

(2)积分图

下面我们来考虑一下如何计算矩形的特征值。对图像中的任意一点A(x, y),定义该点的积分图为其左上角的所有像素值之和,即:

因此,要计算矩形模板的特征值,也就是计算两个区域之间的像素和之差,只需要用特征区域端点的积分图来进行简单的加减运算就可以了:

(3)Haar分类器

Haar分类器是一个监督学习分类器,要进行目标检测,首先要对图像进行直方图均衡化和归一化处理,然后检测里面是否包含要检测的物体。

流程框架图为(Haar分类器本质上由Haar特征提取器、离散强分类器以及强分类级联器组成):

Haar分类器使用Adaboost算法,但是把它组织为了筛选式的级联分类器,在任意一级计算中,一旦获得输入内容不在检测类中的结论,便终止计算,只有通过所有级别的分类器,才可认为检测到了目标物体,以此来提高检测效率。

关于AdaBoost算法,我就不展开介绍了,有兴趣的同学可以自己查找相关资料进行学习。以后有时间我再对其进行详细的介绍。

(4)适用范围

适用于“基本刚性”的物体检测,如脸、汽车、人体和自行车等等。

(5)总结

Viola-Jones目标检测框架的核心思想是通过滑动窗口扫描图像(多尺度的扫描),然后将每个窗口的Haar特征值输入到筛选式的级联分类器中来判断该窗口内是否含有目标物体以实现目标检测。

具体实现

OpenCV中内置了基于Viola-Jones目标检测框架的Haar分类器,并提供了猫脸检测预训练好的模型。因此实现起来十分简单。

具体实现过程详见相关文件中的源代码。

效果演示

使用方式:

修改源代码中的图片名为自己需要检测的图片:

在cmd窗口运行DetectCatFace.py文件即可。

效果:

原图1:

检测结果1:

原图2:

检测结果2(并不能很好地区分狗狗和猫咪):

That’all~

更多

代码截止2018-06-28测试无误。

之后会陆续推出基于深度学习的目标检测算法案例,它们的检测效果还是非常棒的~

【Python】分析个人音乐收藏

thbcm阅读(177)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

偶遇了一篇文章:

Mapping Your Music Collection

https://www.christianpeccei.com/musicmap/

感觉颇有缘分,似有命中注定之感,于是想着用一些简单的音频处理、机器学习和可视化技术,简单地分析一下自己的音乐收藏。当然我对乐理知识一无所知,所以分析将不涉及任何与乐理知识相关的内容,纯属“瞎玩”性质的分析。T_T

那么就让我们愉快地开始吧~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/16lZb3JbHeC__k_oP8RMXUg

密码: nxpt

相关工具

Python版本:3.6.4

相关模块:

numpy模块;

sklearn模块;

matplotlib模块;

以及一些Python自带的模块。

mpg123:

1.25.10

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块;

将相关文件中提供的mpg123.zip文件解压后添加到环境变量中,例如:


开始分拆

方便起见,所有的音乐文件均先转为.wav格式后再做分析。

从最简单的开始吧!让我们先来看看不同歌手的声音波形图:

周杰伦:

感觉波形图好混乱,似乎是数据量太大引起的,于是我打算换一个策略,只画出每首歌曲前10秒的波形图来作比较,毕竟良好的开端是成功的一半?

周杰伦:

许嵩:

陈奕迅:

Interesting…

好像还是挺有意思的,但并看不出什么端倪来的样子,同一个歌手唱的歌的波形结构之间的差异和不同歌手唱的歌的波形结构之间的差异仿佛都挺大的。虽然并没有规定说同一个歌手唱的歌的波形结构之间的差异一定很小,不同歌手唱的歌的波形结构之间的差异一定很大。

好吧,有些混乱,还是随意点的好。那么我们来尝试性地提取一下歌曲的特征吧。我们打算提取的歌曲特征有:

① 歌曲波形的统计矩,包括均值、标准差、偏态和峰态,同时,我们通过平滑窗(递增平滑,长度分别为1,10,100,1000)来获取这些特征在不同时间尺度上的表现;

② 为了体现信号的短时变化,我们可以计算一下波形一阶差分幅度的统计矩,同样也通过平滑窗来获取这些特征(均值、标准差、偏态和峰态)在不同时间尺度上的表现;

③ 最后,我们计算一下波形的频域特征,这里我们只计算歌曲在不同频段(将整个频段均分为10份)的能量占比,不过直接对歌曲的波形数据作快速傅里叶变换的话其计算量过于庞大了,因此先让波形数据通过长度为5的平滑窗再对其作快速傅里叶变换。

综上所述,我们已经获得了歌曲的42个特征值。下面我们尝试利用这些特征值对我这几天下载的43首歌曲进行k均值聚类。首先,为了便于结果的可视化,我们利用PCA对数据进行降维(42维特征到2维特征),为了方便起见,我们直接调库(sklearn)实现,结果打印如下:

OK,接下来我们就可以对降维后的数据进行聚类了,这里我们将自己实现一下k均值聚类算法而不是简单地调库,最终的聚类结果如下图所示(k=4):

接下来我们尝试先对歌曲的42个特征值进行归一化处理,然后再进行上面的PCA和聚类操作,同时令k=3,最终的聚类结果如下图所示:

Emmm,好像效果更差了。

不过我发现我喜欢了8年的歌“尾戒”竟然一枝独秀了!还是很棒的,哈哈~~~

当然,这里有一个问题,歌曲的42个特征值是人工选取的,也许并不很好的表现出歌曲特征,且这些特征之间的相关系数是不为0的,也就是存在冗余特征。

https://www.christianpeccei.com/musicmap/一文利用了遗传算法从42个特征值中筛选出了18个特征值作为歌曲最终的特征向量,其结果如下:


懒得复现了,直接用他的结论重新进行聚类,结果如下(k=3):

Emmm,好像半斤八两。

那就这样吧,就当学点基础的音频处理、机器学习和可视化技术了。

所有源代码和素材均在相关文件中提供了,End。

【Python】垃圾邮件识别

thbcm阅读(181)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用简单的机器学习算法实现垃圾邮件识别。

让我们愉快地开始吧~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1Hsno4oREMROxWwcC_jYAOA

密码: qa49

数据集源于网络,侵歉删。

开发工具

Python版本:3.6.4

相关模块:

scikit-learn模块;

jieba模块;

numpy模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

逐步实现

(1)划分数据集

网上用于垃圾邮件识别的数据集大多是英文邮件,所以为了表示诚意,我花了点时间找了一份中文邮件的数据集。数据集划分如下:

训练数据集:

7063封正常邮件(data/normal文件夹下);

7775封垃圾邮件(data/spam文件夹下)。

测试数据集:

共392封邮件(data/test文件夹下)。

(2)创建词典

数据集里的邮件内容一般是这样的:

首先,我们利用正则表达式过滤掉非中文字符,然后再用jieba分词库对语句进行分词,并清除一些停用词,最后再利用上述结果创建词典,词典格式为:

{“词1”: 词1词频, “词2”: 词2词频…}

这些内容的具体实现均在“utils.py”文件中体现,在主程序中(train.py)调用即可:

最终结果保存在“results.pkl”文件内。

大功告成了么?当然没有!!!

现在的词典里有52113个词,显然太多了,有些词只出现了一两次,后续特征提取的时候一直空占着一个维度显然是不明智的做法。因此,我们只保留词频最高的4000个词作为最终创建的词典:

最终结果保存在“wordsDict.pkl”文件内。

(3)特征提取

词典准备好之后,我们就可以把每封信的内容转换为词向量了,显然其维度为4000,每一维代表一个高频词在该封信中出现的频率,最后,我们将这些词向量合并为一个大的特征向量矩阵,其大小为:

(7063+7775)×4000

即前7063行为正常邮件的特征向量,其余为垃圾邮件的特征向量。

上述内容的具体实现仍然在“utils.py”文件中体现,在主程序中调用如下:

最终结果保存在“fvs_%d_%d.npy”文件内,其中第一个格式符代表正常邮件的数量,第二个格式符代表垃圾邮件的数量。

(4)训练分类器

我们使用scikit-learn机器学习库来训练分类器,模型选择朴素贝叶斯分类器和SVM(支持向量机):

(5)性能测试

利用测试数据集对模型进行测试:

结果如下:


可以发现两个模型的性能是差不多的(SVM略胜于朴素贝叶斯),但SVM更倾向于向垃圾邮件的判定。

That’s all~

完整源代码请参见相关文件。

更多

没有具体介绍模型原理,因为后续可能会出一个系列,比较完整详细地介绍一下机器学习里的常用算法。所以,就先这样吧~

Python玩CartPole(DQN)

thbcm阅读(162)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

利用Python搭建简单的深度强化学习网络(DQN)玩CartPole这个小游戏。。。

这是来自PyTorch官方教程的一个简单实例。

感觉还是挺有意思的~~~

直接进入正题吧~~~

内容较长,做好心理准备~~~

相关文件

百度网盘下载链接: https://pan.baidu.com/s/1G-Z_Mpdd4aXnsTqNKvZbZw

密码: xf7x

参考文献

官方英文教程链接:

http://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html

另外:

对英文文献阅读有困难的同学也不必担心,我已经把这个教程翻译为中文放到了相关文件中。

同时,我也在微信公众号“Charles的皮卡丘”底部菜单栏“资料共享”→“整理汇总”中分享了(即强化学习实例1)。

整理汇总”中也有翻译自官方文档的PyTorch60分钟快速入门教程,以及我自己结合一些讲座和tutorials整理的强化学习基础教程。

开发工具

系统:Windows10

Python版本:3.6.4

相关模块:

gym模块;

numpy模块;

matplotlib模块;

PIL模块;

torch模块;

torchvision模块;

以及一些Python自带的模块。

其中PyTorch版本为:

0.3.0

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

补充说明:

PyTorch暂时不支持直接pip安装。

有两个选择:

(1)安装anaconda3后在anaconda3的环境下安装(直接pip安装即可);

(2)使用编译好的whl文件安装,下载链接为:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch

原理介绍

(1)增强学习

为了便于大家更好地理解,我决定从增强学习开始讲起,当然只讲其主要思想,不作深入讨论。

在AI领域,我们一般使用Agent来表示一个具备行为能力的物体,例如最近比较火的无人车。那么增强学习考虑的问题就是Agent和环境environment之间交互的任务。比如假设我们有一只AI皮卡丘:

现在我们要让这只皮卡丘去捡左上角的饭团。那么皮卡丘周围的物体包括饭团就是环境,皮卡丘通过外部的比如摄像头来感知环境(不妨假设皮卡丘的眼睛就是一对摄像头),然后皮卡丘需要输出一系列的动作来实现捡起饭团这个任务。

当然你也可以让皮卡丘去完成其他任务。

不过,不管是什么样的任务,都包含了一系列的动作action观察observation还有反馈值Reward

所谓的Reward就是Agent执行了动作与环境进行交互后,环境会发生变化,变化的好与坏就是Reward来表示的。比如上面的例子:

如果皮卡丘离饭团变近了,那么Reward就应该是正的,否则就应该是负的。

接下来这里用了Observation观察一词而不是环境那是因为Agent不一定能得到环境的所有信息,比如皮卡丘上的摄像头就只能得到某个特定角度的画面。因此,只能用Observation来表示Agent获取的感知信息。事实上,人与环境交互也是如此。

在每个时间点,Agent都会从可以选择的动作集合A中选择一个action执行。这个动作集合可以是连续的也可以是离散的,动作集合的数量将直接影响整个任务的求解难度。

那么知道了整个过程,任务的目标就出来了,那就是要能获得尽可能多的Reward。没有目标,控制也就无从谈起,因此,获取Reward就是一个量化的标准,Reward越多,就表示执行地越好。每个时间片,Agent都是根据当前的观察来确定下一步的动作。每次的观察就作为Agent的所处状态state。因此,状态state和动作Action存在映射关系,也就是一个state可以对应一个action,或者对应不同动作的概率(常常用概率表示)。那么state到action的过程就称之为一个策略Policy。当然,也可以是之前的一系列的状态动作集合到action的映射。

综上所述,增强学习的任务就是找到一个最优的策略policy从而使reward最多。

当然,我们一开始并不知道最优的策略是什么,因此往往从随机的策略开始,使用随机的策略进行试验,就可以得到一系列的状态、动作和反馈。也就是一系列的样本Sample。增强学习的算法就是需要根据这些样本来改进policy,从而使得得到的样本的reward更好。正是这种让reward越来越好特性,该算法才被称为增强学习。

(2)Q-Learning

由于增强学习的样本是一个时间序列,因此将增强学习的问题模型化,就引入了马尔科夫决策过程。

简单的说,就是我们可以假设:

Agent的下一个状态仅取决于当前的状态和当前的动作。注意这里的状态是完全可观察的全部的环境状态。也就是说,只要我们有一个初始状态,后继状态就是全部确定的(绝大多数的增强学习都可以模型化为马尔科夫决策问题。

当然现实情况环境一般不完全可观察,然后有一些随机性,那么只能进行估计。

既然一个状态对应一个动作,或者动作概率,而有了动作,下一个状态也就确定了。这就意味着每个状态可以用一个确定的值来进行描述。可以由此判断一个状态是好的状态还是不好的状态。比如之前的皮卡丘往左上角走肯定是好的状态,往右下角走肯定是不好的状态。那么状态的好坏其实等价于对未来回报的期望。因此我们可以引入回报Return来表示某个时间的状态将具备的回报。另外我们再引入一个概念估值函数,用估值函数来表示一个状态未来的潜在价值,也就是变成了皮卡丘向左上角看感觉那边是饭团然后左上角的估值就高了。也就是说估值函数是回报的期望值。定义出估值函数接下来就是如何求解的问题了

这部分我决定一带而过而不是放上一堆公式来吓人。

实际上,求解估值函数只需要从定义出发进行简单的推导即可。最后可以证明估值函数是可以通过迭代来进行计算的。

考虑到每个状态之后都有多种动作可以选择,每个动作之下的状态又都不一样,我们更关心某个状态下的不同动作的估值。即根据每个动作的估值来选择最好的一个去执行,这就是动作估值函数Q。需要注意的是这里的reward是执行完动作之后得到的reward,而之前的reward是state对应的reward即多种动作对应的reward的期望值。

显然,现在我们要求解的是最优动作估值函数。这可以利用估值迭代的方法进行求解,其核心思想是每次根据新得到的reward和原来的Q值来更新现在的Q值。Q-Learning的思想完全根据估值迭代得到。

但是实际情况下,我们没有办法遍历所有的状态还有所有的动作,我们只能得到有限的样本,于是Q-Learning提出了一种类似梯度下降的方法来减少估值误差,即每次朝着目标迈进一小步,最后可以收敛到最优的Q值。

(3)DQN

说白了就是用一个深度神经网络来作为Q值的网络。

(4)最后来看我们的CartPole小游戏

我们需要控制下面的cart移动使连接在上面的杆保持垂直不倒。这个任务简化到只有两个离散动作,即向左或者向右用力。

如果杆子过于倾斜,或者cart移出一个范围,那么游戏结束。

具体的建模和实现过程可以参考我翻译的官方文档。

这里我只讲下主要思路。

一开始,我们什么也不知道,也就是DQN网络中的超参数是完全随机的。实践是检验真理的唯一标准,我们需要实践,因此我们将根据当前的状态选择下一步的action,action的选择方式为:

① 利用DQN网络选择一个action(当然此时的DQN网络没啥子用,因为它所有的超参数都是随机生成的);

② 随机选择一个action。

为什么要有随机选择呢?简单而言就是为了探索新世界,如果我们一味地跟着模型走,而没有创新,显然我们永远也不可能进步。

选择了action之后,我们就可以得到environment反馈的reward。同时我们也进入了新的state。

如果新的状态并没有使游戏over,那么我们就继续。

如果游戏over了,那么我们就重新开始。

在这个过程中,我们DQN网络是一直在更新的,更新的目标当然是要使得在不同的state下采取的action获得最佳的reward。

这样,除了第一次DQN是在瞎选外,之后的选择还是有一定的经验根据的。

随着一次又一次的行动,我们的模型最终会变得越来越优秀,毕竟失败是成功之母嘛,吸取经验教训还是很重要的吧~~~

That’s ALL。

使用演示

一般的CartPole(即完全随机行动):

我们可以发现它毫无章法,很快就Over了。

DQN玩CartPole(参照官网写的):

刚开始训练时:

训练一段时间后:

这是我根据官网教程写的源码,做了比较详细的备注~~~

我们可以看到随着训练次数的增加,其存活下来的时间也呈上升趋势。

另外:

源代码中也提供了一份来自某YouTube主的源码,他精简了官网的源代码,供有需要者参考。

更多

T_T文章部分内容来源自我整理的DQN入门资料(资料基本都来自于国外相关学科的大佬讲座和一些tutorials)。

就这样吧,如果有什么不对的地方也可以给我留言,我会更正的~~~

Python破解Flappy Bird游戏

thbcm阅读(184)

本文转载至知乎ID:Charles(白露未晞)知乎个人专栏

下载W3Cschool手机App,0基础随时随地学编程
>>戳此了解

导语

昨天在看GitHub上深度学习方面stars较高的开源项目,于是发现了这个有趣的内容:

使用深度强化学习破解Flappy Bird游戏(深度Q-学习)。

相关文件

百度网盘下载链接: https://pan.baidu.com/s/19LgDHq0V3IpE1K5sfuug2g

密码: tqus

参考文献

内容主要参考自GitHub开源项目:

Using Deep Q-Network to Learn How To Play Flappy Bird

链接:

https://github.com/yenchenlin/DeepLearningFlappyBird

原理简介

此项目参考了深度增强学习中的深度Q学习算法,并表明了此学习算法可以推广到破解Flappy Bird游戏当中。也就是说,项目是利用了Q-learning的变体进行训练的,其输入是原始像素输出是估计之后行动的数值函数。

PS:

若对深度强化学习感兴趣,公众号相关文件中也提供了一篇名为Demystifying Deep Reinforcement Learning的论文供大家学习,这也是原作者强烈推荐的论文。

网络架构:

在此之前的预处理为:

(1)灰度化图像;

(2)图像大小调整为80×80;

(3)每4帧画面堆叠成一个80x80x4输入数组。

网络最终输出结果为2×1的矩阵,用以决定小鸟是否行动。(也就是是否按屏幕咯~~~)

测试环境

电脑系统:Win10

Python版本:3.5.4

Python相关第三方库:

TensorFlow_GPU版本:1.4.0

Pygame版本:1.9.3

OpenCV-Python版本:3.3.0

具体配置细节请参考相关网络文档!!!

运行演示

命令行窗口进入DeepLearningFlappyBird文件夹输入py -3.5 deep_q_network.py回车运行即可:

结果如下:

更多参考文献

(1) Mnih Volodymyr, Koray Kavukcuoglu, David Silver, Andrei A. Rusu, Joel Veness, Marc G. Bellemare, Alex Graves, Martin Riedmiller, Andreas K. Fidjeland, Georg Ostrovski, Stig Petersen, Charles Beattie, Amir Sadik, Ioannis Antonoglou, Helen King, Dharshan Kumaran, Daan Wierstra, Shane Legg, and Demis Hassabis. Human-level Control through Deep Reinforcement Learning. Nature, 529-33, 2015.

(2) Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, and Martin Riedmiller. Playing Atari with Deep Reinforcement Learning. NIPS, Deep Learning workshop.

(3)Kevin Chen. Deep Reinforcement Learning for Flappy Bird Report | Youtube result.

链接:

https://youtu.be/9WKBzTUsPKc

(4)https://github.com/sourabhv/FlapPyBird

(5)https://github.com/asrivat1/DeepLearningVideoGames

联系我们