一、导数复习
1、正切 tan
定义:tanθ=y/x 如下图
2、导数
3、偏导数
偏导数:当有多元函数是,针对于不同的自变量,描述函数变化率的公式。
二、梯度下降的几个问题
1、梯度下降
梯度下降是一种非常通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代的调整参数从而使损失函数最小化。
假设你迷失在山上的浓雾之中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量θ相关的误差函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为0,到达最小值。
具体来说,首先使用一个随机的θ值(这被称为随机初始化),然后逐步改良,每次踏出一步,每一步都尝试降低一点损失函数(如MSE),直到算法收敛出一个最小值。
2、梯度下降的方向
- 梯度下降的方向1:只要对损失函数求导,θ的变化方向永远趋近于损失函数的最小值。
- 梯度下降的方向2: 如果θ已经在最低点,那么梯度将不会发生变化。
3、梯度下降的步长
- 梯度下降的步长1:梯度下降中一个重要参数是每一步的步长,这取决于超参数的学习率。
- 梯度下降的步长2:梯度下降的步长会逐渐变小。
3、如何应对梯度下降的局部最小值问题
- 对于MSE来说,因为损失函数是个凸函数,所以不存在局部最小值,只有一个全局最小值。
- 通过随机初始化θ,可以避开局部最小值。
- 对于多变量,高维度的值,就算在某个维度上陷入和局部最小值,但是还能从别的维度跳出。
三、多变量线性回归
1、多变量线性回归引入
模型:
之前: hθ(x) = θ0 + θ1x
现在: hθ(x) = θ0 + θ1x1 + θ2x2 + … + θnxn
为了保证模型的统一性,我们给模型加上x0 ,并使 x0 = 1。
多项型回归代码案例:
"""
多项式回归
"""
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)
plt.plot(X, y, 'b.')
# plt.show()
d = {
1: 'g-', 2: 'r+', 10: 'y*'}
for i in d:
# include_bias 可以理解为w0 =False 意思就是不要w0
poly_features = PolynomialFeatures(degree=i, include_bias=False)
"""
fit 和 fit_transform的区别
fit: 简单来说,就是求得训练集X的均值,方差,最大值,最小值这些训练集X固有的属性
fit_transform: 首先fit,然后在此基础上,进行标准化,降维,归一化等操作
"""
X_poly = poly_features.fit_transform(X)
print(X[0])
print(X_poly[0])
# print(X_poly[:, 0])
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
# print(lin_reg.intercept_, lin_reg.coef_)
y_predict = lin_reg.predict(X_poly)
plt.plot(X_poly[:, 0], y_predict, d[i])
plt.show()
2、多元梯度下降方法
模型: hθ(x) = θT x = θ0x0 + θ1x1 + θ2x2 + … + θnxn
参数: θ0 θ1…θn
损失函数:
梯度下降公式:
一元与多元梯度下降对比:
3、特征缩放(归一化)
一般情况下我们我们使用特征缩放,把特征值会缩放到接近 -1 ≤ xi ≤ 1的区域。
左图的梯度下降算法直接走向最小值,可以快速到达。而在右图中,先是沿着与全局最小值方向近乎垂直的方向前进,接下来是一段几乎平坦的长长的山谷。最终还是会抵达最小值,但是这需要花费大量的时间。