文章目录
一、学习任务
- 解释微分、梯度的含义? 什么是梯度下降法?
1)用梯度下降法手工求解
2)在Excel里用牛顿法、或者梯度下降法求解 z=2(x-1)2+y2 的近似根。
2.线性回归可以用最小二乘法求解,也可以用梯度下降法求解。调试、运行并详细注解文中的梯度下降法求解回归方程的python代码,对获得的结果与最小二乘法的结果进行对比。调试、运行并详细注解文中的梯度下降法求解回归方程的python代码,对获得的结果与最小二乘法的结果进行对比。
二、学习内容
1.梯度下降法的一般求解步骤
2.梯度下降法手工求解极值
2.1.计算过程
2.
3.
3. Excel中利用梯度下降求解近似根
1.设置表格内容
2.设置(x,y)的初始值为(2,1)
3.其他表格输入计算公式
4.迭代结果
当学习率取0.1的时候,迭代2000多次仍旧没有出现函数值为0的情况,所以更改学习率为0.15
4.线性回归问题求解
4.1.最小二乘法
1.相关代码
from sklearn import linear_model
import seaborn as sns
m = 20
X0 = ones((m, 1))
X1 = arange(1, m+1).reshape(m, 1)
X = hstack((X0, X1))
Y = np.array([
3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
2.线性回归
model = linear_model.LinearRegression()
model.fit(X1,Y)
print("斜率=",model.coef_[0])
print("截距为=",model.intercept_)
3.结果绘制
def plot(X, Y, theta):
ax = plt.subplot(111)
ax.scatter(X, Y, s=30, c="blue", marker="s")
plt.xlabel("X")
plt.ylabel("Y")
x = arange(0, 21, 0.2)
y = model.intercept_+ model.coef_[0]*x
ax.plot(x, y)
plt.show()
plot(X1, Y, model.coef_[0])
4.2.梯度下降法
1.代价函数
2.相关代码
from numpy import *
m = 20
X0 = ones((m, 1))
X1 = arange(1, m+1).reshape(m, 1)
X = hstack((X0, X1))
Y = np.array([
3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
alpha = 0.01
import matplotlib.pyplot as plt
plt.scatter(X1,Y,color='red')
plt.show()
3.绘制结果
4.代价函数定义及代价函数的梯度函数
def cost_function(theta, X, Y):
diff = dot(X, theta) - Y # dot()
dot()
return (1/(2*m)) * dot(diff.transpose(), diff)
def gradient_function(theta, X, Y):
diff = dot(X, theta) - Y
return (1/m) * dot(X.transpose(), diff)
梯度下降迭代
# 梯度下降迭代
def gradient_descent(X, Y, alpha):
theta = array([1, 1]).reshape(2, 1)
gradient = gradient_function(theta, X, Y)
while not all(abs(gradient) <= 1e-5):
theta = theta - alpha * gradient
gradient = gradient_function(theta, X, Y)
return theta
optimal = gradient_descent(X, Y, alpha)
print('optimal:', optimal)
print('cost function:', cost_function(optimal, X, Y)[0][0])
5.线性结果绘制
相关代码
def plot(X, Y, theta):
ax = plt.subplot(111)
ax.scatter(X, Y, s=30, c="red", marker="s")
plt.xlabel("X")
plt.ylabel("Y")
x = arange(0, 21, 0.2)
y = theta[0] + theta[1]*x
ax.plot(x, y)
plt.show()
plot(X1, Y, optimal)
结果