1.手工推导
1.1单元函数
1.2多元函数
1.3线性回归
2.代码
2.1单元函数
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1 / 2 * x * x - 2 * x + 3
def f_(x):
return x - 2
def tdxj():
x = 8
time = 500
alpha = 0.05
x_fw = np.linspace(-5,10)
fig = plt.figure(1, figsize=(5, 5))
ax = fig.add_subplot(1, 1, 1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.plot(x_fw, f(x_fw))
for i in range(time):
x1 = x
y1 = f(x)
print('第%d次迭代得到:x=%f,y=%f' % (i + 1, x, y1))
print('第%d次迭代得到:x=%f,y=%f' % (i + 1, x, y1))
x = x - alpha * f_(x)
y = f(x)
ax.plot([x1, x], [y1, y], 'ko', lw=1, ls='-', color='black')
if(f_(x)<1e-5):
break
plt.show()
if __name__ == "__main__":
tdxj()
2.2多元函数
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def f(x, y):
return (x - 10)**2+ (y - 10)**2
def f_x(x):
return 2 * x - 20
def f_y(y):
return 2 * y - 20
def tdxj():
x = 20
y = 20
alpha = 0.2
time = 100
fig = Axes3D(plt.figure())
axis_x = np.linspace(0, 20, 100)
axis_y = np.linspace(0, 20, 100)
axis_x, axis_y = np.meshgrid(axis_x, axis_y)
z = f(axis_x, axis_y)
fig.set_xlabel('X', fontsize=14)
fig.set_ylabel('Y', fontsize=14)
fig.set_zlabel('Z', fontsize=14)
fig.view_init(elev=60, azim=300)
fig.plot_surface(axis_x, axis_y, z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
for i in range(time):
x1 = x
y1 = y
f1 = f(x,y)
print("第%d次迭代的结果是:x=%f,y=%f,f1=%f" % (i + 1, x, y, f1))
x = x - alpha * 2 * f_x(x)
y = y - alpha * 2 * f_y(y)
f1 = f(x, y)
fig.plot([x1, x], [y1, y], [f1, f], 'ko', lw=2, ls='-') # 绘制点
plt.show()
if __name__ == "__main__":
tdxj()