佛山做网站的公司有哪些,WordPress头像ssl,企业网站建设联系电话,dw怎么做购物网站定义#xff1a;是一个优化算法#xff0c;也成最速下降算法#xff0c;主要的部的士通过迭代找到目标函数的最小值#xff0c;或者收敛到最小值。 说人话就是求一个函数的极值点#xff0c;极大值或者极小值
算法过程中有几个超参数#xff1a; 学习率n#xff0c;又称…定义是一个优化算法也成最速下降算法主要的部的士通过迭代找到目标函数的最小值或者收敛到最小值。 说人话就是求一个函数的极值点极大值或者极小值
算法过程中有几个超参数 学习率n又称每次走的步长, n会影响获得最优解的速度取值不合适的时候可能达不到最优解 阈值 threshold 当两步之间的差值
求解步骤
给定初始点x阈值和学习率计算函数在该点的导数根据梯度下降公式得到下一个x点xx-学习率*导数计算更新前后两点函数值的差值如果差值小于阈值则找到极值点否则重复2-5步
例如用梯度下降算法计算下列函数的极值点 y ( x − 2.5 ) 2 − 1 y (x-2.5)^2 -1 y(x−2.5)2−1 构造数据
import numpy as np
import matplotlib.pyplot as plt
plot_x np.linspace(-1, 6, 141)
plot_y (plot_x - 2.5) ** 2 - 1
plt.plot(plot_x, plot_y)def J(theta): #原始函数return ((theta - 2.5)**2 - 1)def dJ(theta): #导数return 2*(theta - 2.5)def gradient_descent(xs, x, eta, espilon):theta xxs.append(x)while True:gradient dJ(theta)last_theta thetatheta theta - eta * gradientxs.append(theta)if (abs(J(theta) - J(last_theta)) espilon):breaketa 0.0001 #每次前进的 x
xs []
espilon 1e-8
gradient_descent(xs, 1, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), colorr, marker)
print(xs[-1])2.495000939618705
起点我们也可以从另一端开始 例如5
eta 0.0001 #每次前进的 x
xs []
espilon 1e-8
gradient_descent(xs, 5, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), colorr, marker)
print(xs[-1])计算的极值点 y − ( x − 2.5 ) 2 − 1 y -(x-2.5)^2 -1 y−(x−2.5)2−1
def J(theta): #原始函数return -((theta - 2.5)**2 - 1)def dJ(theta): #导数return -2*(theta - 2.5)def gradient_descent(xs, x, eta, espilon):theta xxs.append(x)while True:gradient dJ(theta)last_theta thetatheta theta eta * gradientxs.append(theta)if (abs(J(theta) - J(last_theta)) espilon):breaketa 0.0001 #每次前进的 x
xs []
espilon 1e-8
gradient_descent(xs, 1, eta, espilon)plt.plot(plot_x, J(plot_x))
plt.plot(np.array(xs), J(np.array(xs)), colorr, marker)
print(xs[-1])使用梯度下降算法计算最简单的线性模型
假设有两组数据
x np.array([55, 71, 68, 87, 101, 87, 75, 78, 93, 73])
y np.array([91, 101, 87, 109, 129, 98, 95, 101, 104, 93])线性模型的损失函数如下 f ∑ n 1 n ( y i − ( w 0 w i x i ) ) 2 f \sum_{n1}^n (y_i - (w_0 w_i x_i))^2 fn1∑n(yi−(w0wixi))2
其中 w0 和 w1 是我们要求的值他们代表了线性方程中的两个系数
分别对w0 和 w1求偏导数 ∂ f ∂ w 0 − 2 ∑ n 1 n ( y i − ( w 0 w i x i ) ) \frac{\partial f}{\partial w_0} -2\sum_{n1}^n(y_i-(w_0w_ix_i)) ∂w0∂f−2n1∑n(yi−(w0wixi)) ∂ f ∂ w 1 − 2 ∑ n 1 n x i ( y i − ( w 0 w i x i ) ) \frac{\partial f}{\partial w_1} -2\sum_{n1}^nx_i(y_i-(w_0w_ix_i)) ∂w1∂f−2n1∑nxi(yi−(w0wixi))
注意区分w1 多了一个xi
参照公式 xx-学习率*导数 得到
w0_gradient -2 * sum((y - y_hat))
w1_gradient -2 * sum(x * (y - y_hat))def ols_gradient_descent(x, y, lr, num_iter):x 自变量y 因变量num_iter -- 迭代次数返回:w1 -- 线性方程系数w0 -- 线性方程的截距w1 0w0 0for i in range(num_iter):y_hat (w1 * x) w0w0_gradient -2 * sum((y - y_hat))w1_gradient -2 * sum(x * (y - y_hat))w1 - lr * w1_gradientw0 - lr * w0_gradientreturn w1, w0x np.array([55, 71, 68, 87, 101, 87, 75, 78, 93, 73])
y np.array([91, 101, 87, 109, 129, 98, 95, 101, 104, 93])lr 0.00001 # 迭代步长
num_iter 500 #迭代次数
w1, w0 ols_gradient_descent(x, y, lr0.00001, num_iter500)print(w1, w0)
xs np.array([50, 100])
ys xs * w1 w0plt.plot(xs, ys, color r)
plt.scatter(x, y)
w1 1.2633124475159723 w0 0.12807483308616532