随机梯度下降算法学习笔记
梯度下降的常用领域:
线性回归:
例如:利用线性回归预测不同人口数量的城市下开饭馆的利润趋势。
损失函数
梯度
Z轴越大,损失越大,也就是我们要从山顶下到山脚。
可以将梯度理解为下山的方向(损失函数的偏导),当红点到山脚时,得到算法的最优结果。
梯度下降算法思路:
while 循环:
梯度=gradient(θ0,θ1)
(θ0,θ1)=(θ0,θ1)- 梯度*学习率 // 用减法表示下坡。
学习率可以理解为下山时步伐的大小,在编程时需要不断调试学习率的大小,太大或者太小都不好。
太大容易反复横跳;太小步伐太小,计算次数太多。
最后附上代码:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
path = 'C:\\Users\\Administrator\\Desktop\\data.txt'
data = pd.read_csv(path, header=None)
plt.scatter(data[:][0], data[:][1], marker='+')
data = np.array(data)
m = data.shape[0]
theta = np.array([0, 0])
data = np.hstack([np.ones([m, 1]), data])
y = data[:, 2]
data = data[:, :2]
def cost_function(data, theta, y):
cost = np.sum((data.dot(theta) - y) ** 2)
return cost / (2 * m)
def gradient(data, theta, y):
grad = np.empty(len(theta))
grad[0] = np.sum(data.dot(theta) - y)
for i in range(1, len(theta)):
grad[i] = (data.dot(theta) - y).dot(data[:, i])
return grad
def gradient_descent(data, theta, y, eta):
while True:
last_theta = theta
grad = gradient(data, theta, y)
theta = theta - eta * grad
print(theta)
if abs(cost_function(data, last_theta, y) - cost_function(data, theta, y)) < 1e-15:
break
return theta
res = gradient_descent(data, theta, y, 0.0001)
X = np.arange(3, 25)
Y = res[0] + res[1] * X
plt.plot(X, Y, color='r')
plt.show()
该代码需要导入原始数据,最终会得到如上图所示的线性回归图