「Python与算法社区」 第 315 篇原创
假如你想深入机器学习和它背后的数学,你将会很快意识到一切都可归结为一个优化问题。
就连训练神经网络都是一个参数优化的问题。
因此要想理解机器学习算法,你需要首先理解数学优化的基本概念,以及它为什么这么有用。
这篇文章,你将会看到一步一步的演示如何求解一个简单的机器学习问题。
在这个过程中,你将会看到为什么以及它怎样归结为一个机器学习问题,参数如何被优化以及如何计算最优值。
“
机器学习求解步骤
”
Step 1: 问题定义
如下所示一个简单的数据集,一共包括11个已知点,点的坐标为:
(x1, x2):
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/636bd95f5779dc083dec7e57516a9b2e.png)
x1,x2的含义可以任意假定,比如x1 表示计算机的使用年限,x2表示训练神经网络所需要的时间。
如果你的电脑使用年限为下图中的x, 显然你不知道训练神经网络所需要的准确时间x2
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ffc12ee5b9aad5b8be81783235628e30.png)
Step 2: 仅凭猜测
我们随便找一个电脑使用年限与x 最接近的点,如下图所示,来预测x对应的x2值,产生的误差为err.
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9fb076fb78632149e00dbecb64786001.png)
但是,如果我们运气不好,下图所示,已知的11个点中,没有与预测点的使用年限x值相近的,此时误差就会很大。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/722f9ecee4f04eb0d68fea60324e541b.png)
因此,我们需要一个更好的算法来求解。
Step 3: 让猜测更准确:机器学习方法
a. 数据拟合
现在我们进入机器学习领域。
在观察红色数据点后,你会很容易看出一种线性趋势,你的电脑使用越长(x1 越大),训练时间就会越长(x2 越大)。
一个更好的算法将会依据数据,识别出这个趋势,做出更好的预测,误差自然会更小。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ae814a38d89915954250e18e437ff193.png)
函数应该近似拟合我们的数据
b. 拟合线
我们怎样发现这条线?
利用高中知识:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/88b92ff39ce59bed04cf9cba5757183c.png)
我们只需要找到更好的a和b:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/9e0a5107154ba6a5ccad0d6eff82cd06.png)
对于此处的数据,最优值分别为 a=0.8 and b=20. 但是,我们应该怎么发现这些最优值 a and b
c. 发现最优a和b,最小化均方误差
就像我们前面说的,我们想要发现a 和 b,以便使得 y=ax+b这条线尽可能好的拟合我们的数据。
用数学的术语来表述,在我们数据集中的点与这条线的误差(或称距离)应该是最小的,如下图所示,这些黄色的虚线尽可能地短。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b21ef251c080eb4cbadf97ac062f447c.png)
绿色箭头指向的点,其误差(或称距离)距离等于:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/8a42b5b3e9f4e508f5d5383973f58c86.png)
如果此点的坐标为(x1, x2) = (100, 120), 还记得最优参数a=0.8 and b=20,所以此点的误差:
Error = f(x) — yi
Error = f(100) — 120
Error = a*100+b — 120
Error = 0.8*100+20–120
Error = -12
Error = f(100) — 120
Error = a*100+b — 120
Error = 0.8*100+20–120
Error = -12
图中我们也可看出这个点比拟合线高12个单元。
为了评估拟合线整体的表现,需要计算所有点的误差。
怎么做?
首先计算每个点的误差的平方。
有两个原因:
-
通过平方误差,我们会得到一个绝对值,(-12)^2 = 144,
-
平方放大了误差,如果某些点离拟合线比较远,结果误差将会变得非常大
用公式表达为:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7a9a39be3a0b712ea48b2f2ba0084625.png)
更一般的写法:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/a5dba9b33e671db1a3ccb9b3416e86dc.png)
这个公式称为均方误差的和(sum of square error),它在统计学和机器学习中非常常见。
d. 优化函数
优化函数为什么这么有用?
初始问题的定义:
我们想要发现a和b以便 y=ax+b更好的拟合数据集。
也可以表述为,我们想要发现 a 和b以便均方误差最小,即:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/830a90bc5edb05a8eeded32b8e1a517d.jpeg)
假如找到函数 f(a, b)的最小值,我们将会发现a和b的最优值:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/4136616ec8a48e461721b5014fcf99a1.png)
进入实际计算前,先让我们图形绘制下优化函数 f(a, b):
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/278e7a0431521b7310695c91440151d2.jpeg)
左图的高度代表均方误差的大小,山峰越高,误差越大。
最小均方误差位于绿色箭头所指处,此处对应的a和b就是最优值。
沿着轴a,改变a的取值(对应左图的斜率变大),相应的误差也会变大。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7efb05231abcf931843cf605ece56c45.jpeg)
沿着轴b,改变b的取值,也就是叫线上下移动,我们同样也会得到更大的均方误差。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5d54ed8ab2dc315efb7e7f4f95ec1f3c.jpeg)
e. 计算最优值
怎样计算均方误差最小值对应的a和b呢?
我们知道取得全局最小点必须满足两个条件:
-
一阶偏导 f’(a,b) = 0
-
二阶偏导 f’’(a,b) >0
因为目标函数是2个维度的函数,我们可以简单的计算每一个维度上的偏导数,根据必须满足的条件1,得到如下方程:
f(a, b) Δa = 0
f(a, b) Δb = 0
已知 f(a,b) = SUM [axi+b — yi]² ,进一步化简:
f(a,b) = SUM [yi² + b²+a²x + 2abxi — 2byi — 2bxiyi], 综合可得:
SUM [yi² + b²+a²xi + 2abxi — 2byi — 2axiyi] Δa = 0
SUM [yi² + b²+a²xi + 2abxi — 2byi — 2axiyi] Δb = 0
很容易计算出偏导数:
f(a,b) = SUM [2axi + 2bxi — 2xiyi] = 0
f(a,b) = SUM [2b+ 2axi — 2yi ] = 0
记住,在上面两个方程中,有两个SUM,和许多已知点xi 和yi. 就算只有10个点,代入后方程也会变得很长,因此手算也变得不容易,只能借助计算机。
恭喜你!
你已经知道线性回归是如何工作的,以及如何通过已知样本学习到两个参数a,b.
但是,要等一下,还有更多知识需要了解。
“
逼近多项式
”
如果我们的数据没有展现线性走势,而是像如下一个二次函数走势:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1ec1cbb44183d61dfbfdba1215cf9290.png)
在这种情况下,很明显线性函数拟合的将不会太好,多项式将会更好,这就意味着我们需要处理平方函数,三次方函数,甚至更高阶的多项式逼近。
但是,计算这些问题的方法通用的,首先我们再次定义问题,我们想要一个平方函数 y = ax² + bx + c 以此更好的拟合我们的数据:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/b6374652669810789576c9018609ea7b.jpeg)
就像你看到的,我们现在有三个参数要去确定:
a, b 和c. 因为,我们的最小化问题需要稍作改变,不过均方误差和最小的目标函数不会改变:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/40daf075a96ed5be17eb3ed411a6f2b9.jpeg)
需要优化的三个参数 a,b 和c:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/9449d4ccd93490a1e6b7588283cd5bea.jpeg)
“
过拟合
”
我们仍然有一个问题需要去解释,文章一开始提到的具有线性走势的那个问题,难道就不能用二次函数拟合吗?
肯定可以!
我们用更高阶的函数y = ax² + bx + c 去拟合不好吗?
如果单从训练集上的表现来看,高阶函数肯定会让误差更小的。
事实上,目标函数的阶次比总的样本点个数小于1的时候,我们的目标函数将会拟合到每一个点,均方误差将会是0. 非常完美,不是吗?
并不是那样好,用下面两幅图来解释:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/964b257004853a64ed0e4815269efe56.png)
在左图,我们用二次函数近似拟合数据,在右图,我们用10阶函数拟合,因此它能近似拟合几乎所有14个样本点。
但是,右图的线条运动看起来很奇怪,它试图去拟合所有点,但是它丢失了样本数据的整体走势。
得到的高阶函数对值得变化更加敏感,预测结果更加不可靠。
因此,我们应该首先观察数据,决策用几阶多项式拟合效果很最好,然后选择合适的阶数去拟合。
阅读更多:
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/546a97f616725062e72846611932128e.jpeg)
长按二维码,关注我的公众号