目录
前言
随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习入门算法之一——梯度下降法的基础内容。
1. 什么是线性回归?
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。这是百度百科给出的定义。
具体可以理解成:给定一个点集,用一条线,来拟合这些点,并且使得点集与拟合函数间的误差最小。如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归。线性回归是监督学习中的两类问题——1.回归问题 2.分类问题,中回归问题之一。
其中拟合的含义:用函数来表示给定点集中的数据,使其误差在某种度量意义下最小,并不要求完全经过数据点。形象地说,就是将给定点,用一条光滑的曲线连接起来。
2. 梯度下降法
梯度下降法是机器学习入门算法之一,其主要目的就是求函数的极小值点,为什么要求极小值点请看2.3代价函数。
2.1 类比
梯度下降法的基本思想可以类比成一个下山的过程,例如:当一个人被困在山上,且无法判断下山路径,怎样才能最快下山呢?这时就可以用梯度下降法,首先以自己当前的位置为基准,找到最陡峭的下山方向,沿着这个方向走一个步长,然后继续上一步骤,每次都走最陡峭的下山方向,这样就可以实现最快下山了。具体过程见下图:
这里有一个步长的概念,在深度学习中步长又叫学习率,在上面下山的例子中就是每次走的方向和距离,而深度学习中的学习率(Learning Rate)是一个至关重要的超参数,它决定了模型在训练过程中更新权重参数的速度与方向。步长既不能太快也不能太慢,太快可能会导致错过最低点,太慢则会消耗大量时间。
2.2 梯度下降
类比上面的下山问题,我们可以将某个可导函数看成山,梯度就是函数的导数,下山就是找到函数的最小值,所以我们要找到当前点的梯度,再朝梯度反方向走(这里为什么是逆梯度方向下降最快可以参考https://blog.csdn.net/keeppractice/article/details/106820101,其实梯度方向就是函数上升最快的方向,逆梯度方向即函数下降最快方向),使得函数下降最快,重复这个过程直到达到最小值。
2.3 代价函数
在介绍代价函数前,我们先要了解机器学习中的监督学习过程。这里用一个推算房价的例子给出定义:所谓监督学习就是我们给算法一个训练集,其中每个数据都包含“正确答案”,例如下图-1我们给了每个房子size所对应的实际房价,算法的目的就是给出更多的size对应的房价。
图-1
监督学习过程如下图:
当我们通过假设函数(Hypothesis function)拟合给定点集中的数据时,我们要做的就是使得代价函数尽可能小,也就是求代价函数的最小值,这里的代价函数又被称为误差函数,具体定义如下:
其中,
,此为假设函数,我们要求的就是求假设函数中的未知量
因为假设函数有两个参数,所以代价函数也有有两个参数,是一个碗状的3D曲面图,我们的目的就是找到该图的最低点所对应的
3. 具体实现
3.1.梯度下降法
import numpy as np
def gradient_descent(x, y, theta0, theta1, learning_rate, num_iterations):
m = len(x) # 训练样本数量
cost_history = [] # 保存每次迭代的代价
for i in range(num_iterations):
# 计算预测值
h = theta0 + theta1 * x
# 更新参数
theta0 = theta0 - learning_rate * (1 / m) * np.sum(h - y)
theta1 = theta1 - learning_rate * (1 / m) * np.sum((h - y) * x)
# 计算代价
cost = (1 / (2 * m)) * np.sum((h - y) ** 2)
cost_history.append(cost)
return theta0, theta1, cost_history
# 测试代码
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 4, 5, 6, 7])
theta0 = 0 # 初始化参数theta0
theta1 = 0 # 初始化参数theta1
learning_rate = 0.01 # 学习率
num_iterations = 10000 # 迭代次数
theta0, theta1, cost_history = gradient_descent(x, y, theta0, theta1, learning_rate, num_iterations)
print("最优参数theta0:", theta0)
print("最优参数theta1:", theta1)
这里是一个简单的例子,需要选择适当的学习率和迭代次数,上述代码的学习率比较小,所以需要迭代较多次才能接近准确值。我们也可以选择将学习率调大,以此减少迭代次数。
但学习率较大或者较小都不是很好,较大可能会错过最小值,较小则需要进行多次迭代,消耗时间。因此选择合适的学习率是关键。
4. 总结
本文仅简单介绍了监督学习含义和梯度下降法的基本内容,作为机器学习入门算法之一,梯度下降法在很多方面都有应用。
参考文献
https://www.bilibili.com/video/BV164411b7dx?p=9&vd_source=3fbac50a842c6aaa9387a2c3f02db40c