试试用人话说机器学习(一)
很多年没写技术博客了,本来也不想写的,特别是机器学习这么听起来很高深的问题,再者因为确实会涉及很多专业的数学知识,我怕自己不一定能够解释清楚,因为我发现我之前学的其实都是算术,算不上数学!!数学老师看到这估计会罚站我几个世纪。机器学习的概念可以百度,但是大多数都生涩难懂,一般一看见就好奇看两眼,但是一看到各种模式识别、神经网络什么的估计像我这样的一般人就看不下去了!最近刚好看了一些文章和做了一
很多年没写技术博客了,本来也不想写的,特别是机器学习这么听起来很高深的问题,再者因为确实会涉及很多专业的数学知识,我怕自己不一定能够解释清楚,因为我发现我之前学的其实都是算术,算不上数学!!数学老师看到这估计会罚站我几个世纪。但是呢,怕后面又忘记了,而且有规划要写写就只能试试了。
机器学习的概念可以百度,但是大多数都生涩难懂,一般一看见就好奇看两眼,但是一看到各种模式识别、神经网络什么的估计像我这样的一般人就看不下去了!最近刚好看了一些文章和做了一些小实验,所以想大概说说,也当做个笔记。日常生活中其实很多应用都是机器学习应用,如垃圾邮件自动分类系统、身份证识别、人脸识别等,我在这里会通过举例子说明,希望比较形象;
首先呢,我大概列举一下会用到的数学工具,如数据归一化、hausdorff距离、PCA主成元素分析、随机梯度下降等,我看了下貌似大多数机器学习框架、算法也都这些套路。具体的工具我会有一些说明,但不是很专业,还是希望能用人话说明白的尽量不搬公式。
第一个例子呢,是一个人脸类型分类的例子,一个很简单的例子,大家都知道人的脸型有圆形、椭圆(鹅蛋)、倒三角形、方型(国字脸)这些,当然还有正三角这样反人类的脸型的就不说了。我们这里讨论的前提是已经经过人脸识别,有了人脸五官的特征的数据点集合和轮廓的数据点集合,如下图:
我想到这样的实验因为有天在电梯里有两个女孩在争论自己脸型的问题,我当时就想如果有个系统能根据他们照片自动进行脸型判断那我就可以安静的座电梯了。
首先呢,作为一个写了很多年代码的程序员,想要实现这样的系统,一开始肯定是信心满满的,毕竟这看起来就是个很简单的问题,估计写几个判断就可以搞定了,传统的写程序思路应该是这样的:
1.首先我要为每种脸型寻找规则,就是寻找规律,比如下巴最下面的点和两边轮廓最外面点的夹角,通过夹角度数判断是什么脸型,如10度-20度为三角形;想到这里我应该被自己的智慧感动到了。
2.写代码,就写四个判断语句,so easy
3.测试,我找了几个典型的三角,OK,完美判断出来了
4.然后我把程序分享跟别人
然后悲催的故事就发生了,电梯里一片吐槽声,人家明明是漂亮的鹅蛋脸确定识别成了国字脸。作为一个自尊心很强烈的程序员,我深感自责和(╯﹏╰),顿时觉得世界好不美好,还好我是个坚强的程序员,也喜欢挑战,所以就下决心优化系统。
我认真仔细分析了之前的思路,发现用规则的办法基本上不可能实现,因为人的脸型并非规则的东西,我们所谓的分类也没明确的标准,所以规则也就不清楚,换句话说就是逻辑不明确。因此好像真的没办法了??后来经过查阅很多资料、这里顺便吐槽一下国内论文,有些论文不仅没帮到人,还会误导人,然后发现可以通过统计分析的方法处理这个问题,也就大家知道的数理统计这些。虽然很多科学家都是不相信概率论的,比如图灵、爱因斯坦,但是目前也没法否认它的神奇,如我们最爱用的求平均值、高斯分布等,有兴趣大家可以自己了解。
按照这个思路我开始动手:
1.我收集了不同脸型的数据样本,如各100份,这里涉及到第一个数据处理就是归一化;为什么要归一化呢,因为你想啊,每个人拍照的姿势、焦距、图像的大小都不一样,而我们根据常识也可以判断所有的计算都要在同样的标准下进行才有效;因此呢有两种解决办法,要么你就得让别人按照你的要求拍照,要么你自己处理,显然后者更应该受到别人欢迎吧,毕竟谁也不喜欢规矩。因此归一下就是把样本数据进行处理,得到不受姿势、焦距、图像影响的数据样本,具体归一下算法如下,贴别人图的,其实有很多种,有兴趣自己去看:
2.处理新图像的归类问题,我们已经有样本了,来了一张新的图像改怎么办呢?按照正常思路我们就是想判断这张新的图像和哪个类型的样本比较接近了,当然新图像的数据也得归一化,刚刚说“接近”,那数学上是怎么定义接近呢?其实就是距离,虽然距离看起来很简单,那可能是因为我们受笛卡尔空间影响太深了,导致一想到距离我们就想起
其实距离和空间有关,但是呢数学上有很多很多种不同的空间,我这里用的就是hausdorff空间的huasdorrf距离,具体内容我就不展开了,因为我也没有进行很深入研究,不敢瞎写,有兴趣的自己去了解了。大概算法是新图像和每个类型样本里的每个样本计算huasdorrf距离,然后取最大值,如三角形样本里,,样本A的距离是0.2,其他样本的距离都小于0.2,因此和三角形样本的距离就是0.2;然后判断和那个类型的距离最小就算是那个类型。如圆形的距离是0.8,三角形是0.2,椭圆是0.6,方形是0.5那就是三角形脸。距离公式如下:
得到的示意图如下:
3.现在已经把模型写好了,就可以测试了
整体来说,效果还可以,比如你年轻时候可能是三角形脸,但是后来发福就变成圆脸了,也是可以分类的,但是效果和样本的数量和质量也有关系,具体就不细说了。当然最后说明下这明显就是一个简单的应用为什么非要说是和机器学习有关呢?其实我个人理解,这里应用虽然简单,但是这里分类的概念对机器学习应该是很重要的,总结一下就是根据已有的样本(机器学习里叫知识库),通过特定的模型(这里就是我的归一化和hausdorff距离),对新的输入做出分类(就是得出脸型)。
本来还想写一个关于人脸变形的案例,里面会涉及到机器学习常用的PCA(主成元素分析)、梯度下降、矩阵特征值特征向量等,但是有点晚了,年纪大了要熬不住夜,就等下次再写了;
更多推荐
所有评论(0)