梯度下降的理解:
场景描述:对于大量数据集,我们要找到一条曲线去拟合现有的数据点并预测未来的数值,要求预测值与实际值的误差最小(曲线上的点叫做预测值)。
为找到这样的一条曲线,我们设置参数并假设拟合曲线为
带入自变量求得预测值:
设置误差为:
得到误差函数为二次函数,为使得误差最小,我们要找到导数为0时所对应的斜率值和截距。
综上所述,我们可以理解梯度为误差函数的导数,梯度下降即改变参数值(斜率k和截距b)使自变量沿着目标函数最小方向下降,此时误差函数的导数为0。
迭代可理解为改变设置参数值的次数。
学习率可以理解为每次设置参数改变程度,例如每次迭代,截距改变为
,
为学习率
函数图像可表示为:
实例:
数据集:
代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 读取数据
data = pd.read_excel('tidu1.xlsx')
X = data['面积'].values
y = data['房价'].values
# 设置截距
theta0 = 0.0 # 截距
theta1 = 0.0 # 斜率
# 设置学习率和最大迭代次数
learning_rate = 0.0001
max_iterations = 1000
# 梯度下降算法
for i in range(max_iterations):
# 计算预测值
y_pre = theta0 + theta1 * X
# 计算误差
error = y_pre - y
# 更新模型参数
theta0 -= learning_rate * np.mean(error)
theta1 -= learning_rate * np.mean(error * X)
# 输出截距项和各特征的系数
print("截距: %.2f" % theta0)
print("斜率: %.2f" % theta1)
# 绘制数据点
plt.scatter(X, y, color='blue', label='数据')
# 绘制拟合线
x_values = np.linspace(min(X), max(X), 100)
y_values = theta0 + theta1 * x_values
plt.plot(x_values, y_values, color='red', label='拟合曲线')#线性回归方程
# 添加图例和标签
plt.legend()
plt.xlabel('面积')
plt.ylabel('房价')
# 显示图形
plt.show()
运行结果: